web-dev-qa-db-fra.com

Comment créer une fenêtre modale dans JavaFX 2.1

Je ne peux pas comprendre comment créer une fenêtre modale dans JavaFX. Fondamentalement, j'ai un sélecteur de fichiers et je veux poser une question à l'utilisateur lorsqu'il sélectionne un fichier. J'ai besoin de ces informations pour analyser le fichier, donc l'exécution doit attendre la réponse.

J'ai vu cette question mais je n'ai pas réussi à savoir comment implémenter ce comportement.

35
Luka

Voici lien vers une solution J'ai créé précédemment pour les boîtes de dialogue modales dans JavaFX 2.1 La solution crée une étape modale au-dessus de l'étape actuelle et prend des mesures sur les résultats de la boîte de dialogue via des gestionnaires d'événements pour les commandes de boîte de dialogue.

Mise à jour

La solution liée antérieure utilise une approche de gestionnaire d'événements daté pour prendre des mesures après la fermeture d'une boîte de dialogue. Cette approche était valable pour les implémentations antérieures à JavaFX 2.2. Pour JavaFX 8+, il n'y a pas besoin de gestionnaires d'événements, utilisez plutôt la nouvelle méthode Stage showAndWait() . Par exemple:

Stage dialog = new Stage();

// populate dialog with controls.
...

dialog.initOwner(parentStage);
dialog.initModality(Modality.APPLICATION_MODAL); 
dialog.showAndWait();

// process result of dialog operation. 
... 

Notez que, pour que les choses fonctionnent comme prévu, il est important d'initialiser le propriétaire de la scène et pour initialiser la modalité de la scène sur WINDOW_MODAL ou APPLICATION_MODAL .

Il existe des boîtes de dialogue d'interface utilisateur standard de haute qualité dans JavaFX 8 et ControlsFX , si elles correspondent à vos besoins, je vous conseille de les utiliser plutôt que de développer les vôtres. Ces classes JavaFX Dialog et Alert intégrées ont également initOwner et initModality et showAndWait méthodes, afin que vous puissiez définir la modalité pour elles comme vous le souhaitez (notez que, par défaut, les boîtes de dialogue intégrées sont modales d'application).

42
jewelsea

À mon avis, ce n'est pas une bonne solution, car la fenêtre parent est toujours active.
Par exemple, si vous voulez ouvrir la fenêtre comme modale après avoir cliqué sur le bouton ...

private void clickShow(ActionEvent event) {
    Stage stage = new Stage();
    Parent root = FXMLLoader.load(
        YourClassController.class.getResource("YourClass.fxml"));
    stage.setScene(new Scene(root));
    stage.setTitle("My modal window");
    stage.initModality(Modality.WINDOW_MODAL);
    stage.initOwner(
        ((Node)event.getSource()).getScene().getWindow() );
    stage.show();
}

Maintenant, votre nouvelle fenêtre est VRAIMENT modale - le parent est bloqué. vous pouvez également utiliser

Modality.APPLICATION_MODAL
68
Krzysztof Szewczyk