# Daten aus einem JDialog einem JFrame übergeben



## L-ectron-X (25. Apr 2004)

Moin!

Ich habe einen JFrame programmiert, in dem via Menü ein JDialog geöffnet wird.
In diesem Dialog werden verschiedene Daten in JTextField's eingegeben.
Nun möchte ich diese Daten nach einem Klick auf einen OK-Button in diesem Dialog an eine JTable zur Anzeige übergeben, die in dem o.g. JFrame eingebettet ist.
Weiß jemand wie man das anstellt?
Meine bisherigen Überlegungen zielten auf einen JDialog, der als innere Klasse in meiner JFrame-Klasse programmiert ist.

Danke für Eure Hilfe!

L-ectron-X


----------



## Roar (25. Apr 2004)

äh.. wo is das problem? hast du ne eigne klasse die von JDialog erbt? du könntest den doch einfach in eine metzhode reinhauen... naja egal. ansonsten speicher die eingegeben werte halt als instanzvariablen von deiner klasse, und per getValues() oder so holst du sie dir aus dem aufrufendem programm...

wenn das nicht hilft dann schieb mal n bisschen code rüber...


----------



## Guest (25. Apr 2004)

Ja, ich hatte zunächst eine eigene Klasse (ohne main-Methode) programmiert, die von JDialog abgeleitet ist.
Das Problem dabei ist aber, dass beim Schließen des Dialoges per OK-Button oder WindowEvent auch eingegebene Daten mit dem Dialog zerstört werden. Nun weiß ich nicht, wie ich die Daten aus den Textfeldern in meine Tabelle in den JFrame retten kann. Instanzvariablen speichern und abholen? Beide Klassen können nur einseitig miteinander kommunizieren. Der JFrame ist lediglich der Owner des JDialogs und kennt seinen Namen. Ich habe auch schon die Textfeld-Eingaben in einem neuen Objekt zusammengefasst, das man aus dem JDialog per Rückgabe abholen könnte. Aber das geht auch nicht. Der JFrame weiß ja nicht, wenn alle Daten im JDialog zur Abholung bereit sind - sprich der OK-Button geklickt wurde.
So kam ich dann darauf, den Dialog innerhalb des JFrames zu programmieren. Nur ist das leider nicht sonderlich wiederverwendbar.


----------



## Roar (25. Apr 2004)

da der aktuelle thread angehalten wird wenn du einen modalen dialo erstellst sollte folgendes gehen:


```
class MyDialog extends JDialog implements ActionListener {
  private JTextField tf = new JTextField();
  private String text = "";
  public MyDialog(JFrame owner) {
    super(owner);
    // blabla
  }

  public void actionPerformed(ActionEvent e) {
    text = tf.getText();
  }

  public String getText() {
    return text;
  }
}
```

wenn das nicht geht dann würd ich einfach eine statische methode in die Klasse reinschieben die dir den dialog macht und die daten zurückgibt (wie JOptionPane)


----------



## L-ectron-X (26. Apr 2004)

OK, ich habe mir nach einer Anregung eine Lösung zusammen gebaut, die auch noch wieder verwendbar ist.
Eine auch funktionierende, aber eben nicht wieder verwendbare Variante wäre wie gesagt, den JDialog als innere Klasse im JFrame zu implementieren. Innere Klassen haben bekanntlich Zugriff auf alle Instanzvariablen der sie umgebenden Klasse.
Hier nun die elegantere Variante mit Wiederverwendbarkeit.

Zunächst braucht man ein Interface, welches nur eine Methode implementiert:

```
public Interface ResultProcessor {
    public void processResult(javax.swing.JDialog source, Object obj);
}
```
Dieses Interface implementiert man in einem JFrame (Hauptprogramm)...

```
public class MainFrame extends javax.swing.JFrame
    implements ResultProcessor {
    ...
    //Methode zum Öffnen des Eingabe-Dialogs
    private void openMeinEingabeDialog() {
        new MeinEingabeDialog(this, true).show();
    }
    ...
```
...und damit auch die Methode processResult() aus dem Interface ResultProcessor

```
public void processResult(javax.swing.JDialog source, Object obj) {
    if(source instanceof MeinEingabeDialog)
    result = (MeinObject)obj;
    //result ist eine Instanzvariable, obj wird ins erwartete Object gecastet und an result übergeben
    ...
```
Danach nehme ich in meinem Fall das result-Object mit seinen Methoden auseinander und "bestücke" damit die JTable. Fehlt nur noch die Implementation in meinem JDialog. Und die sieht so aus:

```
public class MeinEingabeDialog extends javax.swing.JDialog {
    public MeinEingabeDialog(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        ...
    }
    ...
    //Event-Methode die bei Klicken auf den OK-Button aufgerufen wird
    private void btn_fertigClicked(java.awt.event.ActionEvent ae) {
    ...
        setVisible(false); //JFrame unsichtbar machen

        /*Da ein ResultProcessor-Object (MainFrame implementiert ResultProcessor)
        der Owner des JDialogs ist, wird hier die Rückgabe der getParent()-Methode
        auf ein ResultProcessor-Object gecastet. Damit erhalten wir den Eigentümer
        (MainFrame) des JDialogs und können nun mit diesem Object die
        processResult()-Methode aufrufen.*/
        ((ResultProcessor)getParent()).processResult(this, result);

        dispose(); //ab Java 1.5 deprecated
    }
    ...
}
```
Ich hoffe, dass dies dem einen oder anderen einmal helfen kann.

L-ectron-X


----------

