Как зарегистрировать EventBus только один раз - PullRequest
0 голосов
/ 18 января 2019

Я пишу приложение JavaFX для отправки с одного контроллера на другой контроллер.Я использую EventBus, который был написан разработчиком.Я скачиваю его с github. Но когда я пытаюсь вызвать его с одного контроллера на другой.Первый раз это работает один раз.Второй раз это работает дважды.В третий раз работает три раза и так далее.Что может быть причиной поведения этой шины событий?

MainController

здесь Шина событий была зарегистрирована как статическая

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

    }

Класс события 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);
    }

}

1 Ответ

0 голосов
/ 30 января 2019

EventHandler должен быть создан только один раз в процессе всего приложения, тогда он будет реагировать только один раз, а не несколько раз. Я придумываю решения, которые он объявляет для каждого класса контроллера со статической переменной 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();
            });

        }
...