在javafx中组合按键上的屏幕之间切换

时间:2017-04-04 11:41:12

标签: java javafx scene

我想按Ctrl + D在两个场景之间切换,这是我的代码: 主类:

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

        Scene scene = new Scene(root);
        stage.setScene(scene);
        //stage.setFullScreen(true);
     //  stage.initStyle(StageStyle.UNDECORATED);
        stage.show();

          scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
          KeyCombination ctrlD = KeyCodeCombination.keyCombination("Ctrl+D");
            //final KeyCombination keyComb = new KeyCodeCombination(KeyCode.ESCAPE,
           //                                                       KeyCombination.CONTROL_DOWN);
            public void handle(KeyEvent ke) {
                if (ctrlD.match(ke)) {
                    System.out.println("Key Pressed: " + ctrlD);
                   try {
                    Parent root1 = FXMLLoader.load(getClass().getResource("scene2.fxml"));
                    Scene scene2 = new Scene(root1);
                    stage.setScene(scene2);

                   } catch (IOException ex) {

                   }
                }
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }

}

工作正常。但是当我想从scene2返回到scene1时,代码不起作用。这是我的Scene2控制器代码:

@FXML
private label label1;
  @Override
public void initialize(URL url, ResourceBundle rb) {
     try{
   Stage stage=(Stage)label1.getScene().getWindow();
    stage.getScene().addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
        KeyCombination ctrlD = KeyCodeCombination.keyCombination("Ctrl+D");
        //final KeyCombination keyComb = new KeyCodeCombination(KeyCode.ESCAPE,
       //                                                       KeyCombination.CONTROL_DOWN);
        public void handle(KeyEvent ke) {
            if (ctrlD.match(ke)) {
                try {
                    System.out.println("Key Pressed: " + ctrlD);
                    Parent root;
                    root = FXMLLoader.load(getClass().getResource("scene1.fxml"));
                    Stage stage = (Stage) label1.getScene().getWindow();
                    Scene scene=new Scene(root);
                    stage.setScene(scene);

                } catch (IOException ex) {
                    Logger.getLogger(Scene2Controller.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    });
    }catch(Exception e){

    }  
} 

1 个答案:

答案 0 :(得分:0)

api/hello/ghouse方法作为加载过程的一部分被调用,即在执行

期间调用它。
initialize()

显然,在将<{1}}添加到场景之前会发生,所以当你这样做时

Parent root1 = FXMLLoader.load(getClass().getResource("scene2.fxml"));

root1返回Stage stage=(Stage)label1.getScene().getWindow(); ,你会得到一个空指针异常。

创建场景时,将事件处理程序添加到场景中。如果将代码放在应用程序类的方法中,则可以重用代码:

label1.getScene()

然后从null方法中删除事件处理程序。