加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何在JavaFX中广播事件

发布时间:2020-12-15 02:08:19 所属栏目:Java 来源:网络整理
导读:给定 JavaFX应用程序,其中多个演示者和视图以层次结构组织.如何将父节目主持人的事件广播到儿童演示者/视图? 我的架构如下所示:我有一个位于层次结构之上的MainPresenter public class MainPresenter { @FXML private TreeViewString navigation; @FXML pr
给定 JavaFX应用程序,其中多个演示者和视图以层次结构组织.如何将父节目主持人的事件广播到儿童演示者/视图?

我的架构如下所示:我有一个位于层次结构之上的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));
                // ...
            }
        );
    }
}

还有一个演示者可以查看所选项目的详细信息:

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从后端服务加载资源.
对此的一个解决方案是简单地在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实例作为singleton bean(看起来你正在使用Spring).并将模型注入需要的位置:

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

然后注入它并绑定到属性:

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

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

如果现在有人更新了myString属性,那么UI myTextField也会更新.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读