【问题标题】:Writing data to JavaFX Tableview将数据写入 JavaFX Tableview
【发布时间】:2016-04-07 15:56:59
【问题描述】:

我以前从未使用过 tableview,而且我对 Java 和 JavaFX 还是很陌生。我试图镜像一个示例,但由于数据来自内部创建的数据库客户端,因此我无法准确复制它。无论如何,我的数据正在进入表格,但它以看起来像 csv 数据的形式输入,并且每一列都没有放入各自的列中。这是澄清我的问题的屏幕截图:

在此处获取列

   for (Column col : drs.getColumns()){
        TableColumn tblCol = new TableColumn(col.getName());
        tblCol.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){
            public ObservableValue<String> call(CellDataFeatures<ObservableList, String> p) {
                return new SimpleStringProperty(p.getValue().toString());
            }
        });
         table.getColumns().addAll(tblCol);
    }

在此处获取行:

while (drs.hasNextRow()) {
    ObservableList<String> row = FXCollections.observableArrayList();
    for (int i = 0; i < drs.getColumns().length; i++) {
        row.add(drs.getNextRow().getItem(i) + "");
    }
    data.add(row);
}

这是我无法将数据发送到表的地方。

table.setItems(data);
System.out.println("dis is data: " +data);

数据打印如下:

dis is data: [[data, data, data....], [data, data, data....], [data, data, data....]]

它获取每个 [row] 并将其放入每条记录的每一列中。我假设我需要数据看起来像:

[[data], [data], [data]....[data]], [[data], [data], [data]....[data]], [[data], [data], [data]....[data]]
    } catch(Exception e){
        e.printStackTrace();
        System.out.println("everything is broken");
    }
}

所以,我迷路了。我不知道自己在做什么,如果您能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: java javafx tableview


    【解决方案1】:

    TableView 中,一行中的所有数据都与一个项目相关联。 TableColumn.cellValueFactory 用于选择应在列中显示的项目的“部分”。因此,您应该使用它来选择值:

    TableView<ObservableList<String>> table = ...
    int index = 0;
    for (Column col : drs.getColumns()) {
        final int columnIndex = index++;
        TableColumn<ObservableList<String>, String> tblCol = new TableColumn(col.getName());
        tblCol.setCellValueFactory(new Callback<CellDataFeatures<ObservableList<String>, String>, ObservableValue<String>>(){
            public ObservableValue<String> call(CellDataFeatures<ObservableList, String> p) {
                return Bindings.stringValueAt(p.getValue(), columnIndex);
            }
        });
        table.getColumns().add(tblCol);
    }
    

    这里Bindings.stringValueAt 用于从ObservableList 中选择元素。

    还需要每行使用一行:

    while (drs.hasNextRow()) {
        ObservableList<String> row = FXCollections.observableArrayList();
        Row sourceRow = drs.getNextRow();
        for (int i = 0; i < drs.getColumns().length; i++) {
            row.add(Objects.toString(sourceRow.getItem(i)));
        }
        data.add(row);
    }
    

    【讨论】:

    • 非常感谢!我让它工作了,但是现在当我输入另一个查询时,它会将新查询附加到表中旧查询的右侧。
    • @anshanno:我不知道你输入的数据结构是什么,但是如果有疑问可以在设置新数据之前清除TableView的项目和列...
    猜你喜欢
    • 2018-05-10
    • 2016-09-06
    • 1970-01-01
    • 2016-02-16
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2021-07-26
    相关资源
    最近更新 更多