JavaFX8:TableView中不显示字符串

时间:2014-10-07 10:10:28

标签: tableview javafx-8 fxml observablelist

我有以下问题:我尝试使用数组填充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。

感谢任何帮助!

1 个答案:

答案 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));
        });
    }

    // ...
}