JavaFX:与表示模型的绑定
JavaFX: Bindings with presentation model
我的 JavaFX 应用程序应如下所示:
现在我想确保一旦我 select 另一个人从 table 视图中调整详细视图。
我的 class 目前为止:
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 class 和 table 中,我设置了一个这样的监听器:
personsTable.getSelectionModel().selectedItemProperty().addListener((observable, oldPerson, newPerson) -> {
model.setSelectedPerson(newPerson);
});
并且在 UI class 的详细信息视图中我设置了一个绑定:
nameLabel.textProperty().bind(model.getSelectedPerson().nameProperty());
PresentationModel model
属性在应用程序启动时创建一次,然后通过构造函数传递给所有 UI classes.
但是这个绑定没有按预期工作。
我可以更改什么以使绑定正常工作并更改 属性?
绑定不起作用,因为 getSelectedPerson
只是 returns 当前 选定的人,如果选定的人发生变化,则不会重新计算。
仅使用标准 API,您可以做到
nameLabel.textProperty().bind(Bindings.selectString(
model.selectedPersonProperty(), "name"));
这个API在很多方面有点不尽如人意。其一,没有编译时检查 selectedPersonProperty()
是否有 nameProperty()
,以及它的类型是否正确。其次,它使用反射,在你非常频繁地调用它的情况下表现不佳(这里不适用)。最后,如果所选人员为空,这将向标准输出转储大量多余的警告(尽管 API 文档表明这是受支持的用例!!!)。
ReactFX framework 提供了替代方案:
nameLabel.textProperty().bind(Val.selectVar(
model.selectedPersonProperty(), Person::nameProperty));
我的 JavaFX 应用程序应如下所示:
现在我想确保一旦我 select 另一个人从 table 视图中调整详细视图。
我的 class 目前为止:
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 class 和 table 中,我设置了一个这样的监听器:
personsTable.getSelectionModel().selectedItemProperty().addListener((observable, oldPerson, newPerson) -> {
model.setSelectedPerson(newPerson);
});
并且在 UI class 的详细信息视图中我设置了一个绑定:
nameLabel.textProperty().bind(model.getSelectedPerson().nameProperty());
PresentationModel model
属性在应用程序启动时创建一次,然后通过构造函数传递给所有 UI classes.
但是这个绑定没有按预期工作。 我可以更改什么以使绑定正常工作并更改 属性?
绑定不起作用,因为 getSelectedPerson
只是 returns 当前 选定的人,如果选定的人发生变化,则不会重新计算。
仅使用标准 API,您可以做到
nameLabel.textProperty().bind(Bindings.selectString(
model.selectedPersonProperty(), "name"));
这个API在很多方面有点不尽如人意。其一,没有编译时检查 selectedPersonProperty()
是否有 nameProperty()
,以及它的类型是否正确。其次,它使用反射,在你非常频繁地调用它的情况下表现不佳(这里不适用)。最后,如果所选人员为空,这将向标准输出转储大量多余的警告(尽管 API 文档表明这是受支持的用例!!!)。
ReactFX framework 提供了替代方案:
nameLabel.textProperty().bind(Val.selectVar(
model.selectedPersonProperty(), Person::nameProperty));