Estoy escribiendo aplicaciones JavaFX con el fin de enviar de un controlador a otro controlador. Yo uso EventBus que fue escrito por el desarrollador. Lo descargo de github.But Cuando trato de memoria de un controlador a otro controlador. La primera vez que funciona una vez. La segunda vez que trabaja dos veces. La tercera vez funciona tres veces y así sucesivamente. ¿Cuál podría ser la razón de comportarse este EventBus?
MainController
aquí bus de eventos fue registrada como estática
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);
}
}
Esta clase controlador que fue despedido evento
Controlador
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();
}
});
}
Aquí es otra Controlador Controlador que se debería mostrar algo después del fuego
@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 clase de eventos
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);
}
}
Manejador de sucesos se debe crear una sola vez en todo proceso de aplicación a continuación, es el que reacciona sólo una vez en lugar de varias veces. Vengo con soluciones a declarar que para cada clase del controlador con la variable static int que me ayuda a registrar eventos sólo una vez cuando el valor de int es cero.
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();
});
}