2013-01-16 15 views
5

Nazywam nowy etap w moim programie, który chcę zamknąć po naciśnięciu klawisza escape. Zrobiłem to, co daje mi NullPointerException:Zamknij okno JavaFx po naciśnięciu klawisza esc?

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

Odpowiedz

0

dlaczego nie pokazać nam więcej kodu? Spróbuj jednak:

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

Gotowe.

+0

thx za pomoc. masz rację, brakuje jakiegoś kontekstu. Problem polegał na tym, że scena sceny, którą próbowałem zamknąć, nie była w tym momencie otwarta. – Chromos

-2
root.setOnKeyPressed(new EventHandler<KeyEvent>() { 
    public void handle(KeyEvent ke) { 
     if (ke.getCode() == KeyCode.ESCAPE) { 
      System.out.println("Key Pressed: " + ke.getCode()); 
      primaryStage.close(); 
     } 
    } 
}); 

pobieranie błędu jako typ EventHandler Nie pobiera parametrów.

+2

to nie brzmi jak odpowiedź? Proszę wyjaśnić, co masz na myśli – kleopatra

0

Mam nadzieję, że zaimportowany pakiet obsługi zdarzeń nie jest programem JavaFX.

Spróbuj użyć,

import javafx.event.EventHandler; 

Uwaga: W konwencji nazewnictwa są takie same, ale tylko nazwa pakietu różni się pomiędzy parą i JavaFX, Twoje NetBeans/Eclipse maja auto import różnych pakietów, więc upewnij się od niego.

11

spróbować ..

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

Twój kod nie działa dla mnie, musiałem zastąpić "KeyEvent.KEY_PRESSED" przez "nowy EventType ()" (konstruktor nie zaakceptował int jako pierwszego parametru), ale w ten sposób otrzymałem przestarzałe ostrzeżenie ... – Eric

+0

Więc zorientowałem się, że muszę podać nazwę w konstruktorze EventType i wycofane ostrzeżenie zniknęło. :) – Eric

+0

@ErikKralj której wersji javafx używasz? –

3

Dodaj obsługi zdarzeń do etapu/okna, które chcesz zamknąć na ESC.

JavaFX 8 styl:

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