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());