JavaFX的推出另一个应用程序(JavaFX launch another application

2019-07-28 01:24发布

我一直在砸我的头使用JavaFX ...

这适用于当没有运行的应用程序的实例:

public class Runner {

    public static void main(String[] args) {
        anotherApp app = new anotherApp();
        new Thread(app).start();
    }
 }

public class anotherApp extends Application implements Runnable {

    @Override
    public void start(Stage stage) {
    }

    @Override
    public void run(){
        launch();
    }
}

但是,如果我做new Thread(app).start()其他应用程序 ,我得到一个例外,说明我不能做了两次发射。

另外我的方法是通过这样的其他应用程序的观察员呼吁:

@Override
public void update(Observable o, Object arg) {
    // new anotherApp().start(new Stage());
            /* Not on FX application thread; exception */

    // new Thread(new anotherApp()).start();
            /* java.lang.IllegalStateException: Application launch must not be called more than once */
}

这是一个JavaFX类如这个范围内:

public class Runner extends Applications implements Observer {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage){
    //...code...//
    }
    //...methods..//
    //...methods..//

    @Override
    public void update(Observable o, Object arg) {
    //the code posted above//
    }
}

我尝试使用ObjectProperties与听众,但没有奏效。 我需要从java.util.observer以某种方式更新方法内运行的新阶段。

任何建议都欢迎。 谢谢。

Answer 1:

应用不仅仅是一个窗口-这是一个Process 。 因此,只有一个Application#launch()每个虚拟机是允许的。

如果你想有一个新的窗口-创建一个Stage

如果你真的想重用anotherApp类,只是把它包在Platform.runLater()

@Override
public void update(Observable o, Object arg) {
    Platform.runLater(new Runnable() {
       public void run() {             
           new anotherApp().start(new Stage());
       }
    });
}


Answer 2:

我做了主类另一个JFX类的构造函数AnotherClass ac = new AnotherClass(); 然后调用的方法ac.start(new Stage); 。 它的工作我的罚款。 U可以把它无论是在主()中或在另一种方法。 它可能不会推出(args)方法做同样的事情



Answer 3:

想提供,因为使用的一个警告的第二个答案
Application.start(阶段阶段)。

启动方法被调用init方法返回之后

如果您的JavaFX应用程序具有覆盖Application.init(),那么代码永远不会执行。 无论是你在第二个应用程序的主要方法有任何代码。

另一个开始第二JavaFX应用程序的方法是使用的ProcessBuilder API来启动一个新的进程。

    final String javaHome = System.getProperty("java.home");
    final String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
    final String classpath = System.getProperty("java.class.path");
    final Class<TestApplication2> klass = TestApplication2.class;
    final String className = klass.getCanonicalName();
    final ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath, className);

    final Button button = new Button("Launch");
    button.setOnAction(event -> {

        try {
            Process process = builder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

    });


文章来源: JavaFX launch another application