web-dev-qa-db-fra.com

Lancer l'application JavaFX à partir d'une autre classe

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

19
Oli

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.

19
Boomah

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);
    }
}
36
ThisClark

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

 }

}
1
Maker

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
1
such_ke_nasdeeq

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.

0
Puce