我有以下问题:我尝试使用数组填充JavaFX8中的tableview。所以,我尝试将数组作为一行添加到tableview中。当按下enter时,我在我的FXML文件的Controller中运行此代码。这是代码:
String[] words = {"ace", "boom", "crew", "dog", "eon"};
List<String> tableViewRow = Arrays.asList(words);
ObservableList<String> row = FXCollections.observableList(tableViewRow); //observableArrayList also doesn't work
transactionOverview.getItems().add(row);
transactionOverview是我的tableview,而String []只是我实际的String []的占位符。我尝试以多种方式创建我的tableview:
public TableView<ObservableList<String>> transactionOverview;
public TableView<ObservableList> transactionOverview;
public TableView transactionOverview;
它们都不起作用。 问题是tableview获得了一个额外的行,我可以选择,但现在在tableview中可以看到字符串值。我不知道他们是否被添加。
我的代码基于Javafx 2.2 - Dynamic table view - table data(来自Jitendra Pareek的答案),我选择了这个解决方案,因为我不想使用额外的类来填充我的tableview。
感谢任何帮助!
答案 0 :(得分:1)
由于(根据您的评论)您有固定数量的列,我强烈建议您创建一个模型类来保存表格每行中的项目。然后,您可以遵循标准模式,它应该很容易。
但是,如果您管理TableView
,则必须为每列提供单元格值工厂。这本质上是一个函数,它指定如何从行中的项获取单元格的值。如果您使用的是使用JavaFX属性的模型类,那么您可以使用PropertyValueFactory
(尽管Java 8 lambda表达式使其非常冗余)。否则,您需要实现回调。
如果你真的想使用列表结构来保存每一行的数据,并假设你的表和表列都在FXML文件中定义,你可以在你的控制器类中做这样的事情:
@FXML
private TableView<ObservableList<String>> transactionOverview ;
// ...
public void initialize() {
for (int i=0; i < transactionOverview.getColumns().size(); i++) {
TableColumn<ObservableList<String>, String> col = transactionOverview.getColumns().get(i);
final int colIndex = i ;
col.setCellValueFactory( (CellDataFeatures cellData) -> {
ObservableList<String> rowData = cellData.getValue();
return new ReadOnlyStringWrapper(rowData.get(colIndex));
});
}
// ...
}