Aus einer normalen Java Klasse eine FXML-Klasse laden

Jose05

Aktives Mitglied
Hallo,
ich möchte aus einer ganz normalen Java Klasse eine JavaFXML-GUI laden. Könnte mir jemand helfen?
Danke schonmal!
Code:
public class Main
{
    public static void main(String[] args)
    {
        new WillkommenFenster(); //Das funktioniert bei mir nicht.
    }
}
Java:
public class WillkommenFenster extends Application
{
    @Override
    public void start(Stage stage) throws IOException
    {
        FXMLLoader fxmlLoader = new FXMLLoader(WillkommenFenster.class.getResource("WillkommenFXML.fxml"));
        Scene scene = new Scene(fxmlLoader.load(), 320, 240);
        stage.setTitle("Hello!");
        stage.setScene(scene);
        stage.show();
        System.out.println("Hallo");
    }
}
 

M.L.

Top Contributor
Zumindest bei der Code-Standardvorgabe (schliesst Erweiterungen nicht aus) findet sich in der main-Methode der Code
Java:
 ..
...args) {
        launch();
    }
 

KonradN

Super-Moderator
Mitarbeiter
new WillkommenFenster(); //Das funktioniert bei mir nicht.
Das funktioniert schon - nur eben macht das halt nicht wirklich etwas. Du hast dann halt eine neue Instanz vom Typ WillkommenFenster. Aber das ist ja nichts, das Du sehen kannst.

Wenn Du eine JavaFX Anwendung hast, dann musst Du natürlich erst einmal alles initialisieren, das da notwendig ist. Dann muss ein Fenster erstellt werden und das musst Du dann füllen.

Wie @M.L. schon gesagt hat: Eine Möglichkeit ist die launch Methode. Diese macht diesbezüglich einiges. Es wird einiges initialisiert (damit das mit den Fenstern funktioniert braucht man eine Schleife, die dann halt Events abarbeitet und so) und dann ein Fenster (das ist die Klasse Stage) erzeugt. Und Application hat da ein paar Methoden, die aufgerufen werden, die man da überschreiben könnte.

Das kann man aber auch manuell machen. Wie das aussehen könnte sieht man dann z.B. in der Dokumentation von Oracle wenn man sich anschaut, wie JavaFX in einer Swing Anwendung integriert werden kann:

Da sieht man dann halt, dass da eine Scene erstellt und gefüllt wird. Wichtig ist: Das alles findet bereits in einem JavaFX psezifischen Event statt - dazu sorgt das Plattform.runLater.
 

KonradN

Super-Moderator
Mitarbeiter
Das Beispiel ist evtl. noch nicht so gut gewählt, da wir dort ja eine swing Anwendung und ein JFXPanel haben. Wenn das nicht gegeben ist, dann ist ein Platform.startup Aufruf wichtig und notwendig!

Die Dokumentation der Platform Klasse ist da eindeutig:

a) startup
This method starts the JavaFX runtime. The specified Runnable will then be called on the JavaFX Application Thread. In general it is not necessary to explicitly call this method, since it is invoked as a consequence of how most JavaFX applications are built. However there are valid use cases for calling this method directly. Because this method starts the JavaFX runtime, there is not yet any JavaFX Application Thread, so it is normal that this method is called directly on the main thread of the application.
This method may or may not return to the caller before the run method of the specified Runnable has been called. In any case, once this method returns, you may call runLater(Runnable) with additional Runnables. Those Runnables will be called, also on the JavaFX Application Thread, after the Runnable passed into this method has been called.
Also nicht aufzurufen, wenn man eine normale JavaFX Anwendung hat, die ja mittels launch() gestartet wird. Aber ansonsten ist es halt notwendig, ehe ein runLater aufgerufen wird. Aber nach dem Aufruf ist es dann sicher möglich. runLater zu nutzen.

b) runLater
This method must not be called before the FX runtime has been initialized. For standard JavaFX applications that extend Application, and use either the Java launcher or one of the launch methods in the Application class to launch the application, the FX runtime is initialized by the launcher before the Application class is loaded. For Swing applications that use JFXPanel to display FX content, the FX runtime is initialized when the first JFXPanel instance is constructed. For SWT application that use FXCanvas to display FX content, the FX runtime is initialized when the first FXCanvas instance is constructed. For applications that do not follow any of these approaches, then it is necessary to manually start the JavaFX runtime by calling startup(Runnable) once.
Also wenn man keine JavaFX Anwendung per launch startet und auch keine swing Anwendung mit JFXPanel hat (und auch kein SWT - das haben wir bsiher nicht betrachtet und lassen es jetzt auch), dann ist eben der Aufruf von startup notwendig!
 

M.L.

Top Contributor
Teil II: eine kleine Modifikation der Vorgabe (IntelliJ+JavaFX, anlegen von Main.java, auskommentieren der Main-Methode in HelloApplication.java, manuelles Einstellen der Configuration) und etwas Experimentieren führt zu folgendem Ergebnis:
IntelliJ_Main.JPG
 

KonradN

Super-Moderator
Mitarbeiter
Jetzt wäre interessant, was Du in der HelloApplication gemacht hast. Wenn kein launch, dann vermutlich Platform.startup und einfach eine Stage erstellt?
 

KonradN

Super-Moderator
Mitarbeiter
Nur um das selbst einmal zu zeigen: Es reicht also etwas aus wie:
Java:
    public static void startup() {
        Stage primaryStage = new Stage();
        try {
            Parent root = FXMLLoader.load(JavaFXApp.class.getResource("test.fxml"));

            primaryStage.setTitle("FXML Welcome");
            primaryStage.setScene(new Scene(root, 300, 275));
            primaryStage.show();
        } catch (IOException ex) {
            logger.error("IOException!", ex);
        }
    }

das dann gestartet wird mit Platform.startup(() -> startup());

Wichtig ist: Das geht nur, wenn wirklich noch nicht initialisiert wurde. Wenn JavaFX schon initialisiert wurde, dann wäre es ein Platform.runLater Aufruf.
 

Jose05

Aktives Mitglied
... vielleicht sollte ich auch mal erzählen, wieso ich eigentlich frage:
Ich will mit JavaFx ein kleines TicTacToe Spiel programmieren. Ich will die GUI von der Logik trennen, um die Logik z. B. nochmal in einer Android App zu verwenden. Da ich mehrere Fenster erzeugen möchte, zunächst soll eine GUI erzeugt werden in der die Spieler die Namen eingeben können, danach wird die eigentliche 3x3 Matrix eingeblendet, danach wenn das Spiel zu Ende ist, ein Fenster, in dem die Spieler gefragt werden, ob sie nochmal spielen wollen, dachte ich es sei sinnvoll das ganze Spiel aus der Logik Klasse zu "steuern". Wenn die erste FXML GUI aufgerufen ist, rufen die Fenster sich gegenseitig auf, es muss nur das erste Fenster aus der Logik Klasse gestartet werden. Würdet ihr das auch so machen?
 

KonradN

Super-Moderator
Mitarbeiter
Dann machst Du aber dennoch ein ganz normales JavaFX Programm, d.h. Du hast eine Klasse, die von Application erbt und in der wird launch aufgerufen.

Und die Trennung macht Sinn, dabei aber aufpassen - dass Fenster sich gegenseitig aufrufen sollte man nicht unbedingt machen. Gegenseitige Abhängigkeiten sind nicht gut. Und Du willst Du eine separate Logik haben - die weiss dann doch, was gerade angezeigt werden soll und bekommt Eingaben. Da wäre dann so etwas zu entscheiden. Ein Fenster dient nur dazu, Dinge anzuzeigen und Eingaben entgegen zu nehmen.
 

KonradN

Super-Moderator
Mitarbeiter
Also ein Beispielprojekt mit mehreren Fenstern und so hat direkt einen entsprechenden Umfang. Sowas baut man nicht mal eben in 5 Minuten.

Schau Dir einmal die Pattern an, die es in der UI Entwicklung gibt. MVC und MVVM. Wobei ich zu MVVM raten würde. Da dürftest Du einiges finden. Startpunkt ist dann MVVMfx. Da findest Du extrem viele Links zu Dokumentation rund um das Pattern und auch einige Beispiele.

Und evtl. auch das, was Du machst, aus Sicht des Anwenders überdenken: Was für ein Verhalten willst Du programmieren? Ist das denn das Verhalten, das ein Anwender erwartet? Fenster die sich schließen und ständig neue Fenster, die aufgehen ist aus meiner Sicht eher unüblich. Das kenne ich so eigentlich nicht. Die einzige Applikation, die sowas macht, ist IntelliJ mit dem Startfenster. Das ist aber per Default auch nur beim ersten Start sichtbar - danach wird immer direkt das Hauptfenster geöffnet mit dem letzten Projekt. Da ist das eine Lösung, da es kein Projektfenster ohne Projekt gibt.

Es ist also eher üblich, ein Fenster zu öffnen und dieses dann immer zu nutzen. Und man kann dann noch zusätzlich Popups haben, also z.B. ein Fenster zum Login wenn der notwendig ist oder so. Da also ggf. einmal die diverse Software, die Du so nutzt, anschauen.

(Früher gab es auch Guides bei fast jeder Plattform, wie eine Anwendung sich verhalten sollte. Aber aktuell kenne ich sowas nicht mehr. Aber mal nach UI/UX Design suchen. Denn das ist natürlich weiterhin ein aktuelles Thema und das ist extrem wichtig. So haben viele Projekte auch direkt ein UI/UX Designer für das Frontend. Da kommen halt auch sehr viele Themen rein wie Barrierefreiheit und so.)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
@SupressWarnings() JavaFX Auf den Controller einer ListCell zugreifen AWT, Swing, JavaFX & SWT 4
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J Searchfunktion auf einer MS Access Datenbank AWT, Swing, JavaFX & SWT 7
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
M Inhalte einer FlowPane AWT, Swing, JavaFX & SWT 4
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
K JavaFX ViewTable mit einer LinkedList befüllen AWT, Swing, JavaFX & SWT 3
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
MiMa Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
D JavaFX Einbinden einer .fxml AWT, Swing, JavaFX & SWT 1
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
A Prüfung einer Eingabe auf Gleitkommazahl AWT, Swing, JavaFX & SWT 5
J Suchmaschine einer Datenbank AWT, Swing, JavaFX & SWT 5
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M Auswahl aus einer ListView AWT, Swing, JavaFX & SWT 3
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
C JavaFX Tief setzen in der Überschrift einer Tabellenspalte AWT, Swing, JavaFX & SWT 3
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19
M Ausgabe der HSL oder RGB Zusammensetzung einer Farbe (JColorChooser AWT, Swing, JavaFX & SWT 1
X Zeilen aus einer Textdatei einzelnd als String abrufen AWT, Swing, JavaFX & SWT 8
R JavaFX Wert einer ChoiceBox bekommen ohne Lambdas AWT, Swing, JavaFX & SWT 11
W Swing bzgl. Tableskalierung/Darstellung einer Matrix AWT, Swing, JavaFX & SWT 8
F JavaFX ChoiceBox Name als Auswahl bei einer Objektliste AWT, Swing, JavaFX & SWT 4
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
7 JavaFX Verwendung einer ResizableCanvas-Klasse in fxml-Datei AWT, Swing, JavaFX & SWT 3
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben