Lancer l'application JavaFX à partir d'une autre classe
J'ai besoin de démarrer une Application javafx à partir d'une autre classe "conteneur" et d'appeler des fonctions sur l'Application, mais il ne semble pas y avoir de moyen de mettre la main sur une référence à l'Application qui a commencé à utiliser l'Application.méthode launch (). Est-ce possible? Merci
4 answers
J'ai eu le même problème que celui-ci et je l'ai contourné en utilisant ce hack:
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);
}
}
Puis la classe à partir de laquelle vous lancez l'application:
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();
}
}
J'espère que cela vous aide.
Supposons que ce soit notre classe 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();
}
}
Ensuite, nous pouvons le lancer à partir d'une autre classe comme celle-ci:
import javafx.application.Application;
public class Main {
public static void main(String[] args) {
Application.launch(OKButton.class, args);
}
}
Les façons ci-dessus d'appeler une autre classe javafx à partir d'une autre fonctionnent parfois. Lutter pour trouver un moyen ultime de le faire m'a amené à la promenade suivante:
Supposons que ce soit la classe javafx qui exteds l'application que nous souhaitons montrer à partir d'une classe différente, alors nous devrions ajouter les lignes suivantes
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.....
// ......
}
}
Et maintenant, de l'autre endroit dans le projet, afin d'ouvrir la fenêtre que la classe ci-dessus crée faire ce qui suit:
// Suppose we want to do it with a button clicked:
btn1.setOnAction(new EventHandler<ActionEvent>() {
@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
Je ne sais pas ce que vous essayez de réaliser, mais notez que vous pouvez par exemple appeler à partir d'une autre classe Application.launch
pour démarrer le thread d'application JavaFX et Platform.exit
pour l'arrêter.