web-dev-qa-db-fra.com

Comment fermer une fenêtre Java en cliquant sur un bouton - Projet JavaFX

J'ai créé un projet JavaFX et créé l'interface graphique du cadre de première connexion dans Java Scene Builder. Lorsque la connexion est réussie, le cadre de connexion doit être fermé et le cadre suivant doit être visible (cadre principal du programme). Je peux faire apparaître le nouveau cadre, mais je ne peux pas fermer le cadre de connexion. J'ai essayé des choses comme dispose() mais rien ne fonctionne. Ci-dessous le code de la classe principale:

public class KuberComm extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);
        stage.setResizable(false);
        stage.setTitle("Login to KuberComm");
        stage.setScene(scene);

        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

Le gestionnaire du bouton de connexion est situé dans une autre classe (classe de contrôleur créée par l'EDI NetBeans). Je n'arrive pas à comprendre le nom du cadre pour pouvoir l'utiliser dans la classe de contrôleur.

Toute aide sera très appréciée!

14
Aristomenis

donnez un nom à votre bouton dans la classe du contrôleur:

@FXML
public Button closeButton;

et ajoutez cette méthode:

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    Stage stage = (Stage) closeButton.getScene().getWindow();
    stage.close();
}

Dans votre FXML, vous avez besoin d'une référence au nom du bouton et à la méthode pour appeler onAction:

<Button fx:id="closeButton" cancelButton="true" layoutX="350.0" layoutY="767.0" mnemonicParsing="false" onAction="#handleCloseButtonAction" prefWidth="100.0" text="Close" />

Cela fermerait la scène où ce bouton est activé.

25
Moh-Aw

Utilisation 

stage.hide()

Si vous le faites depuis un contrôleur, vous pouvez obtenir la scène à partir de n'importe quelle variable Node dans la scène de la scène (si nécessaire, laissez le chargeur FXML en affecter un à un champ du contrôleur à l'aide de l'attribut id de l'espace de noms fxml dans le fxml):

Window stage = node.getScene().getWindow();
6
fabian

Similaire aux autres réponses mais plus précis.

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}
5
Sedrick

Merci pour votre temps de réponse, mais à la fin j'ai trouvé comment résoudre ce problème. j'ai utilisé 

((Node)(event.getSource())).getScene().getWindow().hide();

dans leifqu'il est responsable de la connexion réussie. Je veux dire, après l'apparition d'une boîte de dialogue informant l'utilisateur de la connexion réussie, le code y est envoyé.

(J'ai aussi importé le bon matériel pour que cette ligne de code fonctionne)

4
Aristomenis

Bien que

    getScene().getWindow();

sur une Node, vous obtiendrez la scène du contrôleur. Il est important de noter que l'appel de close() ou hide() est équivalent et rendra simplement la fenêtre de connexion invisible. En ce qui concerne l'utilisation de dispose():

Ce lien pourrait aider à dissiper toute confusion.

0
Forager