gpt4 book ai didi

java - Stage 在 javafx 中显示为 null

转载 作者:行者123 更新时间:2023-11-30 10:15:31 27 4
gpt4 key购买 nike

在第一个场景中按下按钮时调用此方法(abc)。它所做的是将场景更改为 waitingScreen 并调用另一个方法 waitscr()

 public void abc(ActionEvent event)throws Exception{
stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
//for changing the scene.
Parent administrator =
FXMLLoader.load(getClass().getResource("waitingScreen.fxml"));
stage.setScene(new Scene(administrator));
stage.show();
conn.close();
waiting_screen_Controller c = new waiting_screen_Controller();
c.waitscr(event);

waitscr 做的是启动一个定时器 5 秒,当定时器结束时它调用另一个方法 setscr()(也许我可以只在 abc 中启动计时器)

  public void waitscr(ActionEvent event)throws IOException{
timetask = new TimerTask(){

@Override
public void run() {
if(!timing){
try{
timetask.cancel();
setscr(event);
}
catch(Exception ex){
ex.printStackTrace();
}
}
else
timing = updateTime();
}
};
timer.scheduleAtFixedRate(timetask,1000,1000);
}

它更新时间

 public boolean updateTime(){
System.out.println(s);
if(s==0){
return false;
}
s--;
return true;
}

setscr 的作用是将场景改回第一个......

  public void setscr(ActionEvent event)throws IOException{ 
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("first.fxml"));
Parent parent = loader.load();
Scene s=new Scene(parent);
stage = (Stage)((Node) event.getSource()).getScene().getWindow();
System.out.print(event.getSource());
stage.setScene(s);
stage.show();

} catch (SQLException ex) {
System.out.println(ex.getMessage());
}

}

但问题是它在阶段给了npe。

java.lang.NullPointerException
at sample.waiting_screen_Controller.setscr(waiting_screen_Controller.java:106)
at sample.waiting_screen_Controller$1.run(waiting_screen_Controller.java:45)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)

我认为这是因为 ActionEvent,因为 npe 处于阶段但我打印了 ActionEvent 的源并且它不是空的。

最佳答案

您在调用 waitscr 之前替换场景。这样,当您调用 Scene.getWindow 时,场景不再与窗口相关联,结果为 null

无论如何,您都不应该从非应用程序线程执行此操作。

通过仅检索一次窗口并使用 Platform.runLater,您应该能够解决此问题:

public void abc(ActionEvent event)throws Exception{
stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
...
c.waitscr(stage);
public void waitscr(final Stage stage) throws IOException {
timetask = new TimerTask(){

@Override
public void run() {
if(!timing){
try{
timetask.cancel();
setscr(stage);
} catch(Exception ex){
ex.printStackTrace();
}
}
else
timing = updateTime();
}
};
timer.scheduleAtFixedRate(timetask,1000,1000);
}
public void setscr(Stage stage)throws IOException{
// there seems to be a try missing somewhere
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("first.fxml"));
Parent parent = loader.load();
Scene s=new Scene(parent);

Platform.runLater(() -> {
// scene update on javafx application thread
stage.setScene(s);
stage.show();
});

} catch (SQLException ex) {
System.out.println(ex.getMessage());
}

}

关于java - Stage 在 javafx 中显示为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50428116/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com