我想按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){
}
}
答案 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
方法中删除事件处理程序。