2014-11-16 12 views
2

想象我像一個POJO:JavaFX的綁定屬性不成員控制

public class Person() 
{ 
    private int id; 
    private String name; 

    public int getId() 
    { 
    return this.id; 
    } 

    public String getName() 
    { 
    return this.name; 
    } 
} 

如果我需要使用bind()方法來名成員綁定到JavaFX的標籤,我可以不適用,因爲我需要和可觀測值。

我知道我可以使用StringProperty來代替String,但我需要基本類型,因爲我使用Hibernate,而且我不知道Hibernate是否可以支持JavaFX中的屬性來映射來自數據庫的數據。

我必須從我的pojo綁定到JavaFX控件的哪些替代方法?

回答

4

這裏有幾個選項。

首先,可以在JPA/Hibernate實體中使用FX屬性,但必須小心。簡而言之,您需要確保使用屬性訪問權限,以便ORM調用get/set方法,而不是直接設置字段。 Steven van Impe discusses this on his blog,我也是blogged on the same topic。我還沒有嘗試過的一件事是映射集合並使用ObservableList s:這可能會非常棘手,因爲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()); 
+0

看來工作對於我來說,如果我不將PropertyChangeSupport添加到Person bean中 - 使用PropertyChangeSupport的值增加是多少? – jewelsea

+0

'PropertyChangeSupport'只提供了註冊'PropertyChangeListener's和觸發'PropertyChangeEvent's的機制。 AIUI,適配器向bean註冊以監聽這些事件,如果可能的話,以便它可以在POJO中的屬性發生更改時更新綁定值。 –

+0

[這裏是](https://gist.github.com/james-d/a213d9b768e036e08b6f)一個區別的例子。如果沒有'PropertyChangeSupport'(或者至少一個等價的機制),通知就不會被髮送。 –