【问题标题】:JavaFx close window on pressing esc?JavaFx 在按下 esc 时关闭窗口?
【发布时间】:2013-01-16 11:36:55
【问题描述】:

我在我的程序中调用了一个新阶段,我想在按下退出时关闭它。我这样做了,这给了我一个 NullPointerException:

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

【问题讨论】:

    标签: javafx


    【解决方案1】:

    试试这个..

      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()' (构造函数不接受 int 作为第一个参数),但这我得到一个已弃用的警告的方式......
    • 所以我发现我只需要在 EventType 构造函数中提供一个名称,弃用的警告就消失了。 :)
    • @ErikKralj 您使用哪个版本的 javafx?
    • 我使用的是 JavaFX 2.0,为什么?我应该使用其他版本吗?
    • @ErikKralj 不只是问。当我这样做时,它对我来说很好。
    【解决方案2】:

    将事件处理程序添加到要在 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();
      }
      }
      

      完成。

      【讨论】:

      • 感谢您的帮助。你说得对,缺少一些上下文。问题是我试图关闭的场景实例此时没有打开。
      【解决方案4】:

      希望导入的 Eventhandler 包不是 JavaFX 的。

      尝试使用,

      import javafx.event.EventHandler;
      

      注意:swing 和 JavaFX 的命名规则相同,只是包名不同,您的 NetBeans/Eclipse 可能会自动导入不同的包,请务必确认。

      【讨论】:

        猜你喜欢
        • 2014-03-07
        • 2014-08-30
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 2017-01-14
        相关资源
        最近更新 更多