JavaFX:与表示模型的绑定

时间:2017-04-26 12:59:51

标签: java javafx presentation-model

我的JavaFX应用程序应如下所示:

enter image description here

现在我想确保一旦从表格视图中选择另一个人,细节视图就会适应。

到目前为止我的课程:

public class Person {
    private final StringProperty name = new SimpleStringProperty();
    private final StringProperty title = new SimpleStringProperty();
    private final IntegerProperty age = new SimpleIntegerProperty();

    public Person(String name, String title, int age) {
        setName(name);
        setTitle(title);
        setAge(age);
    }
    // Getters and Setters
}

public class PresentationModel {

    private final ObservableList<Person> persons = FXCollections.observableArrayList();
    private final ObjectProperty<Person> selectedPerson = new SimpleObjectProperty<>();

    public PresentationModel() {
        // add some users to persons list
    }

  // Getters/Setters

}

在带有表的UI类中,我设置了一个这样的监听器:

personsTable.getSelectionModel().selectedItemProperty().addListener((observable, oldPerson, newPerson) -> {
    model.setSelectedPerson(newPerson);
});

在带有详细信息视图的UI类中,我设置了一个绑定:

nameLabel.textProperty().bind(model.getSelectedPerson().nameProperty());

PresentationModel model属性在应用程序启动时创建一次,然后通过构造函数传递给所有UI类。

但是这个绑定没有按预期工作。 我可以更改什么,以便绑定正常工作并且属性更改?

1 个答案:

答案 0 :(得分:1)

绑定不起作用,因为getSelectedPerson只返回当前所选人员,并且如果所选人员发生更改,则不会重新计算。

只使用标准API,即可

nameLabel.textProperty().bind(Bindings.selectString(
    model.selectedPersonProperty(), "name"));

这种API在许多方面都有点令人不满意。首先,没有编译时检查selectedPersonProperty()nameProperty(),并且它的类型正确。其次,它使用反射,在你经常调用它的情况下它不能很好地执行(这里不适用)。最后,如果所选人员为空,这将向标准输出转储许多多余的警告(尽管API文档表明这是一个支持的用例!!!)。

ReactFX framework提供了另一种选择:

nameLabel.textProperty().bind(Val.selectVar(
    model.selectedPersonProperty(), Person::nameProperty));