java - 以编程方式(与语义方式)将 LongProperty 应用于 TableColumn

标签 java javafx properties tableview

(在 this 问题之后,这就是提示它的原因)

我有一个模型类 LongProperty :

public class Model { 
    private final SimpleLongProperty number = new SimpleLongProperty(this, "number"); 
    public long getNumber() { return number.get(); }
    public void setNumber(long number) { this.number.set(number); }
    public LongProperty numberProperty() { return number; }
}

现在,在我的 Controller 中我有一个 TableColumn<Model, Long> colNumber我想绑定(bind)到这个属性。我知道我可以使用 PropertyValueFactory ,但我不喜欢当我可以以编程方式传递属性时按名称给出属性,并让编译器/ide 对我进行拼写检查。基本上我想做这样的事情(我实际上想让它更简洁,最后的例子):

colNumber.setCellValueFactory( cdf -> cdf.getValue().numberProperty() );

但这给了我一个编译错误:

java: incompatible types: bad return type in lambda expression javafx.beans.property.ObjectProperty cannot be converted to javafx.beans.value.ObservableValue

正如我所说,我知道我可以使用 PropertyValueFactory ,并且还有属性名称的静态最终字符串,但我发现它不太优雅。有没有办法让这种程序化方法发挥作用?一些施法魔法?

附录:
我想要的实际方法是使用辅助方法:

private <S,T> Callback<CellDataFeatures<S,T>, ObservableValue<T>> propertyFactory(Callback<S, ObservableValue<T>> callback) {
    return cdf-> callback.call(cdf.getValue());
}

然后我就可以使用

colNumber.setCellValueFactory(propertyFactory(Model::numberProperty));

这使我的代码非常简洁和可读,并且编译器会检查我是否有拼写错误等。

最佳答案

你可以做到

colNumber.setCellValueFactory( cdf -> cdf.getValue().numberProperty().asObject() );

我认为(我需要测试,但这似乎是正确的)您还可以利用模型中的自动装箱和拆箱功能,并将该属性实现为 ObjectProperty<Long> :

public class Model { 
    private final ObjectProperty<Long> number = new SimpleObjectProperty<>(this, "number", 0L); 
    public long getNumber() { return number.get(); }
    public void setNumber(long number) { this.number.set(number); }
    public ObjectProperty<Long> numberProperty() { return number; }
}

这种方法的一个缺点是它不允许任何算术绑定(bind),例如你做不到 someValue.bind(model.numberProperty().multiply(2));等等(另一个是你可能会无意中调用model.numberProperty().set(null);,并造成各种破坏。)

当然,另一种解决方案是将表格列设为 TableColumn<Model, Number> ,但可能还有其他原因不这样做。

FWIW,我绝对主张避免 PropertyValueFactory 。这是 JavaFX 2.0 中引入的一个便利类(即在 lambda 之前),当时实现允许编译器检查的回调非常冗长。现在它基本上是多余的(并且应该被弃用,恕我直言,或者至少应该实现您概述的那种实用方法)。

关于java - 以编程方式(与语义方式)将 LongProperty 应用于 TableColumn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621485/

相关文章:

Java 方法重载——在某些情况下将方法合并为一个方法?

java - 如何与消耗整个队列的消费者保持阻塞队列的同步

鼠标悬停时JavaFx旋转按钮

java - 从另一个类调用 `setOnAction`

sql - 如何从 Informix 的 syscolumns 中检索 "Is Null Allowed"属性?

java - 数据库驱动消息 bean 缺少默认 Spring 消息

java - 带有可选非重复点的字符串的正则表达式

java - 通过 JNI 在 C++ 中进行图形操作

java - 如何删除或停用监听器

sharepoint - 我可以使用文件作为自定义 SharePoint WebPart 属性吗?