Je dois démarrer une application javafx à partir d'une autre classe "conteneur" et appeler des fonctions sur l'application, mais il ne semble pas y avoir de moyen d'obtenir une référence à l'application démarrée avec la méthode Application.launch (). Est-ce possible? Merci
J'ai eu le même problème que cela 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);
}
}
et ensuite 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 ça vous aide.
Supposons qu'il s'agit de 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);
}
}
Lancer JavaFX dans une autre classe en utilisant Button:
class Main extends Application{
public void start(Stage s)throws Exception{
event();
s.show();
}
public void event(){
btn.setOnAction(new EventHandler<ActionEvent>(){
public void handle(ActionEvent ae){
Stage s = new Stage();
new SubClassName().start(s);
}
});
}
public static void main(String[] args) {
launch(args);
}
}
class SubClassName{
public void start(Stage s){
Pane pane = new Pane();
Scene addFrame = new Scene(pane,280,450);
s.setScene(addFrame);
s.show();
}
}
Les méthodes ci-dessus d'invocation d'une autre classe javafx à partir d'une autre fonctionnent parfois. Se battre pour trouver un moyen ultime de le faire m'a amené à la promenade suivante:
Supposons que c’est la classe javafx que extendons 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 du projet, pour ouvrir la fenêtre Créée par la classe ci-dessus, procédez comme 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 trop ce que vous essayez d'atteindre, mais sachez que vous pouvez par exemple appeler d'une autre classe Application.launch
pour démarrer le thread JavaFX Application et Platform.exit
pour l'arrêter.