java - 如何只注册一次 EventBus
问题描述
我正在编写 JavaFX 应用程序以便从一个控制器发送到另一个控制器。我使用由开发人员编写的 EventBus。我从 github 下载它。但是当我尝试从一个控制器调用到另一个控制器时。第一次它工作一次。第二次它工作两次。第三次它工作了三次,依此类推。表现此事件总线的原因可能是什么?
主控制器
这里事件总线像静态一样注册
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);
}
}
解决方案
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();
});
}
推荐阅读
- python - NoneType' 对象对于 Vectorizer sklearn 是不可迭代的
- c# - 在这个 c# 文件中,我是否只是在其自己的类中声明了一个实例?
- python - \n 在函数的返回语句中打印 \n 而不是 python 中的新行
- json - 无法将 json 解组为 protobuf 结构字段
- json - JSON数据显示为promise
- php - 检查并替换字符串 PHP 中的双重表达式
- html - 如何在内联代码中转义 wordpress.com 兼容降价中的尖括号
- swift - 如何控制 iPhone 系统音量?
- postgresql - 目标表未正确更新
- javascript - 如何找到最长子串的长度?