2016-04-18 14 views
0

メニューバーがありませんので、アプリケーションをKeyCombinationに限定してイベントを生成しています。私はキーの組み合わせが働いているが、コントローラを正しく使用していないと感じている。私はコントローラ内で新しいシーンを編集する必要がありますが、代わりにKeyCombinationイベントのtry/catch内でそうしています。KeyCombinationから新しいシーンを正しく作成するJavaFX

私は新しいシーン/ビューを作成したクラスSettingsController.java


内のシーンに対するすべての変更をしたいと思い

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(); 
    } 

} 

答えて

1

私はこの作業を取得するために、すべての私のコードの上にこのブロックを移動してきたあなたは、適切な方法

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

呼び出すことができます。このリファレンスでは

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

:あなたはFXMLLoaderからのビューコントローラクラスへの参照を取得することができますあなたがしていることを理解しているので、提供されたコードの中に置いてください。 – DevinM

+0

この回答はあなたにいくつかの追加のヘルプを提供する可能性があります[http://stackoverflow.com/questions/36585761/store-dynamic-screen-with-multiple-stages/36612093#36612093](http://stackoverflow.com/questions/) 36585761 /店舗用ダイナミックスクリーン - 複数ステージ/ 36612093#36612093)。 – jns

+0

助けてくれてありがとう、これはトリックでした! – DevinM

関連する問題