Uruchom aplikację JavaFX z innej klasy

Muszę uruchomić aplikację javafx z innej klasy "container" i wywołać funkcje w aplikacji, ale wydaje się, że nie ma sposobu na uzyskanie odniesienia do aplikacji, która rozpoczęła korzystanie z aplikacji.metoda launch (). Czy to możliwe? Dzięki

 15
Author: Oli, 2014-09-16

4 answers

Miałem ten sam problem i obejrzałem go używając tego hacka:

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

A następnie klasa, z której uruchamiasz aplikację:

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();
    }
}
Mam nadzieję, że to ci pomoże.
 16
Author: Boomah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-18 10:11:05

Załóżmy, że jest to nasza klasa 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();
    }
}

Następnie możemy uruchomić go z innej klasy, takiej jak Ta:

import javafx.application.Application;

public class Main {
    public static void main(String[] args) {
        Application.launch(OKButton.class, args);
    }
}
 33
Author: ThisClark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-23 02:30:21

Powyższe sposoby wywoływania innych klas javafx z innych czasami działają. Walka o znalezienie ostatecznego sposobu na zrobienie tego doprowadziła mnie do następującego spaceru:

Załóżmy, że jest to klasa javafx, która extenduje aplikację, którą chcemy pokazać z innej klasy, wtedy powinniśmy dodać następujące linie

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

}

A teraz z drugiego miejsca w projekcie, aby otworzyć okno że powyższa Klasa tworzy:

    // 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
Author: such_ke_nasdeeq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-27 17:18:54

Nie jestem pewien, co próbujesz osiągnąć, ale zauważ, że możesz np. wywołać z innej klasy Application.launch, aby uruchomić wątek aplikacji JavaFX i Platform.exit, aby go zatrzymać.

 0
Author: Puce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-16 16:46:31