2016-07-15 9 views
1

Ist in Java FX ein Event-Handler vorhanden, wenn ich ein Fenster direkt durch Drücken der [X] -Taste oben rechts schließe? Welche Ereignisse werden in diesem Fall ausgelöst? Nichts funktioniert so weit, weder setOnHiding noch setOnCloseRequest() Was ich will ist, wenn ich schließe (durch Klicken auf [X] -Taste) ShowLogin Bildschirm, ShowSplashScreen sollte auch geschlossen werden.Welches Ereignis wird aufgerufen, wenn ich einen Bildschirm schließe, indem ich auf [X] roten Knopf von Windows klicke?

Bitte helfen.

Hier meinen Code anhängen.

@Override 
    public void start(Stage primaryStage) { 

     .... 
     ...... 
     ....... 
     this.primaryStage = primaryStage; 
     if (userCredentials == null) { 
      showSplashScreen(); 
      showLoginScreen(); 
     } else { 
      showAppointmentScreen(); 
     } 
    } 


private void showSplashScreen(){ 
     primaryStageSplash = new Stage(); 

     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/SplashScreen.fxml"), bundle); 
     primaryStageSplash.setResizable(false); 
     primaryStageSplash.initStyle(StageStyle.UNDECORATED); 
     primaryStageSplash.centerOnScreen(); // center on screen 
     fxmlLoader.setControllerFactory(paramClass -> context.getBean(paramClass)); 

     try { 
      BorderPane root = new BorderPane(fxmlLoader.load()); 
      scene = new Scene(root, 445, 299); 
      //scene.getStylesheets().add(DeliveryManager.class.getResource("/css/main.css").toExternalForm()); 
      primaryStageSplash.setScene(scene); 
      primaryStageSplash.show(); 

     } catch (IOException ex) { 
      errorHandler.escalateCriticalFailure(ex); 
     } 
    } 


private void showLoginScreen() { 
     primaryStage = new Stage(); 

     FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/LoginForm.fxml"), bundle); 
     primaryStage.setMaxHeight(125.0); 
     primaryStage.setMaxWidth(255.0); 
     primaryStage.setResizable(false); 
     primaryStage.initStyle(StageStyle.UNDECORATED); 
     primaryStage.initModality(Modality.APPLICATION_MODAL); 
     primaryStage.centerOnScreen(); // center on screen 
     //Set the title from the resources. 
     primaryStage.setTitle((String) bundle.getObject("UserInterface.LoginForm.Label.Title")); 

     fxmlLoader.setControllerFactory(paramClass -> context.getBean(paramClass)); 

     if(operatingMode.equals(OperatingMode.REPRINT)) { 
      primaryStage.getIcons().add(new Image("/images/reprint_utility_icon.png")); 
     } 
     else { 
      primaryStage.getIcons().add(new Image("/images/delivery_manager_icon.png")); 
     } 

     try { 
      BorderPane root = new BorderPane(fxmlLoader.load()); 
      scene = new Scene(root, 270, 180); 
      root.setOnMousePressed(new MousePressHandler()); 
      root.setOnMouseDragged(new MouseDragHandler()); 
      scene.getStylesheets().add(DeliveryManager.class.getResource("/css/main.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 

     } catch (IOException ex) { 
      errorHandler.escalateCriticalFailure(ex); 
     } 
    } 



@Override 
    public void stop(){ 
     Event event = new Event(null, primaryStage,null); 
     ((Node)(event.getSource())).getScene().getWindow().hide(); 

     event = new Event(null, primaryStageSplash,null); 
     ((Node)(event.getSource())).getScene().getWindow().hide(); 
     //primaryStageSplash.close(); 
    } 

`

+0

[WindowEvent] (https://docs.oracle.com/javase/8/javafx/api/javafx/stage/WindowEvent.html) wird ausgelöst, wenn Sie auf das X auf den Fenstersymbolen klicken. Sie können das Fenster von Ihrer Szene mit 'scene.getWindow()' erhalten, werfen Sie einen Blick auf die [Szene] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Scene.html) # getWindow--) class – NwDev

+0

Der 'onHidden'-Handler wird immer aufgerufen, wenn das Fenster geschlossen wird (es ist jedoch geschlossen). Der 'onCloseRequest' -Handler wird immer dann aufgerufen, wenn ein * externer * Aufruf zum Schließen des Fensters erfolgt, z. B. wenn der Benutzer auf die Schaltfläche zum Schließen der OS-Ebene klickt. (Ihre Anmeldephase hat keine davon, da Sie den Stil auf "UNDECORATED" gesetzt haben.) Wenn diese für Sie nicht funktionieren, müssen Sie Ihren Versuch, sie zu verwenden, einbinden (dh ein [MCVE] bereitstellen) Dein geposteter Code, sonst kann niemand wissen, was du falsch machst. –

+0

Ihre 'Stop'-Methode macht absolut keinen Sinn, übrigens. Sie erstellen zwei Ereignisse mit 'null' als Ereignisquelle und versuchen dann, 'getSource() 'für sie aufzurufen. Es ist nicht einmal klar, was der Punkt dieser Methode ist: 'stop()' wird aufgerufen, wenn die Anwendung beendet wird, so dass die Fenster trotzdem geschlossen werden. –

Antwort

1

Eigentlich, wenn Sie nur Ihre Popup Stage wollen schließen, wenn der primäre Stage geschlossen ist, müssen Sie nicht auf jeden Fall hören, können Sie die erste Stufe als owner von einstellen können Ihre Begrüßungsbildschirm.

Eine Bühne kann optional ein Besitzerfenster haben. Wenn ein Fenster ein Bühnenbesitzer ist, wird gesagt, dass es das Elternteil dieser Bühne ist. Wenn ein übergeordnetes Fenster geschlossen wird, werden alle seine untergeordneten Fenster geschlossen. Das verkettete Verhalten wurde für ein übergeordnetes Fenster angewendet, das mit einem Symbol versehen ist. Eine Bühne befindet sich immer über dem übergeordneten Fenster. Der Besitzer muss initialisiert sein, bevor die Bühne sichtbar gemacht wird.

Der einzige Nachteil ist, dass das Kind Fenster immer im Vordergrund seines übergeordneten Fenster sein wird. Wenn es ein Problem für Sie ist, können Sie immer noch die Änderungen der onCloseRequestProperty Ihrer primären Bühne hören.

Wird aufgerufen, wenn eine externe Anforderung zum Schließen dieses Fensters vorliegt.

primaryStage.setOnCloseRequest((e) -> { 
    primaryStageSplash.close(); 
}); 

Ich weiß, dass Sie festgestellt, dass es nicht funktioniert, aber es sollte funktionieren, wie es der „offizielle“ Weg ist, externe Nähe Anforderung zu erkennen.

+0

Danke DVarga, aber ich habe die gleiche Lösung versucht, aber es hat nicht funktioniert. Ich debugge meine Anwendung und gefunden - Wenn ich primaryStage Bildschirm direkt schließe, wird Bildschirm geschlossen, aber Kontrolle erreicht nicht bei Code "primaryStage.setOnCloseRequest ((e) -> { primaryStageSplash.schließen(); });..“ Danach i primaryStageSplash Bildschirm zu schließen, nicht die Kontrolle wird an diesem Code erreicht Wo im falsch zu machen, im nicht jede Idee immer – user5122617

+1

Bitte aktualisieren Sie die Frage, was Sie haben versucht, (den vollständigen Code bitte) – DVarga

+0

Nun funktioniert es ... weiß nicht wie, aber es funktioniert. Danke – user5122617