2014-09-16 3 views
12

Мне нужно запустить приложение javafx из другого класса «контейнера» и вызвать функции в приложении, но, похоже, не существует способа получить ссылку на приложение, запущенное с использованием метод Application.launch(). Это возможно? Запуск приложения JavaFX из другого класса

ответ

10

У меня была такая же проблема, как это и есть вокруг него с помощью этого хака:

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

Надежда, которая помогает вам.

+0

Спасибо, что работает хорошо. Я также нашел другой способ сделать это. Если вы запускаете одно приложение, вы можете загружать в него этапы из любого места в базе кода, пока вы добавляете сцену в поток приложений. Вы можете использовать Platform.runLater() для этого. – Oli

+0

@ Oli, можете ли вы опубликовать пример этого другого способа сделать это? В настоящее время у меня такая же проблема. –

0

Я не уверен, чего вы пытаетесь достичь, но обратите внимание, что вы можете, например, позвонить из другого класса Application.launch, чтобы запустить поток приложений JavaFX и Platform.exit, чтобы остановить его.

+4

Спасибо, но Application.launch() является проблемой. Он создает мое приложение для меня, но не возвращает ссылку на него или не позволяет передать какой-либо объект конструктору приложения! Есть ли другой способ получить построенное приложение после запуска? – Oli

+0

Как вы называете 'Application.launch()' из другого класса? Я получаю 'class [myclass] не подкласс javafx.application.Application' error – jdurston

+1

@JohnADurston Метод перегружен. Используйте эту версию: https://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html#launch-java.lang.Class-java.lang.String...- – Puce

30

Пусть это наш 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); 
    } 
} 
+0

не работал для меня. возвращает ошибку «Не удалось построить приложение» –

+2

@RezwanAzfarHaleem. Задайте новый вопрос с информацией о вашей проблеме. Я смог запустить этот код без ошибок в Eclipse Neon и Java 8 на недавно установленной машине Windows 10. Единственным дополнительным шагом, который я должен был предпринять, было добавить новое программное обеспечение от Neon - http://download.eclipse.org/releases/neon и фильтр для fx и установить инструменты IDE общего назначения. – ThisClark

+0

Жаль, что это сработало для меня сейчас. Моя проблема заключалась в том, что я поместил OKButton в тот же класс, что и Main. Есть ли какая-то особая причина, почему это происходит? –

1

Вышеуказанные способы вызова другого класса JavaFX от другого иногда работают. Пытаясь найти лучший способ сделать это привело меня к следующей прогулке вокруг:

Пусть это класс JavaFX, что exteds приложения мы хотим показать, из другого класса, то мы должны добавить следующие строки

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

} 

А теперь из другого места в проекте, для того, чтобы открыть окно , что выше класс создает сделать следующее:

// 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 
Смежные вопросы