gpt4 book ai didi

java - 如何在 JavaFX 中广播事件

转载 作者:搜寻专家 更新时间:2023-11-01 03:49:45 26 4
gpt4 key购买 nike

给定一个 JavaFX 应用程序,该应用程序具有按层次结构组织的多个演示者和 View 。如何将事件从父演示者向下广播到子演示者/ View ?

我的架构如下所示:我有一个位于层次结构顶部的 MainPresenter

public class MainPresenter {

@FXML private TreeView<String> navigation;
@FXML private AnchorPane contentView;
@Autowired private MainView mainView;
@Autowired private DetailView detailView;

@FXML
public void initialize() {

// register a handler for selection of treeview items
navigation.getSelectionModel().selectedItemProperty().addListener(
new ChangeListener<TreeItem<String>>() {
// ...
contentView.getChildren().clear();
contentView.getChildren().add(detailView);
contentView.fireEvent(new ResourceEvent(ResourceEvent.SELECTED, model));
// ...
}
);
}
}

还有一个用于所选项目的详细 View 的演示器:

public class DetailPresenter {

@Autowired private DetailView view;

@PostConstruct
public void postInit() {
// is being executed
view.getView().addEventHandler(ResourceEvent.SELECTED, (event) -> {
// not being invoked
});
}
}

我想要实现的是,无论何时在 TreeView 中选择一个项目,都应该将此项目的 DetailView 添加到场景图中(有效),并且应该通知 DetailPresenter 从后端服务加载资源。一种解决方案是简单地 Autowiring MainPresenter 中的 DetailPresenter,这不是我想要的。我想要松耦合。正如我从文档 on Event Handling 中假设的那样事件被分发到场景图中的所有节点,然后向上冒泡回到场景的根。由于我的 DetailPresenter 中的 EventHandler 没有被调用,我认为事件没有被传递下去。

我的问题是,如何实现这一目标?

最佳答案

MyModel.java:

public class MyModel {
private StringProperty myString = new SimpleStringProperty();
public void setMyString(String myString) { this.myString.set(myString); }
public String getMyString() { return myString.get(); }
public StringProperty getMyStringProperty() { return myString; }
}

然后创建一个 MyModel 的实例作为单例 bean(看起来您正在使用 Spring)。并在需要的地方注入(inject)您的模型:

@Bean
public MyModel myModel() {
return new MyModel();
}

然后注入(inject)并绑定(bind)到属性:

public class MyPresenter {
@FXML TextField myTextField;
@Autowired MyModel myModel;

public void initialize() {
myTextField.textProperty().bind(myModel.getMyStringProperty());
}
}

如果现在有人更新 myString 属性,UI myTextField 也会更新。

您还可以在这些属性上注册一些自定义处理程序或使用 twoWayBinding。

因此您不必将其用作 UI 元素,还可以将其用作某种数据管道。

关于java - 如何在 JavaFX 中广播事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31697831/

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