![](/img/trans.png)
[英]Proper way to bind a Property to a Value derived from a control in JavaFx / TornadoFX
[英]JavaFX bind not property member to control
想象一下,我有一個像這樣的POJO:
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控件哪些替代方法?
您在這里有幾個選擇。
首先,可以在JPA / Hibernate實體中使用FX屬性,盡管您必須謹慎一些。 簡而言之,您需要確保使用屬性訪問權限,以便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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.