java - 如何只注册一次EventBus

标签 java javafx event-bus

我正在编写 JavaFX 应用程序,以便从一个 Controller 发送到另一个 Controller 。我使用开发人员编写的 EventBus。我从 github 下载它。但是当我尝试从一个 Controller 调用到另一个 Controller 时。第一次它工作一次。第二次它工作两次。第三次它工作三次,依此类推。执行此事件总线的原因可能是什么?

主 Controller

这里事件总线像静态一样注册

public class Main extends Application
{
    public static EventBus eventBus = new FxEventBus();

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();

    }


    public static void main(String[] args) {
        launch(args);
    }
}

触发事件的 Controller 类

Controller

private    AddClickedEvent addClickedEvent;
    @Override
    public void initialize(URL location, ResourceBundle resources)
    {

        id.setOnAction(event ->
        {
            try
            {
                FXMLLoader loader = new FXMLLoader();
                Parent parent = loader.load(getClass().getResource("ask.fxml").openStream());
                Stage stage = new Stage();
                stage.setScene(new Scene(parent));
                if(addClickedEvent == null){
                    addClickedEvent = new AddClickedEvent(AddClickedEvent.ANY);
                }
                Main.eventBus.fireEvent(addClickedEvent);
                stage.showAndWait();
            } catch (IOException e) {
                e.printStackTrace();
            }

        });

    }

这是 Controller 和 other Controller,应该在开火后显示一些东西

  @Override
    public void initialize(URL location, ResourceBundle resources)
    {

        Main.eventBus.addEventHandler(AddClickedEvent.ANY,event -> {
            System.out.println("uyondan bosilib galdi");
            System.out.println(yes);
            yes = true;
        });
        id1.setOnAction(event -> {
            System.out.println(yes);
        });
        id2.setOnAction(event -> {

            Stage stage = (Stage)((Node) (event).getSource()).getScene().getWindow();
            stage.close();
        });

    }

AddClicked 事件类

public class AddClickedEvent extends Event
{
    public static final EventType<AddClickedEvent> ANY =
            new EventType<>(Event.ANY, "ADD_CLIENT_EVENT");

    public AddClickedEvent(@NamedArg("eventType") EventType<? extends Event> eventType) {
        super(eventType);
    }

}

最佳答案

EventHandler 应该在整个应用程序的过程中只创建一次,然后它只会 react 一次而不是多次。我提出了解决方案,它为每个带有静态 int 变量的 Controller 类声明,这有助于我在 int 的值为零时仅注册一次事件。

      private static int check;
      @Override
        public void initialize(URL location, ResourceBundle resources)
        {
          if(check == 0)
{

            Main.eventBus.addEventHandler(AddClickedEvent.ANY,event -> {
                System.out.println("uyondan bosilib galdi");
                System.out.println(yes);
                yes = true;
            });
check ++;
// Then it will react only once We registered event here
}
            id1.setOnAction(event -> {
                System.out.println(yes);
            });
            id2.setOnAction(event -> {

                Stage stage = (Stage)((Node) (event).getSource()).getScene().getWindow();
                stage.close();
            });

        }

关于java - 如何只注册一次EventBus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54255084/

相关文章:

javascript - VueJS 组件发出重复事件

java - 获取字符串中的字母。为什么我的代码不能很好地工作?

java - Windows 上 JavaFX 中 SwingNode 的模糊渲染

javafx - 如何确定JavaFX应用程序所需的FXML文件,CSS文件,图像和其他资源的正确路径?

java - Guava eventbus 有订阅者吗?

Guava EventBus 多个订阅者相同的 tpe

java - 框布局中的列标题

java - 如何为 Android gradle build..正确配置 Adob​​eCreative SDK

java - 防止用户删除一个表中与另一表中具有相关记录的记录

css - 在 JavaFX 中,当使用 id 选择器在其他地方选择了类的某些节点时,CSS 类选择器不起作用?