【问题标题】:Getting application instance in javafx在 javafx 中获取应用程序实例
【发布时间】:2015-02-23 11:50:04
【问题描述】:

使用 javafx 时如何获取应用实例?

通常您以这种方式启动应用程序:

public class LoginForm {

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

}

方法启动不返回应用程序的实例。 有没有办法获取实例?

【问题讨论】:

  • @Dici 你什么意思?
  • 您需要的一切都在文档中。您的主类只需要扩展Application,然后您的主方法将调用launch 方法。实际上,运行 JavaFX 应用程序甚至不需要 main 方法
  • @Dici 为什么他们不能让它返回一个实例..
  • IIRC Launch 仅在应用程序关闭时返回,因此返回一个新实例无论如何都对您没有帮助

标签: java javafx


【解决方案1】:

我只是想找到一种简单、合乎逻辑的方法来做到这一点。我没有。如果有一个 Application.getApplicationFor(AppClass.class) 可以为你管理一些单例,那就太好了——但没有。

如果我们限制问题空间,则很容易解决。如果我们将类设为单例,那就很简单了……简化的单例模式应该可以正常工作:

class MyApp extends Application
{           
    public static MyApp me;
    public MyApp()
    {
        me=this;
    }

    ... 
}

如果尚未被系统实例化,则 me 可以为 null。使用更多代码可以防止这种情况发生。

...实现代码...

刚刚实现了这个——似乎可以工作(除非有任何奇怪的线程情况) 我的情况略有不同,我将 javaFX 屏幕嵌入到现有的 swing GUI 中。它工作正常,但我需要确保 Application.launch 只被调用一次。添加此要求,我的最终解决方案是:

(抱歉,语法有一些时髦,任何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 被准确地调用一次。

【讨论】:

  • 我通常会反对使用单例,但除了无关的情况,对于一个简单的客户端应用程序,这应该可以正常工作,至少在需要更复杂的解决方案之前。
  • 我建议使用倒计时锁,而不是循环和轮询。如果您实际上不需要专门 return 实例而只是对其采取行动,那么最好在静态字段上设置使用者并让无参数构造函数调用使用者。那么你就不必等待任何事情了。
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多