在javafx中获取应用程序实例

时间:2014-12-26 03:22:03

标签: java javafx

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

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

public class LoginForm {

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

}

方法启动不会返回应用程序实例。 有没有办法让我得到实例?

2 个答案:

答案 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);
    }
}