gpt4 book ai didi

JavaFX:与表示模型的绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 13:19:18 27 4
gpt4 key购买 nike

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

enter image description here

现在,我想确保当我从表格 View 中选择另一个人时,详细信息 View 会立即适应。

到目前为止我的类(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 类中,我设置了如下监听器:

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

在带有详细信息 View 的 UI 类中,我设置了一个绑定(bind):

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

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

但是这个绑定(bind)没有按预期工作。我可以更改什么以使绑定(bind)正常工作并且属性发生变化?

最佳答案

绑定(bind)不起作用,因为 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));

关于JavaFX:与表示模型的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43634964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com