如何在使用javafx时获取应用程序实例?
通常以这种方式启动应用程序:
public class LoginForm {
public static void main(String[] args) {
LoginApplication.launch(LoginApplication.class, args);
}
}
方法启动不会返回应用程序实例。 有没有办法让我得到实例?
答案 0 :(得分:5)
我只是想找到一种简单,合乎逻辑的方法来做到这一点。我没有。如果有一个Application.getApplicationFor(AppClass.class)为你管理一些单例,那将是非常好的 - 但不是。
如果我们限制问题空间,它很容易解决。如果我们让这个班级成为单身人士,那么它的蛋糕......简化的单身人士模式应该可以正常运作:
class MyClass extends Application{
private static MyClass instance
public MyClass() {
instance=this
}
public synchronized static getInstance() {
if(!instance) {
Thread.start {
// Have to run in a thread because launch doesn't return
Application.launch(MyClass.class)
}
while(!instance)
Thread.sleep(100)
}
return instance
...
} // class
如果尚未被系统实例化,那么我可以为null。使用更多代码可以防止这种情况发生。
......实施代码......
刚刚实现这一点 - 似乎有效(除非有任何奇怪的线程情况) 我的情况略有不同,我将javaFX屏幕嵌入到现有的swing GUI中。它工作正常,但我需要确保只调用一次Application.launch。添加此要求,我的最终解决方案是:
(抱歉,但语法中有一些groovy,任何Java用户都应该很容易翻译)
{{1}}
这管理阻塞,直到Application.launch完成实例化类,从其他位置获取实例并确保只要getInstance被调用至少一次就会调用Application.launch一次。
答案 1 :(得分:-6)
通常javafx应用程序使用scenebuilder进行javafx视图,并将其映射到控制器类,该类将调用访问fxml文件:
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/loginform.fxml"));
Parent root = myLoader.load();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.initStyle(StageStyle.DECORATED);
stage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}