# Wert aus Dialog zurückgeben



## gondor (6. Okt 2004)

hallo liebe java-freunde!

leider stoße ich auf ein (simples) problem.

ich rufe aus einer klasse ein dialog-fenster auf:


```
ArticCell_Frame_HeaderDialog dlg = new ArticCell_Frame_HeaderDialog(this, propertieValue_Header[1].toString());
Dimension dlgSize = dlg.getPreferredSize();
Dimension frmSize = getSize();
Point loc = getLocation();
dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y);
dlg.setModal(true);
dlg.pack();
dlg.show();
```

das dialog-fenster enthält eine eingabemaske (textfield). nun möchte ich den eingegebenen string, an meine klasse zurückgeben, wenn der button 'ok' gedrückt wurde und das dialog-fenster sich wieder schliesst. doch leider hapert es an dieser problemstellung 

hier die dialog-klasse:


```
public class ArticCell_Frame_HeaderDialog extends JDialog {

    String findString = "";
    String tempString = "";

    JPanel jPanel1 = new JPanel();
    JLabel jLabel1 = new JLabel();
    BorderLayout borderLayout1 = new BorderLayout();
    JPanel jPanel2 = new JPanel();
    JTextField jTextField1 = new JTextField();
    JLabel jLabel2 = new JLabel();
    FlowLayout flowLayout1 = new FlowLayout();
    JButton Header_jButton_OK = new JButton();


    public ArticCell_Frame_HeaderDialog(Frame parent, String findString_) {
        super(parent);
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        this.findString = findString_;
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    private void jbInit() throws Exception {
        jLabel1.setFont(new java.awt.Font("Dialog", 1, 15));
        jLabel1.setAlignmentX((float) 5.0);
        jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel1.setText("There is no Header-Information found in Data-File!");
        jPanel1.setLayout(borderLayout1);
        jPanel2.setLayout(flowLayout1);
        jTextField1.setText("");
        jTextField1.setColumns(15);
        jLabel2.setText("Please enter the Value for " + findString + " :");
        Header_jButton_OK.setMaximumSize(new Dimension(45, 22));
        Header_jButton_OK.setMinimumSize(new Dimension(45, 22));
        Header_jButton_OK.setPreferredSize(new Dimension(45, 22));
        Header_jButton_OK.setText("ok");
        Header_jButton_OK.addActionListener(new ArticCell_Frame_HeaderDialog_Header_jButton_OK_actionAdapter(this));
        this.setTitle("Headerinformation");
        this.getContentPane().add(jLabel1, BorderLayout.NORTH);
        this.getContentPane().add(jPanel2, BorderLayout.SOUTH);
        jPanel2.add(jLabel2, null);
        jPanel2.add(jTextField1, null);
        jPanel2.add(Header_jButton_OK, null);
        this.getContentPane().add(jPanel1, BorderLayout.CENTER);
    }

    /*nach drücken soll der wert an die klasse zurückgegeben werden und das dialog-fenster soll sich schliessen*/
    void Header_jButton_OK_actionPerformed(ActionEvent e) {
        tempString = jTextField1.getText();
    }

}


class ArticCell_Frame_HeaderDialog_Header_jButton_OK_actionAdapter implements java.awt.event.ActionListener {
    ArticCell_Frame_HeaderDialog adaptee;

    ArticCell_Frame_HeaderDialog_Header_jButton_OK_actionAdapter(ArticCell_Frame_HeaderDialog adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.Header_jButton_OK_actionPerformed(e);
    }
}
```

wie ist das zu lösen?


----------



## Beni (6. Okt 2004)

Schreib noch ein paar Getter in deinen Dialog:


```
public class HeaderDialog extends JDialog{
  ...

  public String getFind(){
    return findString;
  }
}
```


```
...
dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y);
dlg.setModal(true);
dlg.pack();
dlg.show(); 

String findString = dlg.getFind();
```


----------



## gondor (6. Okt 2004)

@beni

manchmal sieht man den wald vor lauter bäumen nicht. die idee ist mir gleich nach dem posting gekommen  trotzdem vielen lieben dank!


----------



## Xandro (18. Nov 2004)

Moin,

ich zieh' das Thema mal wieder hoch, weil ich kein neues anfangen will.
Mein Problem ist genau andersrum, wie das des Thread-Erföffners.

Ich will einen String von meiner GUI einem Dialog übergeben.

Mein Code, mit dem ich es versucht habe:

GUI.java

```
GUInew dlg = new GUInew();
dlg.setSize(400, 400);
dlg.setLocationRelativeTo(null);
dlg.setModal(true);

dlg.setDB(jComboBox_edit_dbselect.getSelectedItem().toString());

dlg.show();
```

GUInew.java

```
public void setDB(String db) {
    DB = db;
  }
```

Also eine Wertübergabe mit einer setter-Methode.
Das Problem ist, dass ich im Dialog für DB immer einen Null-Wert bekomme.
Demnach muss ich irgendwas falsch machen,
aber was?

Gruss,
Xan


----------



## L-ectron-X (19. Nov 2004)

Hast Du in GUInew eine Instanzvariable DB vom Typ String deklariert? Dann sollte das gehen.

```
dlg.setDB((String)jComboBox_edit_dbselect.getSelectedItem());
```
Alternativ dazu kannst Du auch den String dem Konstruktor von GUInew beim Aufruf übergeben.


----------



## Xandro (19. Nov 2004)

Also eine globale Instanzvariable DB hab ich als String deklariert,
sonst würde meine Wertübergabe DB = db nicht funzen.
Aber wie gesagt -> Null.

Ich hab mich mal mit Deinem Alternativvorschlag beschäftigt,
nur habe ich das Problem, dass ich nicht weiss, wie ich den Konstruktor füllen soll.


```
public GUInew(Frame frame, String title, boolean modal) {
  super(frame, title, modal);
  try {
      jbInit();
      pack();
  }
  catch (Exception ex) {
      ex.printStackTrace();
  }
}

public GUInew() {
  this(null, "", false);
}
```

Weil wenn ich was einfüge, meckert der zweite Konstruktor rum.
Und wenn ich meine Variable nur im zweiten Konstruktor übergebe,
wird es wieder ein Null-Wert


----------



## Gast (19. Nov 2004)

Du könntest auch einfach die show() oder setVisible() Methoden des Dialogs überschreiben und denen den String übergeben:

```
dlg.show("irgendein String");
```


----------



## L-ectron-X (19. Nov 2004)

Ich dachte da an so etwas:

```
public class GUInew extends JDialog {
private String db;

  public GUInew(Frame frame, String title, boolean modal, String str) { 
    super(frame, title, modal);
    db = str;


  }
}
```


----------



## Xandro (19. Nov 2004)

Jop L-ectron-X,

genau so habe ich das versucht, aber dann meckert dieser Konstruktor rum:


```
public GUInew() { 
  this(null, "", false); 
}
```

Der will dann nämlich noch einen String bekommen,
aber DB kann ich ihm nicht liefern, da motzt der rum.

Fehlermeldung:


```
"GUInew.java": Symbol kann nicht aufgelöst werden: Konstruktor GUInew (<nulltype>,java.lang.String,boolean)in Klasse sqldb.GUInew in Zeile 34, Spalte 5
"GUInew.java": JDialog(java.awt.Frame,java.lang.String,boolean) in javax.swing.JDialog ist nicht in public-Klasse oder -Interface definiert; man kann von außerhalb des Package darauf nicht zugreifen in Zeile 34, Spalte 5
```


----------



## L-ectron-X (19. Nov 2004)

Kannst Du mal die gesamte Klasse GUInew posten?
Das muss gehen, Du hast da irgendwo einen Fehler eingebaut, habe auch schone eine Vermutung, möchte mir aber gerne erst mal den Quellcode ansehen.


----------



## Xandro (19. Nov 2004)

Ja sicher hier der Source:


```
package sqldb;

import java.awt.*;
import javax.swing.*;

public class GUInew
    extends JDialog {

  private String DB;

  JPanel panel1 = new JPanel();
  JLabel jLabel_create_header = new JLabel();

  public GUInew(Frame frame, String title, boolean modal) {
    super(frame, title, modal);
    try {
      jbInit();
      pack();
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  public GUInew() {
    this(null, "", false);
  }
  
  public void setDB(String db){
    db = DB;
  }

  private void jbInit() throws Exception {
    panel1.setLayout(null);
    jLabel_create_header.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel_create_header.setText("- Create A New Table in Database '" + DB +
                                 "' -");
    jLabel_create_header.setBounds(new Rectangle(19, 27, 482, 15));
    getContentPane().add(panel1);
    panel1.add(jLabel_create_header, null);
  }
}
```

Ist die ursprüngliche Variante, wie ich sie machen wollte,
da das mit dem Konstruktor ja nicht funzt.


----------



## L-ectron-X (19. Nov 2004)

Das mit dem Konstruktor, so wie ich ihn geschrieben habe, geht auch. Wichtig ist der richtige Aufruf bzw. Instanziierung von GUInew.
Scheinbar hast Du das bisher verkehrt gemacht.
Aber hier ist trotzdem ein Fehler drin, klein aber oho! :wink: 
Zeile 30. Beide Variablen miteinander tauschen!

```
DB = db;
```
Dann sollte das mit der setDB()-Methode funktionieren.


----------



## Xandro (20. Nov 2004)

Also ich habs nochmal mit den Konstruktor versucht:


```
package sqldb;

import java.awt.*;
import javax.swing.*;

public class GUInew
    extends JDialog {

  private String DB;

  JPanel panel1 = new JPanel();
  JLabel jLabel_create_header = new JLabel();

  public GUInew(Frame frame, String title, boolean modal, String db) {
    super(frame, title, modal);
    DB = db;
    try {
      jbInit();
      pack();
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
```

Soweit gibts nichts zu beklagen, aber jetzt:

Fehler:

```
public GUInew() {
    this(null, "", false);
  }
```
Es wird ja ein weiterer String für this erwartet.
Doch kann ich es nur so realisieren, weil alles andere nicht angenommen wird:


```
public GUInew() {
    this(null, "", false, "");
  }
```
Das heisst ich muss einen Leerstring einfügen,
denn sonst kommt die Fehlermeldung wie oben.

Und zu dem Thema setter-Methode:
Egal wie ich es dreh und wende, da wird immer ein Null-Wert übergeben.

Ach menno, bin schon am Verzweifeln.
Kann ich Dir mal das Programm bereitstellen und Du schaust,
was da noch fehlerhaft sein könnte, ich hab jetzt alle Möglichkeiten durch.


----------



## Xandro (10. Dez 2004)

So, mein Problem lässt sich nicht lösen, die Übergabe der Werte erfolgt einfach nicht.
Immer wieder ein Null-String *seufz*

Ich habs mit etlichen Konstruktoränderungen und -aufrufen versucht,
aber nichts.
Auch die Setter-Methodik hat sich nicht bewährt.

Ich weiss auch nicht mehr weiter ...

http://www.xandro.de/sqldb.zip


----------

