考虑到我有以下三个类:
型号:
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());
}
}
我想要实现的是每当我更改Field标签时都更新Label。据我所知这个模型绑定到目前为止,我需要添加一个PropertyChangeListener,但我还没有得到线索,应该附上它。我的猜测将在FieldBean中。 (我的模型已经具有属性更改支持,只是为了更好的可读性而剥离它)。
答案 0 :(得分: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.label
和FieldBean.label
将自动绑定。
正如Tomas指出的那样,你不需要这两个类,因为它们实际上代表了完全相同的东西。您可以将Field
类省略为Tomas节目,或者,如果您的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
类完全省略。
答案 1 :(得分:0)
如果FieldBean.field.label
和FieldBean.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
完全被省略。