2014-09-16 18 views
12

Ich muss eine javafx-Anwendung aus einer anderen "Container" -Klasse starten und Funktionen auf der Anwendung aufrufen, aber es scheint keine Möglichkeit zu geben, einen Verweis auf die Anwendung zu erhalten die Application.launch() -Methode. Ist das möglich? DankeJavaFX-Anwendung von einer anderen Klasse starten

Antwort

10

hatte ich das gleiche Problem wie dieses und bekam Runde es diesen 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); 
    } 
} 

und dann die Klasse, die Sie aus der Anwendung starten:

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

Hoffnung, das Ihnen hilft.

+0

Danke, dass funktioniert gut. Ich habe auch einen anderen Weg gefunden, es zu tun. Wenn Sie eine Anwendung starten, können Sie Stufen von überall in Ihre Codebasis laden, solange Sie die Stufe im Anwendungsthread hinzufügen. Sie können dafür Platform.runLater() verwenden. – Oli

+0

@Oli, können Sie ein Beispiel für diese andere Art, es zu tun, posten? Ich habe derzeit das gleiche Problem. –

0

Ich bin mir nicht sicher, was Sie erreichen möchten, aber beachten Sie, dass Sie von einer anderen Klasse Application.launch zum Starten des JavaFX-Anwendungs-Thread und Platform.exit aufrufen können, um es zu stoppen.

+4

Danke, aber Application.launch() ist. Sie erstellt meine Anwendung für mich, gibt aber keinen Verweis darauf zurück oder erlaubt mir, irgendein Objekt an den Konstruktor der Anwendung zu übergeben! Gibt es eine andere Möglichkeit, die erstellte Anwendung nach dem Start zu erhalten? – Oli

+0

Wie rufst du 'Application.launch()' von einer anderen Klasse? Ich bekomme 'class [myclass] ist keine Unterklasse von javafx.application.Application' Fehler – jdurston

+1

@JohnADurston Die Methode ist überladen. Verwenden Sie diese Version: https://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html#launch-java.lang.Class-java.lang.String...- – Puce

30

Angenommen, dies ist unsere JavaFX Klasse:

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

Dann können wir es aus einer anderen Klasse wie folgt starten:

import javafx.application.Application; 

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

hat nicht für mich gearbeitet. gibt "Fehler beim Erstellen der Anwendung" aus –

+2

@RezwanAzfarHaleem Öffnen Sie eine neue Frage mit Details zu Ihrem Problem. Ich konnte diesen Code fehlerfrei in Eclipse Neon und Java 8 auf einem neu installierten Windows 10-Rechner ausführen. Der einzige zusätzliche Schritt, den ich machen musste, war, neue Software von Neon hinzuzufügen - http://download.eclipse.org/releases/neon und nach fx zu filtern und die IDEs der General Purpose Tools zu installieren. – ThisClark

+0

Tut mir leid, es hat jetzt für mich funktioniert. Mein Problem war, dass ich den OKButton in der gleichen Klasse wie Main platziert habe. Gibt es einen bestimmten Grund, warum das passiert? –

1

Die oben genannten Möglichkeiten der Berufung auf andere javafx Klasse von einer anderen manchmal arbeiten. Struggling einen ultimative Weg zu finden, dies zu tun, brachte mich auf den folgenden Spaziergang um:

Angenommen, dies ist die JavaFX-Klasse, die Anwendung wir exteds wollen von einer anderen Klasse zeigen, dann sollten wir die folgenden Zeilen hinzufügen

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

} 

Und nun von der anderen Stelle im Projekt, um das Fenster zu öffnen, die die obige Klasse der folgenden schafft tun: das Problem

// 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 
Verwandte Themen