JavaFx 怎么从一个窗口打开另一个新窗口

时间:2023-01-05 17:00:54
如题
我知道可以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


该回复于2014-09-22 08:50:27被管理员删除

#1


莫要沉啊,有木有大牛来回答啊

#2


该回复于2014-09-22 08:50:27被管理员删除