Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何只注册一次EventBus_Java_Javafx_Event Bus - Fatal编程技术网

Java 如何只注册一次EventBus

Java 如何只注册一次EventBus,java,javafx,event-bus,Java,Javafx,Event Bus,我正在编写JavaFX应用程序,以便从一个控制器发送到另一个控制器。我使用开发人员编写的EventBus。我从github下载它,但当我试图从一个控制器调用另一个控制器时。第一次它工作一次。第二次它工作两次。第三次,它工作了三次,以此类推。发生此事件总线的原因可能是什么 主控制器 private AddClickedEvent addClickedEvent; @Override public void initialize(URL location, ResourceBu

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

主控制器

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();
            }

        });

    }
在这里,事件总线被注册为static

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);
    }
}
此控制器类在事件中被激发

控制器

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();
            }

        });

    }
这是一个控制器,另一个控制器应该在火灾后显示一些东西

  @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();
        });

    }
添加点击事件类

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);
    }

}
public类AddClickedEvent扩展事件
{
公共静态最终事件类型ANY=
新事件类型(Event.ANY,“添加客户端事件”);

public AddClickedEvent(@NamedArg(“事件类型”)EventTypeEventHandler应该在整个应用程序的过程中只创建一次,然后它将只响应一次而不是多次。我为每个控制器类使用静态int变量声明它提供了解决方案,这有助于我在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();
            });

        }

是否可以尝试将System.out.println()添加到每个控制器构造函数和操作中;并使用每个println()打印控制器对象唯一id(this.toString()或其他内容)