2012-07-13 3 views
5

Je suis nouveau sur JavaFx et je crée une application qui nécessitait quelque chose de similaire à JDialog qui était proposé lors de l'utilisation de composants swing. J'ai résolu cela en créant une nouvelle scène, mais maintenant j'ai besoin d'un moyen de fermer la nouvelle scène de l'intérieur en cliquant sur un bouton. (oui, le bouton x fonctionne aussi, mais il le voulait aussi sur le bouton). Pour décrire la situation: J'ai une classe principale à partir de laquelle je crée la scène principale avec une scène. J'utilise FXML pour ça.JavaFX2: Fermeture d'une scène (sous-étape) depuis l'intérieur

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("Builder.fxml")); 
    stage.setTitle("Ring of Power - Builder"); 
    stage.setScene(new Scene(root)); 
    stage.setMinHeight(600.0); 
    stage.setMinWidth(800.0); 
    stage.setHeight(600); 
    stage.setWidth(800); 
    stage.centerOnScreen(); 
    stage.show(); 
} 

Maintenant dans la fenêtre principale que je semble que tous les éléments de commande et des menus et des choses, faites par FXML et la classe de contrôle approprié. C'est la partie où j'ai décidé d'inclure les infos sur le menu Aide. J'ai donc un événement se passe lorsque le menu Aide - A propos est activé, comme ceci: Comme on le voit la fenêtre À propos de boîte est créée via FXML avec classe de contrôle à nouveau

@FXML 
private void menuHelpAbout(ActionEvent event) throws IOException{ 
    Parent root2 = FXMLLoader.load(getClass().getResource("AboutBox.fxml")); 
    Stage aboutBox=new Stage(); 
    aboutBox.setScene(new Scene(root2)); 
    aboutBox.centerOnScreen(); 
    aboutBox.setTitle("About Box"); 
    aboutBox.setResizable(false); 
    aboutBox.initModality(Modality.APPLICATION_MODAL); 
    aboutBox.show(); 
} 

. Il y a une image, une zone de texte et un bouton, et je veux que ce bouton ferme la nouvelle scène qui est la aboutBox de la classe AboutBox.java pour ainsi dire.

La seule façon dont je me suis trouvé capable de faire cela, était de définir un static static Stage aboutBox ; à l'intérieur de la classe Builder.java et référence à celle-ci à partir de la méthode AboutBox.java qui gère l'événement d'action sur le bouton de fermeture. Mais d'une manière ou d'une autre, il ne se sent pas exactement propre et correct. Y a-t-il une meilleure façon?

Merci d'avance pour vos conseils.

Répondre

21

Vous pouvez dériver l'étape à fermer à partir de l'événement transmis au gestionnaire d'événements.

new EventHandler<ActionEvent>() { 
    @Override public void handle(ActionEvent actionEvent) { 
    // take some action 
    ... 
    // close the dialog. 
    Node source = (Node) actionEvent.getSource(); 
    Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
    } 
} 
+8

Fermer la scène comme ceci contourne le gestionnaire d'événement onCloseRequest (s'il y en a un). J'ajouterais la ligne stage.getOnCloseRequest(). Handle (null); juste avant stage.close(); – beardedlinuxgeek

+1

Merci @beardedlinuxgeek. J'ai eu ce problème - ma fenêtre fermait mais le gestionnaire d'événement que j'avais enregistré n'était pas appelé. Votre solution a résolu le problème. –

1

Dans JavaFX 2.1, vous avez peu de choix. La façon comme dans la réponse de jewelsea ou la façon dont ce que vous avez déjà fait ou une version modifiée de celui-ci comme

public class AboutBox extends Stage { 

    public AboutBox() throws Exception { 
     initModality(Modality.APPLICATION_MODAL); 
     Button btn = new Button("Close"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       close(); 
      } 
     }); 

     // Load content via 
     // EITHER 

     Parent root = FXMLLoader.load(getClass().getResource("AboutPage.fxml")); 
     setScene(new Scene(VBoxBuilder.create().children(root, btn).build())); 

     // OR 

     Scene aboutScene = new Scene(VBoxBuilder.create().children(new Text("About me"), btn).alignment(Pos.CENTER).padding(new Insets(10)).build()); 
     setScene(aboutScene); 

     // If your about page is not so complex. no need FXML so its Controller class too. 
    } 
} 

avec utilisation comme

new AboutBox().show(); 

dans le gestionnaire d'événements d'action de l'élément de menu.

+0

En fait, j'ai un peu de difficulté avec la solution. Il semble qu'il n'aime pas la première version avec le FXML. – Meg

+0

Le problème semble être le fait que vous appelez la classe AboutBox.java qui elle-même est censée être la classe de contrôle pour AboutBox.fxml À moins que ce soit la raison pour laquelle vous avez écrit AboutPage.fxml < – Meg

+0

@Meg. Mise à jour de la réponse AboutBox.java n'est pas non plus le contrôleur de AboutBox.fxml ou AboutPage.fxml. –

Questions connexes