双重绑定:模型< - > Bean< - > JavaFX的

时间:2014-11-07 01:38:07

标签: data-binding 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());
    }
}

我想要实现的是每当我更改Field标签时都更新Label。据我所知这个模型绑定到目前为止,我需要添加一个PropertyChangeListener,但我还没有得到线索,应该附上它。我的猜测将在FieldBean中。 (我的模型已经具有属性更改支持,只是为了更好的可读性而剥离它)。

2 个答案:

答案 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.labelFieldBean.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.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完全被省略。