JDialog per button schließen & dabei den "windowclosing"-event erzeugen

GoLLuM

Erfahrenes Mitglied
hallo Leute!

ich bin gerade dabei meine Diplomarbeit zu schreiben und auf ein Problem gestoßen, das ich sehr gern lösen möchte.

folgendes Setup:
ich habe einen jFrame in dem es (unter anderem) einen Buttton gibt, dieser öffnet einen jDialog.

Code:
btnCreateBusinessRatio.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					
					JDialog guiAddBRatio = new GuiCreateBusinessRatio();
					guiAddBRatio.setLocationRelativeTo(frmJBSC);
					guiAddBRatio.setVisible(true);
					
				}
			});

Der Jdialog befindet sich in einer eigenen klasse/java-Datei. Im JDialog gibt es (neben Textfeldern etc.) einen weitere Button, der bei "actionperformed" zwei Dinge auslösen soll:
  1. texteingaben des Benutzers speichern (funktioniert, Eingaben werden in einer Datenbank gespeichert)
  2. der JDialog soll sich schließen.
Das klappt ja auch schon wunderbar so. Zum Schließen des Jdialog verwende ich
Code:
dispose();

Die Idee vom Ablauf:
Im darunterliegenden Jframe gibt es eine Tabelle, die die Daten aus der Datenbank zieht. Jetzt ist meine Vorstellung folgende: sobald der jDialog über den Button geschlossen wurde, soll sich die Tabelle updaten (die Update-Funktion ist schon geschrieben und funktioniert). Naiv wie ich bin, habe ich dann dem Jdialog einen Actionlistener hinzugefügt, der bei window-closing die Tabelle neu laden soll. Damit verändert sich de Quelltext von oben so:

Code:
btnCreateBusinessRatio.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					
					JDialog guiAddBRatio = new GuiCreateBusinessRatio();
					guiAddBRatio.addWindowListener(new java.awt.event.WindowAdapter() {
						public void windowClosing(java.awt.event.WindowEvent e) {
							refreshTable();
						}
					});
					guiAddBRatio.setLocationRelativeTo(frmJBSC);
					guiAddBRatio.setVisible(true);
					
				}
			});

Das Problem:
Wenn ich den JDialog über das "Kreuz rechts oben im Fenstertitel" schließe (mir ist leider keine bessere Beschreibung eingefallen :)), dann wird die Tabelle refresht. Das ist schon mal super.
Aber wenn ich das Fenster über meinen Button mit dispose(); schließe, dann wird anscheinend der windowclosing-event nicht erzeugt - die Tabelle aktualisiert sich nämlich nicht. :(

Die Frage:
Gibt es eine Möglichkeit, den Event beim Button-Klick zu erzeugen? Oder gibt es vielleicht eine Möglichkeit, wie ich den dispose();-event auswerten kann? :confused:

Ich danke euch schon mal im Voraus und hoffe, dass wir eine Lösung finden :)
 
Zuletzt bearbeitet:
Du könntest ja.. wenn der Button gedrückt wird, dieses Event selbst erstellen:

public void ButtonActionPerformed(ActionEvent e)
{
new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
}

So müsste es meiner Meinung nach funktionieren, habe es aber nicht ausprobiert...!

Gruß,
Harry
 
umstrukturieren:

1. Den Aktualisierungscode in eine eigene Methode, z.B. refreshTable()
2. im ActionListener nur refreshTable aufrufen
3. dispose() in deiner JDialog-Klasse überschreiben:
Code:
public void dispose() {
	refreshTable();
	super.dispose();  // um das eigentliche dispose auszuführen
}

Schon sollte es funktionieren, ohne ein eigenes Event generieren zu müssen.
 
Vielen Dank für eure Antworten :)

Ihr habt mir einen Denkanstoß gegeben, der mich zur Lösung gebracht hat.

Wen es interessiert:

die Funktion "refreshtable()" im JFrame ist "public", sodass man von außen auf sie zugreifen kann. Für das Öffnen des JDialog habe ich mir eine Methode geschrieben, und übergebe an den JDialog den Owner bzw. meine Klasse in der die Tabelle hockt (Übergabe per "this"). Bei "ActionListener" vom Button lasse ich dann genau diese Methode ausführen.

Code:
	private void btnActionPerformed()
	{
		JDialog guiAddBRatio = new GuiCreateBusinessRatio(this);
		guiAddBRatio.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowClosing(java.awt.event.WindowEvent e) {
				refreshTable();
			}
		});
		guiAddBRatio.setVisible(true);
	}
	private JButton getBtnCreateBusinessRatio() {
		if (btnCreateBusinessRatio == null) {
			btnCreateBusinessRatio = new JButton();
			btnCreateBusinessRatio.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					
					btnActionPerformed();
					
				}
			});
		}
		return btnCreateBusinessRatio;
	}
Damit kennt nun der JDialog seinen Owner. Allerdings musste ich den Konstruktor des JDialogs anpassen und ihn wissen lassen, was da als Parameter mitkommt:
Code:
public GuiCreateBusinessRatio(GuiMain theOwner) {
		super();
		this.owner = theOwner;
		initialize();
	}

Im JDialog kann ich dann bei actionPerformed einfach auf die Methode "refreshTable" zurückgreifen (der aufrufende JFrame ist dabei in "owner" gespeichert):
Code:
btnCancel.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {					
					owner.refreshBratioTable();
					dispose();
				}
			});
Vielen Dank noch mal :)
 

Neue Beiträge

Zurück