【问题标题】:JavaFX Derby TableViewJavaFX 德比表视图
【发布时间】:2015-05-11 05:45:37
【问题描述】:

我找到了几种将数据写入 tableView 的解决方案。

我的问题是:是否有任何解决方案可以从本地 Derby 将数据写入 JavaFX 中的 TableView,我们不知道有多少列和记录以及属性的名称是什么?

我需要某种动态解决方案,对表格的列和记录进行编号,然后生成表格的内容。

【问题讨论】:

  • 您可以使用ResultSetMetaData 在运行时获取所有这些信息,并动态构建列。有关构建数据,请参阅 this question

标签: dynamic javafx tableview


【解决方案1】:

你可以这样做:

public TableData readData(Connection conn, String dbTableName) throws SQLException {
    try (
        Statement stmnt = conn.createStatement() ;
        ResultSet resultSet = stmnt.executeQuery("select * from "+dbTableName) ) {

        ResultSetMetaData meta = resultSet.getMetaData() ;
        List<String> colNames = new ArrayList<>();
        for (int i = 1; i <= meta.getColumnCount(); i++) {
            String columnName = meta.getColumnName(i);
            colNames.add(columnName);                
        }

        List<Map<String, String>> data = new ArrayList<>();

        while (resultSet.next()) {
            Map<String, String> row = new HashMap<>();
            for (String col : colNames) {
                row.put(col, resultSet.getString(col));
            }
            data.add(row);
        }

        return new TableData(colNames, data);
    }
}

public static class TableData {
    private final List<String> columnNames ;
    private final List<Map<String, String>> data ;

    public TableData(List<String> columnNames, List<Map<String, String>> data) {
        this.columnNames = columnNames ;
        this.data = data ;
    }

    public List<String> getColumnNames() {
        return columnNames;
    }

    public List<Map<String, String>> getData() {
        return data;
    }


}

你可以使用如下:

TableView<Map<String, String>> table = new TableView<>();
Connection conn = ... ;
String dbTableName = ... ;

Task<TableData> loadDataTask = new Task<TableData>() {
    @Override
    public TableData call() throws Exception {
        return readData(conn, dbTableName);
    }
};
loadDataTask.setOnSucceeded(event -> {
    table.getColumns().clear();

    TableData tableData = loadDataTask.getValue();
    for (String columnName : tableData.getColumnNames()) {
        TableColumn<Map<String, String>, String> col = new TableColumn<>(columnName);
        col.setCellValueFactory(cellData -> 
            new ReadOnlyStringWrapper(cellData.getValue().get(columnName)));
        table.getColumns().add(col);
    }
    table.getItems().setAll(tableData.getData());
});

loadDataTask.setOnFailed(event -> loadDataTask.getException().printStackTrace());

Thread loadThread = new Thread(loadDataTask);
loadThread.setDaemon(true);
loadThread.start();

【讨论】:

  • 一如既往,您的解决方案很棒!谢谢!顺便说一句,您知道如何修改此表以使其可编辑吗?我的意思是如果我想编辑表中记录的一些值?再次感谢您提供上述解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2015-12-09
  • 2013-06-24
  • 1970-01-01
  • 2012-11-21
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多