gpt4 book ai didi

JavaFX:创建具有泛型类型的动态 TableView

转载 作者:行者123 更新时间:2023-12-04 12:47:45 24 4
gpt4 key购买 nike

因此,首先,我的代码基于 this thread. 中已接受的答案

我正在尝试从数据库创建一个 TableView ,这个 TableView 应该根据用户请求的数据动态填充。到目前为止,这是有效的,但我的问题是从数据库收集的所有值都被解释为 java 中的字符串,但我需要它们的实际值。

这是因为 javafx tableview 的内置排序机制将所有数字排序为字符串,因为它们的类型在填充表时被转换为字符串。

例子:值(value)观921, 200, 110, 1, 2011, 1299将被排序为(使用整数数据类型)1、110、200、921、1299、2011而它将使用字符串数据类型排序为 1、110、1299、200、2011、921。

总的来说,我对泛型和 Java 还很陌生,希望这里有人可以帮助我。

基本上:每当我从数据库中读取一个值时,我都需要将该值及其实际数据类型插入到 TableView 中,而不是将其转换为字符串。

最佳答案

如果您使用 ResultSet.getObject(index),这应该可以工作填充表。根据 JDBC 规范中定义的标准映射(例如,int 列将映射到 java.lang.Integer 等),JDBC 驱动程序将返回适当的对象类型。

我不是特别喜欢你链接的代码:它会产生很多关于类型安全的警告,你应该注意这些。我会使用这样的东西(警告:未测试):

数据包装类:

public class DataResult {

private final List<String> columnNames ;
private final List<List<Object>> data ;

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

public int getNumColumns() {
return columnNames.size();
}

public String getColumnName(int index) {
return columnNames.get(index);
}

public int getNumRows() {
return data.size();
}

public Object getData(int column, int row) {
return data.get(row).get(column);
}

public List<List<Object>> getData() {
return data ;
}
}

数据库访问类:

public class DAO {

private Connection conn ;


public DAO() {
// initialize connection...
}

public DataResult getAllData() throws SQLException {

List<List<Object>> data = new ArrayList<>();
List<String> columnNames = new ArrayList<>();

try (
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from some_table")) {


int columnCount = rs.getMetaData().getColumnCount();

for (int i = 1 ; i <= columnCount ; i++) {
columnNames.add(rs.getMetaData().getColumnName(i));
}

while (rs.next()) {
List<Object> row = new ArrayList<>();
for (int i = 1 ; i <= columnCount ; i++) {
row.add(rs.getObject(i));
}
data.add(row);
}
}

return new DataResult(columnNames, data);
}
}

界面代码:

TableView<List<Object>> table = new TableView<>();
DAO dao = new DAO();
DataResult data = dao.getAllData();

for (int i = 0 ; i < data.getNumColumns() ; i++) {
TableColumn<List<Object>, Object> column = new TableColumn<>(data.getColumnName(i));
int columnIndex = i ;
column.setCellValueFactory(cellData ->
new SimpleObjectProperty<>(cellData.getValue().get(columnIndex)));
table.getColumns().add(column);
}

table.getItems().setAll(data.getData());

使用这个版本,提供给表的数据包含适合列类型的对象——不一定是字符串。因此,例如,如果数据库列定义为 (SQL) 类型 int,则 TableView 列将包含 java.lang.Integer 实例,并且排序将根据 Integer.compareTo(...)(即以正确的数字顺序)。

关于JavaFX:创建具有泛型类型的动态 TableView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42970625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com