JavaFX绑定不是要控制的属性成员

想象一下,我有一个像POJO:

public class Person() { private int id; private String name; public int getId() { return this.id; } public String getName() { return this.name; } } 

如果我需要使用bind()方法将name成员绑定到JavaFX标签,我无法应用,因为我需要和可观察的值。

我知道我可以使用StringProperty而不是String,但我需要原始类型,因为我使用Hibernate并且我不知道Hibernate是否可以支持JavaFX的属性来映射来自DB的数据。

我必须将哪些替代方法从我的pojo绑定到JavaFX控件?

你有几个选择。

首先,可以在JPA / Hibernate实体中使用FX Properties,尽管你必须要小心一点。 简而言之,您需要确保使用属性访问权限,以便ORM调用get / set方法,而不是尝试直接设置字段。 Steven van Impe 在他的博客上讨论了这个问题 ,我也在博客上发表了同样的话题 。 我在这里没有尝试的一件事是映射集合和使用ObservableList :这可能很棘手,因为JPA实现使用List的子接口。

您的另一个选择是在Java Bean意义上使属性“绑定属性”,然后使用Java Bean属性适配器 :

 import java.beans.PropertyChangeSupport ; public class Person() { private int id; private String name; private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener listener) { this.pcs.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { this.pcs.removePropertyChangeListener(listener); } public int getId() { return this.id; } public void setId(int id) { int oldId = this.id ; this.id = id ; pcs.firePropertyChange("id", oldId, id); } public String getName() { return this.name; } public void setName(String name) { String oldName = this.name ; this.name = name ; pcs.firePropertyChange("name", oldName, name); } } 

那你可以做

 Label nameLabel = new Label(); Person person = new Person(); nameLabel.textProperty().bind(JavaBeanStringPropertyBuilder.create() .bean(person) .name("name") // name of property to bind to .build());