2014-11-07 29 views
0

考虑到我有以下三类:双结合:型号<->豆<->的JavaFX

型号:

class Field { 
    private String label; 
} 

豆:

class FieldBean { 
    public FieldBean(Field f) { this.field = f}; 
    private Field field; 
    private SimpleStringProperty label = new SimpleStringProperty(); 
    public String getLabel() { return label.get(); } 
} 

JavaFX应用程序:

class MyApp extends Application { 
    public void start(Stage stage) { 
     Label lblTest = new Label(); 
     FieldBean fieldBean = new FieldBean(model.getField()); 
     Bindings.bindBidirectional(fieldBean.getLabel(), label.textProperty()); 
    } 
} 

我试图实现的是每当更改字段标签时更新标签。从我所知道的这个模型绑定到目前为止,我需要添加一个PropertyChangeListener,但我没有得到线索,它应该附加在哪里。我的猜测是在FieldBean。 (并且我的模型已经拥有属性更改支持,只是为了更好的可读性而将其剥离)。

回答

1

您可以使用JavaBeanStringProperty,它基本上是JavaFX StringProperty和绑定的JavaBeans属性之间的适配器。例如:

class FieldBean { 

    private final StringProperty label ; 
    private final Field field; 

    public FieldBean(Field f) { 
     this.field = f; 
     label = JavaBeanStringPropertyBuilder.create() 
      .bean(this.field) 
      .name(label) 
      .build(); 
    public String getLabel() { return label.get(); } 
    public StringProperty labelProperty() { return label ; } 
    public void setLabel(String label) { this.label.set(label); } 
} 

然后(假设你的属性更改侦听器设置为Field.label),Field.labelFieldBean.label将自动绑定。

正如托马斯指出的,你不需要这两个类,因为它们实际上代表完全相同的东西。可以省略Field类为托马斯表示,或者,如果你的Field类已经存在作为一个已经写入的数据表示的一部分,你可以只使用JavaBeanStringProperty作为一个适配器直接绑定到当前绑定的JavaBean属性:

Field field = new Field(); 

// ... 

Label uiLabel = new Label(); 
uiLabel.textProperty().bind(JavaBeanStringPropertyBuilder.create() 
    .bean(field) 
    .name(label) 
    .build()); 

调用field.setLabel(...)现在自动更改uiLabel的文本。在这个例子中,FieldBean类完全被省略。

0

如果FieldBean.field.labelFieldBean.label.get()意图表示相同的值,则不需要两者都有。

class FieldBean { 
    private StringProperty label; 

    public FieldBean(String label) { 
     this.label = new SimpleStringProperty(label); 
    } 

    public StringProperty labelProperty() { return label; } 
    public String getLabel() { return label.get(); } 
} 

然后,保持更新Label,你只是做

label.textProperty().bind(fieldBean.labelProperty()); 

注意,类Field被完全省略。

相关问题