JavaFX扩展了PropertyValueFactory

时间:2015-04-14 17:12:06

标签: java javafx tableview

我有一个对象的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 个答案:

答案 0 :(得分:1)

如果您打算将一个类用于FXML,它必须具有无参数构造函数,或者(在JavaFX 8中)它必须具有一个构造函数,其参数带有注释@NamedArg。所以你可以做到

public class SomePropertyFactory ... {

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

    // ...
}

此外,您发布的代码将无法编译,因为call方法的返回值为String,其中应为ObservableValue<String>

但是,我并没有真正意识到要将它作为PropertyValueFactory的子类。为什么不直接实施Callback?此类的唯一用途是setCellValueFactory(...),参数类型为Callback。你似乎没有从你的超类继承任何东西。