2016-04-18 2 views
0

Je n'aime pas les barres de menus, donc je limite mon application à KeyCombinations pour générer des événements. J'ai la combinaison de touches qui fonctionne mais j'ai le sentiment que je n'utilise pas les contrôleurs correctement. J'ai besoin d'éditer la nouvelle scène dans mon contrôleur mais je me retrouve dans le try/catch de l'événement KeyCombination.JavaFX créant une nouvelle scène à partir de KeyCombination correctement

Je voudrais faire tous les changements à la scène en classe SettingsController.java


où je crée une nouvelle scène/vue

final KeyCombination settingsCMD = new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN); 
scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() 
{ 
    @Override 
    public void handle(KeyEvent event) 
    { 
     if (settingsCMD.match(event)) 
     { 
      System.out.println("CTRL + S was pressed on " + name + " display\n" + 
        "Opening Settings Scene"); 
      /* 
      * This is where we need to launch a scene for settings 
      */ 
      try 
      { 
       Parent root = FXMLLoader.load(getClass().getResource("/sample/view/settingsscreen.fxml")); 
       Stage settingsStage = new Stage(); 
       settingsStage.setTitle("Settings"); 
       settingsStage.setScene(new Scene(root, 500 , 400)); 
       settingsStage.show(); 

       // This really needs to be done in the controller. How do I do this? 
       JSON jsonTools = new JSON(); 
       jsonTools.readJSONSettings(); 
       jsonTools.writeJSONSettings(); 
      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
}); 


SettingsController.java

public class SettingsController 
{ 

    @FXML private TextField hostname; 


    public String getText() 
    { 
     String textProp = textProperty().get(); 
     System.out.println("testProperty is " + textProp + "\n"); 
     return textProp; 
    } 

    public void setText(String value) 
    { 
     textProperty().set(value); 
    } 

    private StringProperty textProperty() 
    { 
     return hostname.textProperty(); 
    } 

} 

Répondre

1

Vous pouvez obtenir une référence à la classe de contrôleur de vue de la FXMLLoader:

FXMLLoader loader = new FXMLLoader(getClass().getResource(resource)); 
    Scene scene = new Scene(loader.load()); 
    parentStage.setScene(scene); 

    Controller controller = loader.getController(); 

Sur cette référence, vous pouvez appeler la méthode appropriée

final KeyCombination settingsCMD = new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN); 
scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() 
{ 
    @Override 
    public void handle(KeyEvent event) 
    { 
     if (settingsCMD.match(event)) 
     { 
      System.out.println("CTRL + S was pressed on " + name + " display\n" + 
        "Opening Settings Scene"); 
      /* 
      * This is where we need to launch a scene for settings 
      */ 
      try 
      { 
       FXMLLoader loader = new FXMLLoader.load(getClass().getResource("/sample/view/settingsscreen.fxml")); 
       Parent root = loader.load(); 
       SettingsController controller = loader.getController(); 

       Stage settingsStage = new Stage(); 
       settingsStage.setTitle("Settings"); 
       settingsStage.setScene(new Scene(root, 500 , 400)); 
       settingsStage.show(); 

       controller.yourMethod(); 

      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
}); 
+0

Je me suis déplacé ce bloc tout mon code pour obtenir ce travail , pourriez-vous s'il vous plaît le placer dans le code fourni afin que je comprenne ce que vous faites? – DevinM

+0

Peut-être que cette réponse peut vous fournir de l'aide supplémentaire [http://stackoverflow.com/questions/36585761/store-dynamic-screen-with-multiple-stages/36612093#36612093](http://stackoverflow.com/questions/ 36585761/store-dynamic-screen-with-multiple-stades/36612093 # 36612093). – jns

+0

Merci pour l'aide, cela a fait l'affaire! – DevinM