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() 内で実行すると、2回の起動を実行できないという例外が発生します。

また、私のメソッドは、次のような他のアプリケーションのオブザーバーによって呼び出されます。

@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のupdateメソッド内からこの新しいステージを実行する必要があります。

どんな提案も歓迎します。ありがとう。

4

3 に答える 3

30

アプリケーションは単なるウィンドウではありません-それはProcessです。したがって、Application#launch()VMごとに許可されるのは1つだけです。

新しいウィンドウが必要な場合は、を作成し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);。それは私にうまくいきました。Uはそれをmain()または別のメソッドのいずれかに置くことができます。それはおそらくlaunch(args)メソッドが行うのと同じことをします

于 2018-06-21T17:52:56.453 に答える
0


Application.start(ステージステージ)を使用する際の注意点が1つあるため、2番目の回答を提供したかった。

startメソッドは、initメソッドが戻った後に呼び出されます

JavaFXアプリケーションにOverrideApplication.init()がある場合、そのコードは実行されません。2番目のアプリケーションのmainメソッドにあるコードもありません。

2番目のJavaFXアプリケーションを開始する別の方法は、ProcessBuilderAPIを使用して新しいプロセスを開始することです。

    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 に答える