Java FX Innerhalb einem FXML-Dialog weiteren FXML-Dialog einblenden

Maxi62

Aktives Mitglied
Hi,
ich starte gerade mit JavaFX eine FXML-Anwendung. An einen Punkt hänge ich gerade, vielleicht könnt ihr mir einen Tipp ode rBeispiel nennen geben:

Mit dem SceneBuilder habe ich eine FXML-Datei für ein Main Windows erstellt und verwalte das auch in einer Controller-Datei.
Die Datei enthält quasi nur ein Menü und Borderlayout und ein paar Kleinigkeiten.
Zudem habe ich mit dem SceneBuilder mehrere weitere komplexe Dialoge erstellt.
Ich habe also mehrere Controllerdateien!
Je nachdem welchen Menüpunkt ich im Main-Fenster aufrufe, möchte ich innerhalb des Main-Fensters ,innerhalb des Center-Bereiches des Borderlayouts, nun eine andere FXML-Datei darstellen.

Wie mach ich das?

Praktisches Beispiel wäre eine Fakturierung wo ich jeweils eigene FXML-Dateien für Lieferantenverwaltung, Bestellungen, Lagerverwaltung usw. habe und diese per Menü innerhalb eines Fensters aufrufen möchte. Ich möchte nicht alles in einer FXML-Datei definieren, da diese bei den vielen Dialogen zu unübersichtlich würde.

Für einen Tipp wäre ich dankbar!
 
Ich mache das so, dass ich im "Root"-Controller via FXMLLoader die jeweilige FXML lade und dann im "Root" an die entsprechende Stelle einfüge.
Der Ansatz ist dann im wesentlichen ein wenig wie bei den Fragmenten von Android: Eine zentrale Activity und X verschiedende Fragmente die darauf angezeigt (oder ausgetauscht) werden.

Beispiel:
Java:
@FXML
private BorderPane rootPane;

// local stuff
private GridPane defaultView;

@FXML
public void initialize() {
	try {
		FXMLLoader fxmlLoader = new FXMLLoader();
		fxmlLoader.setResources(StringResource.getResourceBundle());
		fxmlLoader.setLocation(Main.class
				.getResource("ui/layout/Default.fxml"));
		defaultView = (GridPane) fxmlLoader.load();
	} catch (IOException e) {
		e.printStackTrace();
	}

	if (defaultView != null && !rootPane.getCenter().equals(defaultView)) {
		rootPane.setCenter(defaultView);
	}
}
 
Zuletzt bearbeitet:
Danke für Tipp, ich habe es jetzt aufgrund deines Tipps so gelöst:

Code:
    @FXML
    public BorderPane rootBorderPane;
    
    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
        
        try {
		FXMLLoader fxmlLoader = new FXMLLoader();
                fxmlLoader.setLocation(Main.class.getResource("view/FXMLKunde.fxml"));
		rootBorderPane.setCenter( fxmlLoader.load());
	} catch (IOException e) {
		e.printStackTrace();
	}
        
        
    }

Scheint auch alle sgut zu gehen.
Ich habe nicht so ganz verstanden wozu bei diese Zeile dient:
Code:
fxmlLoader.setResources(StringResource.getResourceBundle());
Wozu brauch ich das?
 
Ach die kannst du getrost vergessen. Ich habe in unserer Anwendung eine Hilfsklasse zum umschalten der Sprachdaten, die in Form eines ResourceBundles daher kommen. Damit werden die dynamischen (sprich: Sprachunabhängigen) Platzhalter aus der FXML mit denen aus einer strings.properties (oder strings_de.properties, strings_en.properties, ...) aufgefüllt.

Im Controller kann man sicher an die Resourcen ran kommen (z.b. indem man explizit das Initializable-Interface implementiert) und dann auf Änderungen reagieren. Im Endeffekt habe ich aber da einen anderen Event-gesteuerten Mechanismus implementiert und genaugenommen ist die Zeile auch bei mir Wertlos geworden...
 

Zurück
Oben