[英]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.