简要问题: 使用记录(record)从数据库获取数据并填充 JavaFX 表格视图的最佳方法是什么?(相比于使用具有 getter 和 setter 的常规对象类)
完整问题:
最近我创建了 InventoryRecord.java
文件,用于替换之前用来填充表格视图的传统对象类 Inventory
:
import java.util.List;
public record InventoryRecord(
String make,
String model,
String officialModel,
String upc,
List<String> category,
String type,
String description,
String vendor,
Double cost,
Double price
) {}
我想使用这个记录作为框架,从数据库(这里是 Neo4j,但数据库类型不重要)中获取数据来填充表格视图。
在拥有 InventoryRecord
之前,我使用的 Inventory
类大致如下(为了便于阅读,已缩短代码,假设每个属性都有对应的 getter 和 setter):
public class Inventory {
private String make;
private String model;
// 其他属性...
private List<String> category;
private Double cost;
private Double price;
public Inventory(String make, String model, /*其他参数...*/, List<String> category, Double cost, Double price) {
// 调用 setter 方法初始化属性
}
// getter 和 setter 方法
}
以下是使用查询结果填充表格的方式:
while (result.hasNext()) {
Record record = result.next();
// 获取各个字段值
String make = record.get("make").asString();
// 其他字段...
List<String> category = record.get("categories").asList(Value::asString);
Double cost = record.get("cost").isNull() ? null : record.get("cost").asDouble();
Double price = record.get("price").isNull() ? null : record.get("price").asDouble();
// 创建匿名 Inventory 对象并添加到表格项中
inventoryTable.getItems().add(new Inventory(make, model, /*其他参数...*/, category, cost, price));
}
// 设置列的 CellValueFactory
makeColumn.setCellValueFactory(new PropertyValueFactory<>("make"));
// 其他列的设置...
categoryColumn.setCellValueFactory(new PropertyValueFactory<>("category"));
costColumn.setCellValueFactory(new PropertyValueFactory<>("cost"));
priceColumn.setCellValueFactory(new PropertyValueFactory<>("price"));
inventoryTable.setItems(inventoryTable.getItems());
现在我想将所有内容改为使用 InventoryRecord
,而不是仅使用 Inventory
对象,但 setCellValueFactory
和 PropertyValueFactory
对于记录的表现并不友好。尝试以下代码片段:
makeColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().make()));
// 字符串属性的设置没有错误...
categoryColumn.setCellValueFactory(cellData -> new SimpleListProperty<List<String>>(cellData.getValue().category()));
costColumn.setCellValueFactory(cellData -> new SimpleDoubleProperty(cellData.getValue().cost()));
但出现以下错误:
- Type mismatch: cannot convert from SimpleListProperty<List<String>> to ObservableValue<List<String>>
- Type mismatch: cannot convert from SimpleDoubleProperty to ObservableValue<Double>
尝试将查询结果直接转换为 InventoryRecord
并添加到表格项中:
while (result.hasNext()) {
// 获取记录值
// ...
// 创建 InventoryRecord 实例
InventoryRecord inventoryRecord = new InventoryRecord(make, model, /*其他参数...*/, category, type, desc, vendor, cost, price);
// 添加 InventoryRecord 到表格项中
inventoryTable.getItems().add(inventoryRecord);
}
// 设置列的 CellValueFactory
makeColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().make()));
// 其他列的设置...
categoryColumn.setCellValueFactory(cellData -> new SimpleListProperty<>(cellData.getValue().category()));
upcColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().upc()));
// ...
costColumn.setCellValueFactory(cellData -> new SimpleDoubleProperty(cellData.getValue().cost()).asObject());
priceColumn.setCellValueFactory(cellData -> new SimpleDoubleProperty(cellData.getValue().price()).asObject());
inventoryTable.setItems(inventoryTable.getItems());
但依然出现类似错误:
- Type mismatch: cannot convert from SimpleListProperty<List<String>> to ObservableValue<List<String>>
- Type mismatch: cannot convert from SimpleDoubleProperty to ObservableValue<Double>
期待的结果类似于之前使用 Inventory
类时的效果。