JavaFx закрыть окно при нажатии esc?

Я вызываю новую стадию в моей программе, которую я люблю закрывать нажатием escape. Я сделал это, что дает мне исключение NullPointerException:

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

person Chromos    schedule 16.01.2013    source источник


Ответы (4)


попробуй это..

  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();
          }
        }
    });
person Anshul Parashar    schedule 13.11.2013
comment
Ваш код у меня не сработал, мне пришлось заменить «KeyEvent.KEY_PRESSED» на «new EventType‹KeyEvent›()» (конструктор не принимал int в качестве первого параметра), но таким образом я получил устаревшее предупреждение.. . - person erikvimz; 14.11.2014
comment
Итак, я понял, что мне просто нужно указать имя в конструкторе EventType, и устаревшее предупреждение исчезло. :) - person erikvimz; 14.11.2014
comment
@ErikKralj, какую версию javafx вы используете? - person Anshul Parashar; 18.11.2014
comment
Я использую JavaFX 2.0, почему? Должен ли я использовать другую версию? - person erikvimz; 18.11.2014
comment
@ErikKralj, не просто спрашивай. Когда я это делаю, у меня все работает. - person Anshul Parashar; 19.11.2014

Добавьте обработчик события в сцену/окно, которое вы хотите закрыть по ESC.

Стиль JavaFX 8:

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

почему вы не показываете нам больше своего кода? Однако попробуйте следующее:

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();
}
}

Сделанный.

person AndresMontj    schedule 14.02.2013
comment
Спасибо за вашу помощь. вы правы, не хватает контекста. проблема заключалась в том, что экземпляр сцены, которую я пытался закрыть, в этот момент не был открыт. - person Chromos; 15.02.2013

Надеюсь, что импортированный пакет Eventhandler не относится к JavaFX.

Попробуйте использовать,

import javafx.event.EventHandler;

Примечание. Так как соглашение об именах одинаковое, но между Swing и JavaFX различается только имя пакета, ваш NetBeans/Eclipse может автоматически импортировать разные пакеты, поэтому убедитесь в этом.

person Jafar    schedule 27.06.2013