有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX扩展属性值工厂

我有一个对象的TableView,其中包含映射到其他类型的其他对象的ID。我需要一个TableColumn,它不显示id,而是显示映射到id的对象。我想我可以通过创建自己的PropertyValueFactory来实现这一点,如下所示:

public class SomePropertyValueFactory extends PropertyValueFactory<SomeObject, String> {

    public SomePropertyValueFactory(String property) {
        super(property);
    }

    @Override
    public ObservableValue<String> call(CellDataFeatures<SomeObject, String> parameter) {
        SomeOtherObject obj = function(parameter.getValue().getId());
        return obj.toString();
    }

}

这是一个可行的解决方案吗?它能正常工作吗?我已尝试此操作,但引发了LoadException:

Caused by: java.lang.InstantiationException: ui.view.SomePropertyValueFactory
    at java.lang.Class.newInstance(Unknown Source)
    at sun.reflect.misc.ReflectUtil.newInstance(Unknown Source)
    ... 21 more
Caused by: java.lang.NoSuchMethodException: ui.view.SomePropertyValueFactory.<init>()
    at java.lang.Class.getConstructor0(Unknown Source)
    ... 23 more

共 (1) 个答案

  1. # 1 楼答案

    如果您希望FXML使用一个类,那么它必须具有一个无参数构造函数,或者(在JavaFX8中)必须具有一个参数被注释为@NamedArg的构造函数。所以你可以

    public class SomePropertyFactory ... {
    
        public SomePropertyFactory(@NamedArg("property") String property) {
            // ...
        }
    
        // ...
    }
    

    此外,您发布的代码不会编译,因为call方法的返回值是String,其中它应该是ObservableValue<String>

    然而,我真的不认为把它作为PropertyValueFactory的子类有什么意义。为什么不直接实现Callback?此类的唯一用途是在setCellValueFactory(...)中,参数类型是Callback。而且你似乎根本没有从你的超类继承任何东西