在JavaFX中获取应用程序实例

17

在使用JavaFX时,如何获取应用程序实例?

通常情况下,您可以通过以下方式启动应用程序:

public class LoginForm {

    public static void main(String[] args) {
        LoginApplication.launch(LoginApplication.class, args);
    }

}
方法“launch”不返回应用程序的实例。有没有办法可以获取该实例?

你有谷歌过吗?http://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html - Dici
@Dici 你是什么意思? - user2997204
1
@Dici 为什么他们不能让它返回一个实例呢? - user2997204
2
如果我没记错,Launch 只有在应用程序关闭时才会返回,因此返回一个新实例也无济于事。 - tomsontom
我找到了这个技巧,虽然它并没有回答问题,但可能有助于找到解决方法:https://dev59.com/GmrXa4cB1Zd3GeqPB7Wa - pdem
显示剩余2条评论
1个回答

10

我只是尝试找到一种简单、逻辑的方法来实现这个目标。但我还没有找到。如果有一个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。


我通常会反对使用单例模式,但是除了特殊情况之外,在一个简单的客户端应用程序中,这应该可以正常工作,至少在需要更复杂的解决方案之前。 - Neil
不要使用循环和轮询,我建议使用倒计时门闩。如果您实际上不需要特别“返回”实例,而只是对其进行操作,则更好的方法是在静态字段上设置一个消费者,并使无参数构造函数调用该消费者。然后您就不必等待任何东西了。 - drrob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接