JavaFX - Pane wechseln über 2. Controller

inDex

Mitglied
Hallo zusammen,

bin noch relativ unerfahren mit JavaFX und habe ein Problem welches ich auch nach mehreren Stunden
googeln nicht gelöst bekommen habe, obwohl es eine Kleinigkeit sein muss :D

Ich habe in meiner Szene eine Splitpane, worin in der rechten Seite eine AnchorPane ("outputArea")
ist. Für diese Pane habe ich mehrere FXML Files und jeweils eigene Controller dazu.
Genau diese AnchorPane "outputArea" möchte ich über Buttons in der linken Seite der Splitpane umschalten.
Das funktioniert auch bei allen einwandfrei, aber nicht wenn ich mit einem Button innerhalb einer der versch.
Pages
in der outputArea umschalten will.

Hier der relevante Auszug des Controllers des MainWindows:

[CODE lang="java" title="MainWindowController"]public class ControllerMainWindow {
//** Panes
@FXML
private AnchorPane outputArea;

// ----------ÜBER DIESEN BUTTON FUNKTIONIERT ES!-----
public void stoerungenAction(ActionEvent actionEvent) throws IOException {
//Main.showMainPage();

FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow_MaschinenDaten.fxml"));
Parent outputPage = loader.load();
ControllerPageMaschinendaten controllerPageMaschinendaten = loader.getController();

//Anchorpane anpassen sodass outputPage sich der Größe von Parent anpasst
outputArea.getChildren().removeAll();
outputArea.getChildren().add(outputPage);
AnchorPane.setTopAnchor(outputPage, 0.0);
AnchorPane.setBottomAnchor(outputPage, 0.0);
AnchorPane.setLeftAnchor(outputPage, 0.0);
AnchorPane.setRightAnchor(outputPage, 0.0);

System.out.println("testüberLeiste");
System.out.println(outputArea);
System.out.println(outputPage);
}

public void maschDatenAction(int maschinenID) throws IOException {

FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow_MaschinenDaten.fxml"));
Parent outputPage = loader.load();
ControllerPageMaschinendaten controllerPageMaschinendaten = loader.getController();

//Anchorpane anpassen sodass outputPage sich der Größe von Parent anpasst
outputArea.getChildren().clear();
outputArea.getChildren().add(outputPage);
AnchorPane.setTopAnchor(outputPage, 0.0);
AnchorPane.setBottomAnchor(outputPage, 0.0);
AnchorPane.setLeftAnchor(outputPage, 0.0);
AnchorPane.setRightAnchor(outputPage, 0.0);


System.out.println("test Maschinen ID: " + maschinenID);
System.out.println(outputArea);
System.out.println(outputPage);
//outputArea.getChildren().clear();

//controllerPageMaschinendaten.machiwas();
}
}[/CODE]


Hier der relevante Teil aus dem Controller der geladenen Page in der outputArea:

[CODE lang="java" title="Controller der Unterseite"]public class ControllerPageMaschinenpark {

@FXML
private FlowPane fpMaschinen;

private Button[] btnMaschinen;

public void showMaschinen(){
ArrayList<Maschine> maschinenPark = Main.getMaschinenPark();
int i=1;
int anzMaschinen = Main.getMaschinenPark().size();
btnMaschinen = new Button[anzMaschinen+1];
VBox[] vBoxBtn = new VBox[anzMaschinen+1];
Label[] lblMaschinenID = new Label[anzMaschinen+1];
Label[] lblMaschinenBez = new Label[anzMaschinen+1];
ProgressBar[] prgBarMasch = new ProgressBar[anzMaschinen+1];

...


//Button Action wenn Maschine geklickt wird
for(int j=1; j<= anzMaschinen; j++)
{
btnMaschinen[j].setOnAction(e-> {

String test = ((Button) e.getSource()).getId();
System.out.println(test);

//Controller von MainWindow holen
FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
try {

loader.load();
ControllerMainWindow controllerMainWindow = loader.getController();

String maschinenID = ((Button) e.getSource()).getId();
controllerMainWindow.maschDatenAction(Integer.parseInt(maschinenID));

} catch (IOException ex) {
ex.printStackTrace();
}

});
}

}

}[/CODE]

Hier noch ein Bild des GUI für die verständlichkeit:
Error.PNG

Die Testdaten der Methode "maschDatenAction" werden ausgegeben, das heißt er schafft es bis dorthin.
Nur will die outputArea nicht aktualisiert werden :(
Wenn ich es bspw. über den Button "Störungen" in der Leiste links mache geht es! (selber Code Copy&Paste in ActionEvent Methode).

Ich hoffe jmd sieht den Fehler auf anhieb und kann mir weiterhelfen!
Vielen Dank vorab!
Gruß Simon
 
K

kneitzel

Gast
Das, was Du da machst, macht so doch auch gar keinen Sinn:

Java:
                FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow.fxml"));
                try {

                    loader.load();
                    ControllerMainWindow controllerMainWindow = loader.getController();

                    String maschinenID = ((Button) e.getSource()).getId();
                    controllerMainWindow.maschDatenAction(Integer.parseInt(maschinenID));

                } catch (IOException ex) {
                    ex.printStackTrace();
                }

Du lädst ein neues "MainWindow.fxml". Dabei wird also die ganze Hierarchie an neuen Controls erstellt. Und auch ein Controller. Den Controller lässt Du Dir dann geben und machst etwas damit. Aber das ist ja alles eine ganz neue Instanz (die nicht angezeigt wird, da keine Stage und so).

Das ist also sowas wie: Du hast einen BMW. Da kannst Du auch immer ganz toll etwas in den Kofferraum packen.

Und wenn Du Deinen BMW nicht zur Hand hast, dann kaufst Du Dir einfach einen ganz neuen. Der hat dann auch einen Kofferraum. Und da packst Du dann etwas rein. (Und da Du auf die Instanzen keine Referenz hältst, bedeutet das: Du packst den Schlüssel ins Auto und machst ein Zettel dran: Müllabfuhr: bitte entsorgen!)
Und dann wunderst Du Dich, dass am Ende in Deinem BMW der Inhalt des Kofferraums unverändert ist - Du hast doch in den anderen Kofferraum etwas rein getan!

Also was wäre hier die Lösungsidee? Ganz trivial: Wenn Du im ControllerMainWindow den Inhalt der Seite erzeugst, dann gibst Du dem erzeugten Controller der auch eine Referenz auf den ControllerMainWindow. Dann kannst Du eine Methode aufrufen, die den Inhalt entsprechend tauscht.
Oder um da von der konkreten Implementierung evtl. etwas unabhängiger zu werden: Du machst ein kleines Interface mit der Wechsel-Methode, ControllerMainWindow implementiert dieses Interface und dann will der Controller der Anzeige einfach eine Instanz des Interfaces. Aber das ist von der Funktionalität erst einmal egal.
 

Jw456

Top Contributor
Und wenn Du Deinen BMW nicht zur Hand hast, dann kaufst Du Dir einfach einen ganz neuen. Der hat dann auch einen Kofferraum. Und da packst Du dann etwas rein. (Und da Du auf die Instanzen keine Referenz hältst, bedeutet das: Du packst den Schlüssel ins Auto und machst ein Zettel dran: Müllabfuhr: bitte entsorgen!)
Und dann wunderst Du Dich, dass am Ende in Deinem BMW der Inhalt des Kofferraums unverändert ist - Du hast doch in den anderen Kofferraum etwas rein getan!
der Vergleich ist super 👍
 

inDex

Mitglied
Zuerst einmal Danke für die schnelle Antwort!

Okay das war mir so gar nicht klar :D
Ich dachte mit -> loader.getController(); bekomme ich über das entsprechende FXML den Controller bzw.
die Referenz davon. Das habe ich jetzt soweit verstanden und werde versuchen alles um zu schreiben sodass ich jeweils
nur eine Instanz und die Referenz darauf habe.
Was mir jetzt nicht ganz klar wurde, wie tausche ich die Controller und den Zugriff auf deren Informationen/Methoden
untereinander aus? Ein kleines Code Beispiel würde mir sehr helfen, falls nicht zu viel verlangt 😁
 
K

kneitzel

Gast
Alle Methoden zum Öffnen der jeweiligen Seiten sind im ControllerMainWindow ... Die Methode passt Du so in der Art an:

[CODE lang="java" highlight="11"]public class ControllerMainWindow {

...

public void stoerungenAction(ActionEvent actionEvent) throws IOException {
//Main.showMainPage();

FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow_MaschinenDaten.fxml"));
Parent outputPage = loader.load();
ControllerPageMaschinendaten controllerPageMaschinendaten = loader.getController();
controllerPageMaschinendaten.setControllerMainWindow(this);

//Anchorpane anpassen sodass outputPage sich der Größe von Parent anpasst

...

[/CODE]

Das natürlich bei allen Seitenteilen.

Wenn dann aus dem Seitenteil ein entsprechender Wechsel kommen soll, dann kannst Du controllerMainWindow.stoerungenAction(null) aufrufen.
(Bzw. die Methode umschreiben. Das wäre eher etwas wie:
Java:
    public void stoerungenAction(ActionEvent actionEvent) throws IOException {
        openMaschinenDaten();
    }

    public void openMaschinenDaten() {
        FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindow_MaschinenDaten.fxml"));
        Parent outputPage = loader.load();
        ControllerPageMaschinendaten controllerPageMaschinendaten = loader.getController();
        controllerPageMaschinendaten.setControllerMainWindow(this);
        
        //Anchorpane anpassen sodass outputPage sich der Größe von Parent anpasst

...

Damit das aber funktioniert, musst Du natürlich in den anderen Controllern die instanzvariable mit Setter einfügen:
Java:
    ControllerMainWindow controllerMainWindow;
    
    public void setControllerMainWindow(ControllerMainWindow controllerMainWindow) {
        this.controllerMainWindow = controllerMainWindow;
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
HaukeG JavaFX JavaFX Resize und DragAndDrop eines Pane AWT, Swing, JavaFX & SWT 4
V JavaFX, Pane construktor von einer Klasse in der Main verwenden. AWT, Swing, JavaFX & SWT 4
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 38
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
MiMa JUnit5 im JavaFX Projekt AWT, Swing, JavaFX & SWT 2
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
MiMa SwingFXUtils in JavaFX 20 AWT, Swing, JavaFX & SWT 6
MiMa JavaFX Fenstertitel zu klein. AWT, Swing, JavaFX & SWT 1
MiMa JavaFX JAR unter Windows ausführen schlägt fehl? AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
Hatsi09 Javafx Neuladen von ImageView und MediaView AWT, Swing, JavaFX & SWT 3
Maxim6394 JavaFX Umlaute in JavaFX GUI AWT, Swing, JavaFX & SWT 12
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
JavaSchmecktLecker JavaFX JavaFX Ordner automatisch verlinken AWT, Swing, JavaFX & SWT 2
melaniemueller Taschenrechner JavaFX AWT, Swing, JavaFX & SWT 4
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
thor_norsk JavaFX Anwendung stürzt ab AWT, Swing, JavaFX & SWT 4
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
H JavaFX wie JavaFX Projekt aufsetzen? AWT, Swing, JavaFX & SWT 10
thor_norsk JavaFX - Grafikkarte AWT, Swing, JavaFX & SWT 7
MiHimbert Rückmeldung an den aufrufenden JAVAFX-Dialog AWT, Swing, JavaFX & SWT 1
MiMa JavaFX Runtime components are Missing??? AWT, Swing, JavaFX & SWT 3
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
B JavaFX Sprachumschaltung mit Button auf der HMI AWT, Swing, JavaFX & SWT 6
H JavaFX Fehlende JavaFX Package AWT, Swing, JavaFX & SWT 10
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
G JavaFX Line Chart mit Farbverlauf/Gradient in Linie AWT, Swing, JavaFX & SWT 1
thor_norsk JavaFX, FXML und SceneBuilder AWT, Swing, JavaFX & SWT 6
_user_q Über installDist exportiertes Programm wirft "Unsupported JavaFX configuration" AWT, Swing, JavaFX & SWT 0
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
G JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor) AWT, Swing, JavaFX & SWT 9
_user_q [JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf? AWT, Swing, JavaFX & SWT 6
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
J JavaFX Schiffe versenken mit JavaFX und Scene builder AWT, Swing, JavaFX & SWT 3
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
S JavaFX: voneinander abhängige TextFields AWT, Swing, JavaFX & SWT 33
M Gluon will JavaFX in den Browser stecken AWT, Swing, JavaFX & SWT 0
H javafx application does not exist AWT, Swing, JavaFX & SWT 16
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
izoards JavaFX TextFlow - Sonderzeichen AWT, Swing, JavaFX & SWT 1
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
MiHimbert javaFX openfx (17) datepicker AWT, Swing, JavaFX & SWT 3
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Taschenrechner mit SceneBuilder AWT, Swing, JavaFX & SWT 12
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
izoards JavaFX editierbare Tabelle AWT, Swing, JavaFX & SWT 4
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
D Verschieden Scenen ansprechen mit dem Scene Builder und JavaFX (Eclipse) AWT, Swing, JavaFX & SWT 16
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
M Zufallsgenerator bei JavaFx AWT, Swing, JavaFX & SWT 1
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
L JavaFX JavaFX, MVVM und SceneBuilder AWT, Swing, JavaFX & SWT 4
S JavaFx Album AWT, Swing, JavaFX & SWT 137
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J JavaFX - Included FXML - Entfernen feststellen AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX/ Taskmenu / UML Klassendiagramm AWT, Swing, JavaFX & SWT 2
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
2 JavaFX die ChoiceBox leitet den String nicht weiter oder es komm zu einem NullPointer AWT, Swing, JavaFX & SWT 8
C MouseEvent JavaFX AWT, Swing, JavaFX & SWT 4
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
G javafx build.fxbuild in eclipse und ANT AWT, Swing, JavaFX & SWT 9
M Kollisionensbehandlung mit JavaFX AWT, Swing, JavaFX & SWT 1
N JavaFX - Toolkit not initialized AWT, Swing, JavaFX & SWT 6
G JavaFX , Duplicate erzeugt aber ich weis nicht wo AWT, Swing, JavaFX & SWT 4
K Javafx Plugin (javafx:jlink) mit moditect Plugin nutzen ... AWT, Swing, JavaFX & SWT 5
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
G JavaFX BarChart während der Runtime aktualisieren AWT, Swing, JavaFX & SWT 4
Z JavaFX JavaFX Spinner AWT, Swing, JavaFX & SWT 1
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
T JavaFX DatePicker JavaFX AWT, Swing, JavaFX & SWT 14

Ähnliche Java Themen

Neue Themen


Oben