簡體   English   中英

在JavaFX中組合鍵按下的屏幕之間切換

[英]Switch between screens on combined key press in javafx

我想在按Ctrl + D時在兩個場景之間切換,這是我的代碼:Main Class:

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){

    }  
} 

initialize()方法在加載過程中被調用,即在執行過程中被調用

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

顯然,這是root1添加到場景之前發生的,所以當您執行此操作時

Stage stage=(Stage)label1.getScene().getWindow();

label1.getScene()返回null並且您得到一個Null Pointer Exception。

創建場景時,將事件處理程序添加到場景中。 如果將代碼放在應用程序類的方法中,則可以重用代碼:

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

        registerSceneSwitchHandler(stage, scene, "scene2.fxml");
    }

    private void registerSceneSwitchHandler(Stage stage, Scene scene, String resource) {

      KeyCombination ctrlD = KeyCodeCombination.keyCombination("Ctrl+D");
      scene.addEventFilter(KeyEvent.KEY_PRESSED, ke -> {
          if (ctrlD.match(ke)) {
              System.out.println("Key Pressed: " + ctrlD);
              try {
                  Parent root = FXMLLoader.load(getClass().getResource(resource));
                  Scene newScene = new Scene(root);

                  String returnResource ;
                  if ("scene2.fxml".equals(resource)) {
                      returnResource = "FXMLDocument.fxml";
                  } else {
                      returnResource = "scene2.fxml";
                  }

                  registerSceneSwitchHandler(stage, newScene, returnResource);

                  stage.setScene(scene);

               } catch (IOException ex) {
                   ex.printStackTrace();
               }
          }
      });

    }

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

}

然后只需從initialize()方法中刪除事件處理程序即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM