从另一个类启动JavaFX应用程序

时间:2014-09-16 16:17:35

标签: javafx-8

我需要从另一个"容器中启动一个javafx应用程序"应用程序上的类和调用函数,但似乎没有任何方法来获取对使用Application.launch()方法启动的应用程序的引用。这可能吗? 感谢

5 个答案:

答案 0 :(得分:39)

假设这是我们的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();
    }
}

然后我们可以从另一个类启动它:

import javafx.application.Application;

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

答案 1 :(得分:19)

我遇到了与此相同的问题并使用此黑客攻击它:

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

然后从您启动应用程序的类:

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

希望对你有所帮助。

答案 2 :(得分:1)

以上调用其他javafx类的方法有时会起作用。为了找到最终的方法而苦苦挣扎,让我走到了下面走来走去:

假设这是我们希望从不同的类中展示的应用程序的javafx类,那么我们应该添加以下行

window.onload = function(){
var ctx = document.getElementById("canvas").getContext("2d");
window.myLine = new Chart(ctx ,{
          type: 'line',
          data: yourData,
          options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true,
                        min: 0,
                        max: 500    
                    }
                  }]
               }
            }
});

现在从项目的其他地方,为了打开窗户 上面的类创建了以下内容:

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

}

答案 3 :(得分:1)

使用Button在其他类中启动JavaFX:

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

 }

}

答案 4 :(得分:0)

我不确定您要尝试实现的目标,但请注意,您可以从另一个类Application.launch调用以启动JavaFX Application线程,并Platform.exit来阻止它