gpt4 book ai didi

java - 如何只注册一次EventBus

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

我正在编写 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/

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