1

我有以下问题:我尝试用数组填充 JavaFX8 中的 tableview。所以,我尝试将数组作为一行添加到 tableview 中。当按下回车键时,我在我的 FXML 文件的控制器中运行此代码。这是代码:

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 是我的表格视图,而 String[] 只是我的实际 String[] 的占位符。我尝试以多种方式创建我的表格视图:

public TableView<ObservableList<String>> transactionOverview;
public TableView<ObservableList> transactionOverview;
public TableView transactionOverview;

它们都不起作用。问题是 tableview 获得了一个额外的行,我可以选择它,但是现在 tableview 中可以看到字符串值。不知道有没有加进去。

我的代码基于Javafx 2.2 - 动态表格视图 - 表格数据(来自 Jitendra Pareek 的回答),我选择了这个解决方案,因为我不想使用额外的类来填充我的表格视图。

任何帮助表示赞赏!

4

1 回答 1

1

由于(根据您的评论)您有固定数量的列,我强烈建议创建一个模型类来保存表格每一行中的项目。然后,您可以遵循标准模式,它应该很容易工作。

无论您如何管理TableView,都必须为每列提供一个单元格值工厂。这本质上是一个函数,它指定如何从行中的项目中获取单元格的值。如果您使用使用 JavaFX 属性的模型类,那么您可以使用 a 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));
        });
    }

    // ...
}
于 2014-10-07T18:00:45.973 回答