按下esc键时JavaFx关闭窗口?

按下esc键时JavaFx关闭窗口?,javafx,Javafx,我正在调用程序中的一个新阶段,我喜欢在按下escape键时关闭它。我这样做给了我一个NullPointerException: scene.setOnKeyPressed(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent t) { KeyCode key = t.getCode(); if (key == Ke

我正在调用程序中的一个新阶段,我喜欢在按下escape键时关闭它。我这样做给了我一个NullPointerException:

    scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent t) {
            KeyCode key = t.getCode();
            if (key == KeyCode.ESCAPE){
                stage.close();
            }
        }
    });
scene.setOnKeyPressed(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent t){
KeyCode key=t.getCode();
if(key==KeyCode.ESCAPE){
stage.close();
}
}
});

为什么不向我们展示更多的代码?但是,请尝试以下方法:

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();
}
}
公共类登录扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共作废开始(最终阶段初级阶段){
setTitle(“JavaFX欢迎”);
GridPane grid=新建GridPane();
网格设置对齐(位置中心);
网格。setHgap(10);
网格设置间隙(10);
网格设置填充(新插图(25,25,25,25));
文本场景=新文本(“欢迎”);
setId(“欢迎文本”);
添加(scenetitle,0,0,2,1);
标签用户名=新标签(“用户名:”);
添加(用户名,0,1);
TextField userTextField=新建TextField();
add(userTextField,1,1);
Label pw=新标签(“密码:”);
加(pw,0,2);
PasswordField pwBox=新的PasswordField();
网格。添加(pwBox,1,2);
按钮btn=新按钮(“登录”);
HBox hbBtn=新的HBox(10);
hbBtn.设置对齐(右下角位置);
hbBtn.getChildren().add(btn);
网格添加(hbBtn,1,4);
场景=新场景(网格,660300);
scene.setOnKeyPressed(新的EventHandler(){
公共无效句柄(KeyEvent ke){
if(ke.getCode()==KeyCode.ESCAPE){
System.out.println(“按键:+ke.getCode());
primaryStage.close();
}
}
});
//primaryStage.setFullScreen(真);
初级阶段。场景(场景);
primaryStage.show();
}
}

完成。

希望导入的Eventhandler包不是JavaFX的

试着用

import javafx.event.EventHandler;
注意:由于swing和JavaFX之间的命名约定相同,但只有包名不同,因此NetBeans/Eclipse可能会自动导入不同的包,因此请确保这一点。

试试这一点

  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();
          }
        }
    });
scene.addEventHandler(按下KeyEvent.KEY),新的事件处理程序
() {
@凌驾
公共无效句柄(KeyEvent t){
if(t.getCode()==KeyCode.ESCAPE)
{
System.out.println(“单击escape”);
Stage sb=(Stage)label.getScene().getWindow();//使用任何一个对象
(某人接近);
}
}
});

将事件处理程序添加到要在ESC上关闭的阶段/窗口中

JavaFX8样式:

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

谢谢你的帮助。你说得对,缺少一些上下文。问题是我试图关闭的场景实例此时未打开。您的代码对我无效,我必须将“KeyEvent.KEY_PRESSED”替换为“new EventType()”(构造函数不接受int作为第一个参数),但通过这种方式,我得到了一个不推荐的警告…所以我发现我只需要在EventType构造函数中提供一个名称,不推荐的警告就消失了。:)@ErikKralj您使用哪个版本的javafx?我使用的是JavaFX2.0,为什么?“我应该使用不同的版本吗?”ErikKralj不只是问。当我这样做的时候,它对我来说很好。