You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaFX TableView中使用Java 16的Records特性?

Records是Java 16推出的新特性,它为属性自动生成的访问器方法和属性同名(如last()、first()),和JavaFX默认PropertyValueFactory寻找getXxx格式getter的规则不兼容,除了手动添加冗余的get前缀方法,可采用以下更合理的解决方案:

  • 方案1:使用Lambda表达式显式绑定(最推荐)
    放弃基于反射的PropertyValueFactory,直接用Lambda调用Record的原生访问器,类型安全、性能更高,编译期即可校验正确性,示例修改如下:
TableColumn<Person, String> lastColumn = new TableColumn<>("Last");
lastColumn.setCellValueFactory(cellData -> 
    new SimpleStringProperty(cellData.getValue().last())
);

TableColumn<Person, String> firstColumn = new TableColumn<>("First");
firstColumn.setCellValueFactory(cellData -> 
    new SimpleStringProperty(cellData.getValue().first())
);

TableColumn<Person, Integer> ageColumn = new TableColumn<>("Age");
ageColumn.setCellValueFactory(cellData -> 
    new SimpleIntegerProperty(cellData.getValue().age()).asObject()
);
  • 方案2:自定义适配Record规则的CellValueFactory
    如果希望保留原有的工厂类使用风格,可以自定义一个支持Record访问器命名的工具类:
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TableColumn;
import javafx.util.Callback;
import java.lang.reflect.Method;
import javafx.beans.property.SimpleObjectProperty;

public class RecordPropertyValueFactory<S,T> implements Callback<TableColumn.CellDataFeatures<S,T>, ObservableValue<T>> {
    private final String propertyName;

    public RecordPropertyValueFactory(String propertyName) {
        this.propertyName = propertyName;
    }

    @Override
    public ObservableValue<T> call(TableColumn.CellDataFeatures<S, T> param) {
        try {
            Method accessor = param.getValue().getClass().getMethod(propertyName);
            T value = (T) accessor.invoke(param.getValue());
            return new SimpleObjectProperty<>(value);
        } catch (Exception e) {
            throw new RuntimeException("无法读取Record属性:" + propertyName, e);
        }
    }
}

使用时替换原有PropertyValueFactory即可,其余代码无需改动:

lastColumn.setCellValueFactory(new RecordPropertyValueFactory<Person, String>("last"));
  • 方案3:升级JavaFX版本
    JavaFX 19及以上版本的PropertyValueFactory已经原生支持Record的访问器命名规则,直接升级依赖版本即可,原有代码无需任何修改。

内容的提问来源于stack exchange,提问作者ncmathsadist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:54:08