JavaFx按下Esc键关闭窗口?

6

我正在调用程序中的一个新阶段,希望在按下“Esc”键后关闭。我尝试了以下方法,但出现了NullPointerException:

    scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent t) {
            KeyCode key = t.getCode();
            if (key == KeyCode.ESCAPE){
                stage.close();
            }
        }
    });
4个回答

14
尝试这个...
  scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>
  () {

        @Override
        public void handle(KeyEvent t) {
          if(t.getCode()==KeyCode.ESCAPE)
          {
              System.out.println("click on escape");
           Stage sb = (Stage)label.getScene().getWindow();//use any one object
           sb.close();
          }
        }
    });

你的代码对我来说没有起作用,我不得不将 'KeyEvent.KEY_PRESSED' 替换为 'new EventType<KeyEvent>()'(构造函数不接受 int 作为第一个参数),但是这样会出现一个过时警告... - erikvimz
所以我发现只需要在EventType构造函数中提供一个名称,就可以消除弃用警告。 :) - erikvimz
@ErikKralj 你使用的JavaFX版本是哪个? - Anshul Parashar
我正在使用JavaFX 2.0,为什么?我应该使用不同的版本吗? - erikvimz
@ErikKralj 不是在质疑你,只是在问一下。当我这样做时,对我来说很好用。 - Anshul Parashar

10

将事件处理程序添加到您希望在按下ESC键时关闭的舞台/窗口中。

JavaFX 8风格:

    stage.addEventHandler(KeyEvent.KEY_RELEASED, (KeyEvent event) -> {
        if (KeyCode.ESCAPE == event.getCode()) {
            stage.close();
        }
    });

3

你为什么不展示更多的代码呢?不过,试试这个:

public class Login extends Application {

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

@Override
public void start(final Stage primaryStage) {
    primaryStage.setTitle("JavaFX Welcome");
    GridPane grid = new GridPane();
    grid.setAlignment(Pos.CENTER);
    grid.setHgap(10);
    grid.setVgap(10);
    grid.setPadding(new Insets(25, 25, 25, 25));

    Text scenetitle = new Text("Welcome");
    scenetitle.setId("welcome-text");
    grid.add(scenetitle, 0, 0, 2, 1);

    Label userName = new Label("User Name:");
    grid.add(userName, 0, 1);

    TextField userTextField = new TextField();
    grid.add(userTextField, 1, 1);

    Label pw = new Label("Password:");
    grid.add(pw, 0, 2);

    PasswordField pwBox = new PasswordField();
    grid.add(pwBox, 1, 2);

    Button btn = new Button("Sign in");
    HBox hbBtn = new HBox(10);
    hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
    hbBtn.getChildren().add(btn);
    grid.add(hbBtn, 1, 4);

    Scene scene = new Scene(grid, 660, 300);
    scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
        public void handle(KeyEvent ke) {
            if (ke.getCode() == KeyCode.ESCAPE) {
                System.out.println("Key Pressed: " + ke.getCode());
                primaryStage.close();
            }
        }
    });
    //primaryStage.setFullScreen(true);
    primaryStage.setScene(scene);
    primaryStage.show();
}
}

完成。

谢谢你的帮助。你是对的,缺少一些上下文。问题在于我试图关闭的场景实例此时尚未打开。 - Chromos

0
希望导入的EventHandler包不是JavaFX相关的。
尝试使用:
import javafx.event.EventHandler;

注意:由于Swing和JavaFX之间的命名约定相同,但仅包名称不同,因此您的NetBeans / Eclipse可能会自动导入不同的包,请确保它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接