在使用JavaFX时,如何获取应用程序实例?
通常情况下,您可以通过以下方式启动应用程序:
public class LoginForm {
public static void main(String[] args) {
LoginApplication.launch(LoginApplication.class, args);
}
}
方法“launch”不返回应用程序的实例。有没有办法可以获取该实例?在使用JavaFX时,如何获取应用程序实例?
通常情况下,您可以通过以下方式启动应用程序:
public class LoginForm {
public static void main(String[] args) {
LoginApplication.launch(LoginApplication.class, args);
}
}
方法“launch”不返回应用程序的实例。有没有办法可以获取该实例?我只是尝试找到一种简单、逻辑的方法来实现这个目标。但我还没有找到。如果有一个Application.getApplicationFor(AppClass.class)可以为您管理一些单例,那就太好了,但是没有。
如果我们限制问题空间,解决起来就很容易。如果将类设置为单例模式,那么就很简单...一个简化的单例模式应该可以正常工作:
class MyApp extends Application
{
public static MyApp me;
public MyApp()
{
me=this;
}
...
}
如果尚未由系统实例化,me可以为null。通过编写更多的代码可以防止这种情况发生。
... 实现代码 ...
刚刚实现了这个功能 - 似乎工作正常(除了任何奇怪的线程情况)。我有一个稍微不同的情况,我正在将JavaFX屏幕嵌入到现有的Swing GUI中。它运行良好,但我需要确保只调用一次Application.launch。添加此要求后,我的最终解决方案如下:
(抱歉,语法中包含一些Groovy,但对于任何Java用户来说应该很容易翻译)
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
这个功能负责阻塞,直到Application.launch完成实例化类、从其他位置获取实例并确保只要getInstance至少被调用一次,就只会调用一次Application.launch。