Avvia l’applicazione JavaFX da un’altra class

Ho bisogno di avviare un’applicazione javafx da un’altra class “contenitore” e chiamare le funzioni sull’applicazione, ma non sembra esserci alcun modo per ottenere un riferimento all’applicazione avviata usando il metodo Application.launch (). È ansible? Grazie

Ho avuto lo stesso problema di questo e l’ho aggirato usando questo trucco:

import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import java.util.concurrent.CountDownLatch; public class StartUpTest extends Application { public static final CountDownLatch latch = new CountDownLatch(1); public static StartUpTest startUpTest = null; public static StartUpTest waitForStartUpTest() { try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } return startUpTest; } public static void setStartUpTest(StartUpTest startUpTest0) { startUpTest = startUpTest0; latch.countDown(); } public StartUpTest() { setStartUpTest(this); } public void printSomething() { System.out.println("You called a method on the application"); } @Override public void start(Stage stage) throws Exception { BorderPane pane = new BorderPane(); Scene scene = new Scene(pane, 500, 500); stage.setScene(scene); Label label = new Label("Hello"); pane.setCenter(label); stage.show(); } public static void main(String[] args) { Application.launch(args); } } 

e quindi la class che stai lanciando l’applicazione da:

 public class StartUpStartUpTest { public static void main(String[] args) { new Thread() { @Override public void run() { javafx.application.Application.launch(StartUpTest.class); } }.start(); StartUpTest startUpTest = StartUpTest.waitForStartUpTest(); startUpTest.printSomething(); } } 

Spero che ti aiuti.

Supponiamo che questa sia la nostra class JavaFX:

 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.stage.Stage; public class OKButton extends Application { @Override public void start(Stage stage) { Button btn = new Button("OK"); Scene scene = new Scene(btn, 200, 250); stage.setTitle("OK"); stage.setScene(scene); stage.show(); } } 

Quindi potremmo avviarlo da un’altra class come questa:

 import javafx.application.Application; public class Main { public static void main(String[] args) { Application.launch(OKButton.class, args); } } 

A volte funzionano i modi di invocare altre classi javafx da un’altra. Lottando per trovare il modo migliore per farlo, mi sono portato alla seguente passeggiata:

Supponiamo che questa sia la class javafx che ha escluso l’applicazione che desideriamo mostrare da una class diversa, quindi dovremmo aggiungere le seguenti righe

 class ClassToCall extends Application{ //Create a class field of type Shape preferably static... static Stage classStage = new Stage(); @Override public void start(Stage primaryStage){ // Assign the class's stage object to // the method's local Stage object: classStage = primaryStage ; // Here comes some more code that creates a nice GUI..... // ...... } } 

E ora dall’altra parte del progetto, per aprire la finestra creata dalla class precedente, procedi come segue:

  // Suppose we want to do it with a button clicked: btn1.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { //create an object of the class you wish to invoke its //start() method: ClassToCall ctc = new ClassToCall(); // Then call its start() method in the following way: ctc.start(ClassToCall.classStage); }// End handle(ActionEvent event) });// End anonymous class 

Non sono sicuro di cosa stai cercando di ottenere, ma tieni presente che puoi ad esempio chiamare da un’altra class Application.launch per avviare il thread dell’applicazione JavaFX e Platform.exit per interromperlo.