2015-04-08 6 views
2

J'ai créé une application dans laquelle je dois cliquer sur un objet Menu "Ouvrir ..." pour ouvrir un FileChooser. Les FileChooser s'ouvrent, mais le problème est que je peux cliquer ou fermer la première fenêtre pendant que ce FileChooser est encore ouvert.JavaFX - La fenêtre FileChooser s'ouvre mais l'initialModality par défaut ne fonctionne pas

Est-ce que j'ai un problème avec mon code? Est-il faux de mettre primaryStage en tant que paramètre à fileChooser.showOpenDialog(primaryStage);?

Ce sont mes déclarations

private Stage primaryStage; 

Ceci est ma méthode de démarrage.

@Override 
public void start(Stage primaryStage) { 
    this.primaryStage = primaryStage; 
    primaryStage.setTitle("Ontology - Language Disorders"); 
    primaryStage.centerOnScreen(); 
    initRootLayout(); 
    showOntologyOverview(); 
    primaryStage.show(); 
} 

Ceci est mon OpenDialog

@FXML 
private void handleOpenMenuItem(ActionEvent event){ 
    FileChooser fileChooser = new FileChooser(); 
    fileChooser.setTitle("Open Resource File"); 
    fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("OWL (*.owl)", "*.owl")); 
    fileChooser.showOpenDialog(primaryStage); 
} 

Mon initRootLayout:

public void initRootLayout() { 
    try { 
     // Load root layout from fxml file. 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(MainApp.class.getResource("RootLayout.fxml")); 
     rootLayout = (BorderPane) loader.load(); 
     // Show the scene containing the root layout. 
     Scene scene = new Scene(rootLayout); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Ce n'est pas ce qui se passe. Je ne sais vraiment pas pourquoi, je peux toujours faire une interaction comme fermer la fenêtre principale :( – Calips

+0

Je suis confus.Est-ce votre sous-classe 'Application', ou est-ce votre classe de contrôleur? –

+0

J'ai utilisé la même classe pour les deux , je veux dire que l'application principale a ces méthodes – Calips

Répondre

2

Vous utilisez la classe Application que la classe de contrôleur pour votre FXML. C'est très déroutant et vous devriez l'éviter.

Voici ce qui se passe:

  1. Vous lancez l'application. Cela provoque l'initialisation du toolkit FX, le thread d'application FX à démarrer, une instance de votre sous-classe Application à créer, un Stage à créer et start(...) à appeler sur cette instance, sur le thread d'application FX.
  2. Votre méthode start définit le champ primaryStage de l'instance créée par la séquence de démarrage
  3. Vous créez un FXMLLoader et charger le fichier FXML. Le FXMLLoader crée une instance de la classe de contrôleur (qui est la sous-classe Application). Il initialise ensuite tous les champs @FXML -annotated sur cette instance et enregistre les méthodes de gestionnaire. Notez que le champ primaryStage n'est jamais initialisé sur cette instance.

Lorsque l'utilisateur appuie sur le « Open » MenuItem, le procédé handleOpenMenuItem() est invoquée sur l'instance créée à l'étape 4 (pas l'instance créée à l'étape 1). Vous créez le FileChooser et appelez le showOpenDialog(...) en passant la valeur primaryStage. Puisque primaryStage est null dans ce cas, le sélecteur de fichier n'a pas de fenêtre propriétaire, et ne peut donc pas implémenter de modalité significative.

Pour résoudre ce problème, créez une classe distincte pour votre contrôleur. Vous pouvez obtenir la fenêtre en appelant le getScene().getWindow() sur n'importe quel nœud de la scène.

+0

Ok! Je vais essayer ça, merci beaucoup! – Calips

+0

Oui, vous avez raison. Whao, quel coup de feu! :) – ItachiUchiha

+0

YEAAAAAAAY! le problème était dans l'intialisation: D merci à vous deux! :RÉ – Calips