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
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.
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.
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
Wie rufst du 'Application.launch()' von einer anderen Klasse? Ich bekomme 'class [myclass] ist keine Unterklasse von javafx.application.Application' Fehler – jdurston
@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
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);
}
}
hat nicht für mich gearbeitet. gibt "Fehler beim Erstellen der Anwendung" aus –
@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
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? –
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
- 1. QTimer von einer anderen Klasse starten
- 2. Starten von WxPython und Erweitern einer anderen Klasse
- 3. Starten einer Klasse aus einer separaten Klasse
- 4. Rückrufe von einer anderen Klasse
- 5. Starten zu einer anderen Anwendung
- 6. Aufruf einer Klassenfunktion von einer anderen Klasse
- 7. C# Klasse ID von einer Klasse zu einer anderen hinzufügen
- 8. Getter von einer anderen Klasse in einer Klasse aufrufen
- 9. Zugriff auf Instanzvariablen von einer Klasse innerhalb einer anderen Klasse
- 10. getResource() einer anderen Klasse
- 11. Beenden einer Aktivität aus einer anderen Klasse
- 12. Fehler beim Starten einer anderen Aktivität
- 13. Klasse innerhalb einer anderen Klasse in C#
- 14. Xcode NSMutableArray von einer Klasse zur anderen
- 15. TestNG-Test von einer anderen Klasse ausführen
- 16. Zugriff auf Listbox von einer anderen Klasse?
- 17. Fragment erhalten Variablenwert von einer anderen Klasse
- 18. Öffentliche Variable von einer anderen Klasse abrufen
- 19. erhalten den Wert von einer anderen Klasse
- 20. Zugriff IBOutlet von einer anderen Klasse
- 21. Übergeordnete Funktion von einer anderen Klasse
- 22. Anruf AsyncTask von einer anderen Klasse
- 23. accesing Methode einer anderen Klasse von Vektor
- 24. eine IBOutlet von einer anderen Klasse schnellen
- 25. ObservableCollection von einer anderen Klasse aktualisieren
- 26. Access Enum von einer anderen Klasse
- 27. Wie ein IBOutlet von einer anderen Klasse
- 28. Zugriff auf Variable von einer anderen Klasse
- 29. Abrufen von Zeichenfolgenwerten aus einer anderen Klasse
- 30. reloadData Methode nicht von einer anderen Klasse
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
@Oli, können Sie ein Beispiel für diese andere Art, es zu tun, posten? Ich habe derzeit das gleiche Problem. –