JavaFX 德比表视图

JavaFX Derby TableView

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

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

我需要某种动态解决方案,为 table 的列和记录编号,然后生成 Table 的内容。

你可以这样做:

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();