JavaFX绑定不是属性成员来控制

时间:2014-11-16 16:42:45

标签: java binding properties 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控件?

1 个答案:

答案 0 :(得分:4)

你有几个选择。

首先,可以在JPA / Hibernate实体中使用FX Properties,尽管你必须要小心一点。简而言之,您需要确保使用属性访问权限,以便ORM调用get / set方法,而不是尝试直接设置字段。 Steven van Impe discusses this on his blog,我也blogged on the same topic。我在这里尝试的一件事是映射集合并使用ObservableList:这可能很棘手,因为JPA实现使用List的子接口。

您的另一个选择是制作属性"绑定属性"在Java Bean意义上,然后使用Java Bean Property Adapter

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