在动态 TableView 中编辑单元格值?
Edit the cell value at a dynamic TableView?
是否可以在动态 TableView(动态行和动态列)中编辑单元格值?
我在 Internet 上找到的只是单元格上的一些 editable TextFields。
但是,我想编辑 table 中的值,然后用新数据更新我的列表。
我正在使用 IntelliJ IDEA 13.1.4、JavaFX Scene Builder 2.0 和最新的 JavaFX 版本。
这是我创建动态行和列的代码:
public List<String[]> jdata = new LinkedList<>(); //Here is the data
private TableView<String[]> sourceTable;
private ObservableList<String[]> srcData;
.
.
.
int clms;
public void showTable(Convert cnv) {
clms = cnv.getColums(); //number of the columns
for (int i = 0; i < clms; i++) {
TableColumn<String[], String> firstNameCol = new TableColumn<>("\tC"+(i+1)+" \t");
firstNameCol.setMinWidth(20);
int index = i ;
firstNameCol.setCellValueFactory(cellData -> {
String[] rowData = cellData.getValue();
if (index >= rowData.length) {
return new ReadOnlyStringWrapper("");
} else {
String cellValue = rowData[index];
return new ReadOnlyStringWrapper(cellValue);
}
});
sourceTable.getColumns().add(firstNameCol);
}
srcData = FXCollections.observableList(jdata);
sourceTable.getItems().addAll(srcData);
}
此代码将使 firstNameCol
列 editable。当您单击此列下的任何单元格时,您将获得一个 TextField,您可以在其中输入值。当您按下回车键时,该值将保存在 table.
中
更新:
假设您已经为 Table 创建了一个模型 class,并假设其名称为 TestCasesModel,这就是上面代码的样子。
firstNameCol.setCellFactory(TextFieldTableCell.<TestCasesModel>forTableColumn());
firstNameCol.setOnEditCommit(
new EventHandler<CellEditEvent<TestCasesModel, String>>() {
@Override
public void handle(CellEditEvent<TestCasesModel, String> t) {
((TestCasesModel) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setObjectName(t.getNewValue());
}
}
);
使用 POJO classes 而不是字符串数组始终是一个好习惯。
CellEditEvent 必须像这样导入:
import javafx.scene.control.TableColumn.CellEditEvent;
就这样
firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
firstNameCol.setOnEditCommit(event -> {
String[] row = event.getRowValue();
row[index] = event.getNewValue();
});
是否可以在动态 TableView(动态行和动态列)中编辑单元格值?
我在 Internet 上找到的只是单元格上的一些 editable TextFields。
但是,我想编辑 table 中的值,然后用新数据更新我的列表。
我正在使用 IntelliJ IDEA 13.1.4、JavaFX Scene Builder 2.0 和最新的 JavaFX 版本。
这是我创建动态行和列的代码:
public List<String[]> jdata = new LinkedList<>(); //Here is the data
private TableView<String[]> sourceTable;
private ObservableList<String[]> srcData;
.
.
.
int clms;
public void showTable(Convert cnv) {
clms = cnv.getColums(); //number of the columns
for (int i = 0; i < clms; i++) {
TableColumn<String[], String> firstNameCol = new TableColumn<>("\tC"+(i+1)+" \t");
firstNameCol.setMinWidth(20);
int index = i ;
firstNameCol.setCellValueFactory(cellData -> {
String[] rowData = cellData.getValue();
if (index >= rowData.length) {
return new ReadOnlyStringWrapper("");
} else {
String cellValue = rowData[index];
return new ReadOnlyStringWrapper(cellValue);
}
});
sourceTable.getColumns().add(firstNameCol);
}
srcData = FXCollections.observableList(jdata);
sourceTable.getItems().addAll(srcData);
}
此代码将使 firstNameCol
列 editable。当您单击此列下的任何单元格时,您将获得一个 TextField,您可以在其中输入值。当您按下回车键时,该值将保存在 table.
更新: 假设您已经为 Table 创建了一个模型 class,并假设其名称为 TestCasesModel,这就是上面代码的样子。
firstNameCol.setCellFactory(TextFieldTableCell.<TestCasesModel>forTableColumn());
firstNameCol.setOnEditCommit(
new EventHandler<CellEditEvent<TestCasesModel, String>>() {
@Override
public void handle(CellEditEvent<TestCasesModel, String> t) {
((TestCasesModel) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setObjectName(t.getNewValue());
}
}
);
使用 POJO classes 而不是字符串数组始终是一个好习惯。 CellEditEvent 必须像这样导入:
import javafx.scene.control.TableColumn.CellEditEvent;
就这样
firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
firstNameCol.setOnEditCommit(event -> {
String[] row = event.getRowValue();
row[index] = event.getNewValue();
});