我知道可以new一个Stage,然后show就行了。问题是我遇到了一个超神奇的问题
我的程序是先是一个登陆框,登陆后跳转loading画面,最后进入主程序
登录框我在登陆按钮上设监听器,然后执行new一个Stage的任务,loading窗口上没有任何交互按钮,所以我指定设个
Initializable的控制器,在initialize里开个线程,异步new stage。当然new stage是在子线程中调用回调函数,在主线程完成的(很绕吧)
以上我在java8都工作得很好,但不幸的是我更新到java8u20后,登录框转loading仍旧没问题,loading转主程序窗口就不行了。单步调试我发现一个惊人的事实,FXMLLoader.load(,,,)后竟然不返回了,所以我的stage自然也没机会show了。
这真他妈的不可思议啊~
public void initialize(URL arg0, ResourceBundle arg1) {
// TODO Auto-generated method stub
Task<Boolean> worker = new Task<Boolean>() {
@Override
protected Boolean call() throws Exception {
// TODO Auto-generated method stub
//loading窗口中真正的操作
...
ConcurrentUtils.runAndWait(() -> {
Stage stage = new Stage();
Parent root = null;
try {
root = FXMLLoader.load(getClass().getResource("/main.fxml"));
System.out.println("loaded!");
Scene scene = new Scene(root);
stage.setTitle("OA");
stage.setScene(scene);
stage.show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
((Stage)detail.getScene().getWindow()).close();
});
return true;
}
};
new Thread(worker).start();
}
以上是我LoadingController的initialize方法
2 个解决方案
#1
莫要沉啊,有木有大牛来回答啊
#2
#1
莫要沉啊,有木有大牛来回答啊