JavaFX lanza otra aplicación

He estado rompiendo mi cabeza con JavaFx …

Esto funciona cuando no hay instancias de una aplicación en ejecución:

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

Pero si realizo un new Thread(app).start() dentro de otra aplicación, recibo una excepción que indica que no puedo hacer dos lanzamientos.

También mi método es llamado por un observador en la otra aplicación como esta:

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

Está dentro de una clase JavaFX como esta:

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

Intenté usar ObjectProperties con oyentes, pero no funcionó. Necesito que esta nueva etapa se ejecute desde el método de actualización de java.util.observer de alguna manera.

Cualquier sugerencia es bienvenida. Gracias.

La aplicación no es solo una ventana, es un Process . Por lo tanto, solo se permite un Application#launch() por máquina virtual.

Si quieres tener una nueva ventana, crea un Stage .

Si realmente quieres reutilizar otra clase de aplicaciones, simplemente envuélvela en Platform.runLater()

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

Hice un constructor de otra clase JFX en la clase principal AnotherClass ac = new AnotherClass(); y luego llamó al método ac.start(new Stage); . me funcionó bien U puede ponerlo en main () o en otro método. Probablemente haga lo mismo que hace el método de lanzamiento (args)

Quería proporcionar una segunda respuesta debido a una advertencia de usar
Application.start (Etapa de la etapa).

El método de inicio se llama después de que el método init haya regresado

Si su aplicación JavaFX tiene Override Application.init (), entonces ese código nunca se ejecutará. Tampoco es ningún código que tenga en el segundo método principal de la aplicación.

Otra forma de iniciar una segunda aplicación JavaFX es usar la API de ProcessBuilder para comenzar un nuevo proceso.

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