我尝试将String []作为columnNames添加,并将String [] []作为数据添加至JavaFx表。我确实创建了列(它们是可见的),但是数据值是不行的...
我没有收到任何例外,所以我有些困惑。我一直在寻找将项目添加到JavaFX的任何其他方式,但是它们是有限的,并且也不起作用。
我的代码是:
private void createScene(String[] columnNames, String[][] inputData) {
TableView table = new TableView();
table.setEditable(false);
for (int i = 0; i < columnNames.length; i++) {
table.getColumns().add(new TableColumn(columnNames[i]));
}
List<List<String>> data = new ArrayList<List<String>>();
for (int i = 0; i < inputData.length; i++) {
List<String> row = new ArrayList<String>();
for (int j = 0; j < inputData[0].length; j++) {
row.add(inputData[i][j]);
}
data.add(row);
}
ObservableList<ObservableList> inpData = FXCollections.observableArrayList();
for (List<String> dataList : data) {
ObservableList<String> row = FXCollections.observableArrayList();
for (String rowData : dataList) {
row.add(rowData);
}
inpData.add(row);
}
table.setItems(inpData);
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().add(table);
Scene scene = new Scene(vbox, 500, 500);
jfxPanel.setScene(scene);
}
任何想法如何解决?
最佳答案
您需要向每个表列添加一个单元格值工厂,以便它知道要显示哪些数据。
我强烈建议您通过向它们提供类型参数来正确键入表视图和表列。
private void createScene(String[] columnNames, String[][] inputData) {
TableView<List<String>> table = new TableView<>();
table.setEditable(false);
for (int i = 0; i < columnNames.length; i++) {
TableColumn<List<String>, String> column = new TableColumn<>(columnNames[i]);
final int colIndex = i ;
column.setCellValueFactory(cellData ->
new SimpleStringProperty(cellData.getValue().get(colIndex)));
table.getColumns().add(column);
}
List<List<String>> data = new ArrayList<List<String>>();
for (int i = 0; i < inputData.length; i++) {
List<String> row = new ArrayList<String>();
for (int j = 0; j < inputData[0].length; j++) {
row.add(inputData[i][j]);
}
data.add(row);
}
ObservableList<List<String>> inpData = FXCollections.observableArrayList(data);
table.setItems(inpData);
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().add(table);
Scene scene = new Scene(vbox, 500, 500);
jfxPanel.setScene(scene);
}