# Rückgabewert aus Klasse mit JDialog



## le_manchot (13. Okt 2008)

Hallo,

folgendes Problem:

Ich habe eine Klasse A, die einen modalen JDialog auf einem unsichtbaren JFrame der Klasse B generiert. Die Werte, die in der Klasse des Dialogs entstehen, sollen beim Schließen mittel OK-Button des Dialogs an Klasse A zurück gegeben werden.

Wie schaffe ich es, Klasse A den Wert aus dem Dialog zu übergeben?

Irgendwie habe ich gerade einen kleinen Knoten in den Synapsen.

Dank und Gruß


----------



## Zed (13. Okt 2008)

Mach ne private Variable im Dialog und holl dir den Wert mit einem Getter.


----------



## le_manchot (14. Okt 2008)

Zed hat gesagt.:
			
		

> Mach ne private Variable im Dialog und holl dir den Wert mit einem Getter.



Ich konnte das Problem lösen, es verlangt ein "umgekehrtes" Denken. Vielen Dank für Deinen Vorschlag, Zed. So kann es nicht funktionieren, da die Klasse A ja erst auf Werte des JFrame der Klasse B zugreifen könnte, wenn dieser geschlossen ist. Dies liegt an der (gewollt) modalen Darstellung. Aus einem Objekt der Klasse A könnte also erst eine Methode der Klasse B aufgerufen werden, wenn diese schon wieder zerstört wurde.

Die Lösung ist andersrum. Das Objekt A ruft Objekt B auf und übergibt sich selbst als Parameter "this" an den Konstruktor von B. B ruft dann ein A.setXYZ() auf.


----------



## UnkiDunki (27. Feb 2009)

> Die Lösung ist andersrum. Das Objekt A ruft Objekt B auf und übergibt sich selbst als Parameter "this" an den Konstruktor von B. B ruft dann ein A.setXYZ() auf.



Eine Frage dazu: 
Wenn ich jetzt die Situation habe, dass nicht nur Objekt A auf B zugreift, sondern noch andere Objekte, so muss ich doch am besten JDialog überschreiben, Getter und Setter für den Werteaustausch einführen und schließlich alle betreffen Dialoge von der neuen Klasse ableiten...
Und wenn dann auch noch Objekt E auf F zugreifen möchte und dabei komplett andere VarTypen verlangt werden mit Object arbeiten und dann hinterher casten? Ist das so die optimalste Lösung oder geht das ganze eleganter?


```
public class JDialogExchange extends JDialog{

	/**
	 * 
	 */
	@SuppressWarnings("unused")
	private Object value = null;
	
	private static final long serialVersionUID = 1L;

	JDialogExchange(){
		super();
	}
	
	JDialogExchange(String title){
		super(title);
	}
	
	public void setExchangeValue(Object valueExt){
		value = valueExt;
	}
	
	public Object getExchangeValue(){
		return value;
	}
	
	public void resetExchangeValue(){
		value = null;
	}
}
```

Am besten wäre es natürlich wenn z.B. Object B vor dem Schließen einen Wert zurückgeben könnte, aber das wird nicht gehen oder?
So in etwa:


```
JDialog dialog = new JDialog(this);
int value = 0;
		dialog.setVisible(true);
		
		dialog.addWindowListener(new WindowAdapter(){
	  		public void windowClosed/Closing(WindowEvent e){
	  			value = dialog.getValue();
                                dialog.dispose();
	  		}
	  	});
```

Das ist ja leider nicht möglich, aber so würde man sich die ganzen Umstände, die bei meinem oberen Vorschlag ja anfallen, sparen...

Freue mich über jeden Hinweis und Anregung  Danke


----------



## slawaweis (27. Feb 2009)

Hallo le_manchot,



le_manchot hat gesagt.:


> Ich habe eine Klasse A, die einen modalen JDialog auf einem unsichtbaren JFrame der Klasse B generiert. Die Werte, die in der Klasse des Dialogs entstehen, sollen beim Schließen mittel OK-Button des Dialogs an Klasse A zurück gegeben werden.
> 
> Wie schaffe ich es, Klasse A den Wert aus dem Dialog zu übergeben?


zuerst eine Sache zu dem "unsichtbaren JFrame". Ich weis jetzt nicht genau, welche Funktionalität noch dahinter steckt, aber ein JDialog kann auch mit "null" als Parent konstruiert werden, ein unsichtbares JFrame ist dann nicht notwenig. Componenten, die nie auf den Bildschirm kommen, sollte man soweit es geht vermeiden.

Jetzt zu dem modalen Dialog. Eine gute Lösung in so einem Fall wäre zu dem Aufrufer A und dem modalen Dialog B zusätzlich ein Datenmodel C zu definieren, wobei C klonbar sein muss. C ist dann eben eine Klasse, die alle benötigten Daten für den Dialog B enthält. Dann müsste B A nicht kennen und so könnte B von jeder beliebigen Klasse aufgerufen werden. Der Aufruf könnte so aussehen:


```
// Model C anlegen und setzen
C c = ...;

// ...

B b = new B();
b.setModel(c); // in setModel() wird c geklont und B arbeitet nur auf einer Kopie
b.show(); // Dialog anzeigen
// Dialog wird geschlossen
if(b.getStatus() == OK) // prüfen, was der User am Ende geklickt hat, z.B. "OK" oder "Abbrechen"
  {
  c = b.getModel(); // gibt das veränderte Model oder eine Kopie dessen zurück
  // alternativ: c.setData(b.getModel());
  }
b.dispose();
b = null;
```

Slawa


----------



## UnkiDunki (2. Mrz 2009)

Hi,

du hast jetzt le_manchot geantwortet, der das "Dingen" vor mehr als 4 Monaten als "Erledigt" abgehakt hat.
Könntest du vielleicht noch auf meine Idee eingehen?
Alle anderen sind natürlich auch herzlich dazu eingeladen


----------



## SlaterB (2. Mrz 2009)

1.
es ist möglichen, einen Listener zu adden, 
falls WindowListener nicht geht, dann definiere dir doch in der Basisklasse eine neue Liste von eigenen Listenern,
die beim Schließen aufgerufen werden,

kommt natürlich darauf an, auf wieviel verschiedene Weisen der Dialog beendet wird/ ob du das kontrollierst,
wenn du überall einheitlich einen Ok + Abbrechen-Button hast,
dann musst du nur bei ActionListenern auf diesen Buttons aktiv werden,

vielleicht auch ComponentListener oder was auch immer

-----

2.

```
JDialog dialog = new JDialog(this);
int value = 0;
        dialog.setVisible(true);
 
        dialog.addWindowListener(new WindowAdapter(){
              public void windowClosed/Closing(WindowEvent e){
                  value = dialog.getValue();
                                dialog.dispose();
              }
          });
```
 
bei einem modalen Dialog ist der Aufrufer nach setVisible() blockiert, denkbar wäre also auch ganz kurz:


```
JDialog dialog = new JDialog(this);
int value = 0;
        dialog.setVisible(true);
        value = dialog.getValue();
```
 
(== erste Antwort von Zed)


----------

