2013-01-16 178 views
5

我在我的程序中调用了一个新的阶段,我喜欢按下escape来关闭它。我这样做,它给了我一个NullPointerException:关于按Esc的JavaFx关闭窗口?

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

回答

0

为什么你不向我们展示更多的代码?但是,试试这个:

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

完成。

+0

THX对您有所帮助。你是正确的缺少一些背景。问题是我想关闭的场景在这个时候没有打开。 – 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(); 
     } 
    } 
}); 

获取错误类型EventHandler不带参数。

+2

这听起来不像一个答案?请澄清你的意思 – kleopatra

0

希望导入的Eventhandler包不是JavaFX。

使用try,

import javafx.event.EventHandler; 

注:由于命名约定是相同的,但这只包的名称摆动和JavaFX,你的NetBeans/Eclipse中可以自动导入不同的包之间是不同的,所以一定要确保它。

11

试试这个..

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

你的代码不适合我,我必须用'新的EventType ()'(构造函数不接受int作为第一个参数)替换'KeyEvent.KEY_PRESSED',但这样我得到了一个已弃用的警告... – Eric

+0

所以我想通了,我只需要在EventType构造函数中提供一个名称并且弃用的警告就消失了。 :) – Eric

+0

@ErikKralj你使用哪个版本的javafx? –

3

添加事件处理程序要关闭上ESC舞台/窗口。

JavaFX的8风格:

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