2013-03-27 17 views
9

Ich habe meinen Kopf mit JavaFx worden Zerschlagung ...JavaFX starten eine andere Anwendung

Diese für funktioniert, wenn keine Instanzen einer Anwendung läuft es:

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(); 
    } 
} 

Aber wenn ich new Thread(app).start()innerhalb Eine andere Anwendung Ich bekomme eine Ausnahme, die besagt, dass ich nicht zwei Starts machen kann.

Auch meine Methode durch einen Beobachter auf der anderen Anwendung wie folgt aufgerufen wird:

innerhalb einer JavaFX-Klasse wie diese
@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 */ 
} 

Es ist:

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// 
    } 
} 

versuchte ich ObjectProperties mit Hörer verwenden, aber es hat nicht funktioniert. Ich muss diese neue Stufe von der update-Methode von java.util.observer in irgendeiner Weise ausführen.

Alle Vorschläge sind willkommen. Vielen Dank.

+1

Ist nur Ihre Absicht, ein nother Fenster zu öffnen? Wenn ja, können Sie eine neue "Bühne" im UI-Thread erstellen: "final Stage stage = new Stage(); stage.setScene (yourScene); stage.show(); ' – Vertex

+0

Ja, ich möchte ein anderes Fenster öffnen (Anwendung in einer anderen Klasse), aber ich muss es innerhalb der Update-Methode von java.util.observer tun, nicht vom UI-Thread. –

+1

Sie können eine Menge Code im UI-Thread ausführen, indem Sie die Methode 'runLater' aufrufen:' Platform.runLater (neu Runnable() {@Override public void run() {// wird im UI-Thread ausgeführt}}); ' Sie können es also innerhalb der 'update' Methode aufrufen. – Vertex

Antwort

22

Anwendung ist nicht nur ein Fenster - es ist ein Process. Somit ist nur eine Application#launch() pro VM erlaubt.

Wenn Sie ein neues Fenster haben möchten - erstellen Sie eine Stage.

Wenn Sie wirklich anotherApp Klasse wiederverwenden möchten, wickeln Sie es nur in Platform.runLater()

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

Ok. Es funktionierte! für jetzt aber .., Die Dokumentation sagt "läuft zu einer unbestimmten Zeit in der Zukunft". Was bedeutet das? Dass es in einigen Fällen 10 Minuten später oder so etwas laufen könnte? Wovon hängt die unbestimmte Zeit ab? Vielen Dank. –

+0

Sie können erwarten, dass es sofort passiert. Wenn Sie nicht 100500 solcher Anrufe gleichzeitig machen, werden sie in Sekundenbruchteilen ausgeführt. –

+0

Perfekt, danke. –

Verwandte Themen