16

我一直在用 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 的更新方法中运行这个新阶段。

欢迎任何建议。谢谢。

4

3 回答 3

30

应用程序不仅仅是一个窗口——它是一个Process. 因此Application#launch(),每个 VM 只允许一个。

如果您想拥有一个新窗口 - 创建一个Stage.

如果您真的想重用anotherApp类,只需将其包装在Platform.runLater()

@Override
public void update(Observable o, Object arg) {
    Platform.runLater(new Runnable() {
       public void run() {             
           new anotherApp().start(new Stage());
       }
    });
}
于 2013-03-28T12:16:47.513 回答
2

我在 Main 类中做了另一个 JFX 类的构造函数,AnotherClass ac = new AnotherClass(); 然后调用了方法ac.start(new Stage);。它对我很好。你可以把它放在 main() 或其他方法中。它可能与 launch(args) 方法所做的相同

于 2018-06-21T17:52:56.453 回答
0


由于使用Application.start(Stage stage)的一个警告,想要提供第二个答案。

在 init 方法返回后调用 start 方法

如果您的 JavaFX 应用程序具有 Override 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();
        }

    });
于 2018-05-10T10:11:40.907 回答