Hallo zusammen,
in dem Thread https://www.java-forum.org/thema/daten-zwischen-controller-austauschen.183928/ habt Ihr mir hier im Forum seh anschaulich und gut erklärt wie ich von meinem Main Controller weitere Controller aufrufen kann und in diesen dann auf Objekte des Main Controller zugreifen kann --> ControllerInjectable, ControllerFactory und ViewLoader. Dieses Framework habe ich jetzt auch schon erfolgreich in meinem projekt implementiert.
Nun habe ich festgestellt das ich quasi auch noch "die andere Richtung" benötige, soll heißen ich muss von meinem MainController auf Objekte des aufgerufenen Controller zugreifen.
Um es deutlicher zu machen hier mein aktuelles Problem:
Problembeschreibung:
Ich habe einen Controller und in dem wird über einen Button ein weiterer Controller aufgerufen. Hier das Code Beispiel:
In dem neuen Controller wird unter anderem eine Datenbank Verbindung in der Initialize() Methode erstellt:
Das Fenster hat nur ein AreaChart, sonst nichts.
Wenn ich nun als Benutzer dieses neue Fenster schließe habe ich keine Möglichkeit innerhalb des ControllerDBMonitor die Datenbank Verbindung zu schließen, was natürlich schlecht ist!
Nun habe ich ja in meinem Main Controller in der Button Methode ein Event erstellt, welches ausgeführt wird wenn es ein setOnCloseRequest gibt:
Aus meiner Sicht wäre das ja eine gute Stelle um beim schließen des Fenster die Verbindung zu schließen. Nun habe ich aber folgendes Problem:
1. Ich habe keinen Zugriff auf das Connection Objekt aus dem ControllerDBMonitor.
2. Wenn ich mir im MainController eine Instanz von der Klasse ControllerDBMonitor erstelle und dann mit Hilfe von Getter/Setter versuche auf das Objekt zuzugreifen, gibt es eine NPE. Meine Vermutung ist das dieses Objekt dann nicht mehr verfügbar ist .. ??
Frage:
Wie kann ich die Datenbank Verbindung schließen (connSys.close()) wenn das Fenster geschlossen wird?
Kann ich irgendwie in dem ControllerDBMontor einen "Listener" konfigurieren der beim schließen des Fenster noch Aktionen ausführt?
Gruß
Ralf
in dem Thread https://www.java-forum.org/thema/daten-zwischen-controller-austauschen.183928/ habt Ihr mir hier im Forum seh anschaulich und gut erklärt wie ich von meinem Main Controller weitere Controller aufrufen kann und in diesen dann auf Objekte des Main Controller zugreifen kann --> ControllerInjectable, ControllerFactory und ViewLoader. Dieses Framework habe ich jetzt auch schon erfolgreich in meinem projekt implementiert.
Nun habe ich festgestellt das ich quasi auch noch "die andere Richtung" benötige, soll heißen ich muss von meinem MainController auf Objekte des aufgerufenen Controller zugreifen.
Um es deutlicher zu machen hier mein aktuelles Problem:
Problembeschreibung:
Ich habe einen Controller und in dem wird über einen Button ein weiterer Controller aufgerufen. Hier das Code Beispiel:
Java:
// Method for DB Monitor Button
public void dbMonitorButtonTapped() {
Parent rootDBMonitor = ViewLoader.load("DBMonitorView.fxml",
clazz -> ControllerFactory.controllerForClass(clazz, model, db, this));
Stage stageDBMonitor = new Stage();
stageDBMonitor.initModality(Modality.NONE);
stageDBMonitor.setOpacity(1);
stageDBMonitor.setTitle("DB Monitor View");
Scene sceneDBMonitor = new Scene(rootDBMonitor);
sceneDBMonitor.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
stageDBMonitor.setScene(sceneDBMonitor);
stageDBMonitor.setOnCloseRequest(event -> {
LOGGER.info("Close JavaFX Stage: ControllerDBMonitor");
});
LOGGER.info("Starting DB Monitor window @ SID " + getDbSid());
messageTextArea.appendText("Starting DB Monitor window @ SID " + getDbSid() + "\n");
stageDBMonitor.show();
}
Java:
// Create DB connection
try {
connSys = db.dbConnect(controller.getConnectString(), controller.getDbSysUser(),
controller.getDbSysUserPassword());
} catch (Exception ex) {
String msg = String.valueOf(ex);
controller.messageTextArea.appendText(msg + "\n");
LOGGER.severe(msg);
((Stage) chart.getScene().getWindow()).fireEvent(
new WindowEvent(((Stage) chart.getScene().getWindow()), WindowEvent.WINDOW_CLOSE_REQUEST));
}
Wenn ich nun als Benutzer dieses neue Fenster schließe habe ich keine Möglichkeit innerhalb des ControllerDBMonitor die Datenbank Verbindung zu schließen, was natürlich schlecht ist!
Nun habe ich ja in meinem Main Controller in der Button Methode ein Event erstellt, welches ausgeführt wird wenn es ein setOnCloseRequest gibt:
Java:
stageDBMonitor.setOnCloseRequest(event -> {
LOGGER.info("Close JavaFX Stage: ControllerDBMonitor");
});
Aus meiner Sicht wäre das ja eine gute Stelle um beim schließen des Fenster die Verbindung zu schließen. Nun habe ich aber folgendes Problem:
1. Ich habe keinen Zugriff auf das Connection Objekt aus dem ControllerDBMonitor.
2. Wenn ich mir im MainController eine Instanz von der Klasse ControllerDBMonitor erstelle und dann mit Hilfe von Getter/Setter versuche auf das Objekt zuzugreifen, gibt es eine NPE. Meine Vermutung ist das dieses Objekt dann nicht mehr verfügbar ist .. ??
Frage:
Wie kann ich die Datenbank Verbindung schließen (connSys.close()) wenn das Fenster geschlossen wird?
Kann ich irgendwie in dem ControllerDBMontor einen "Listener" konfigurieren der beim schließen des Fenster noch Aktionen ausführt?
Gruß
Ralf