JDialog Werte auslesen

Status
Nicht offen für weitere Antworten.

Progman

Mitglied
Hallo

Ich habe ein JDialog erstellt welches ich aus meinem MainFrame aufrufe. Der Benutzer gibt dann dort einige Werte ein und drückt auf OK. Wie komme ich nun aus dem MainFrame an die Daten dran? Ich habe zwar einige getter in dem JDialog hinzugefügt aber ich weiß nicht wann ich diese auslesen soll. Der Konstruktor erzeugt mir sofort den Dialog un zeigt mir diesen an. Nur wo soll ich auf die Eingabe des Benutzers warten?
Code:
public class ConnectDialog extends JDialog implements ActionListener {
    private JTextField host;
    private JTextField port;
    private JTextField nickname;
    private JButton connect;
    private JButton cancel;
    private boolean ok;
    private MainFrame main;

    public ConnectDialog(MainFrame main) {
        super();
        this.initComponents();
        this.main = main;
    }

    private void initComponents() {
        this.setTitle("Zum Server verbinden");
        this.setLayout(new GridLayout(4, 2));
        this.add(new JLabel("Adresse"));
        this.add(this.host = new JTextField());
        this.add(new JLabel("Port"));
        this.add(this.port = new JTextField("40000"));
        this.add(new JLabel("Nickname"));
        this.add(this.nickname = new JTextField()); 
        this.add(this.connect = new JButton("Verbinden"));
        this.connect.addActionListener(this);
        this.add(this.cancel = new JButton("Abbrechen"));
        this.cancel.addActionListener(this);
        this.setSize(250, 120);
        this.setLocation(400, 400);
        this.setVisible(true);
        this.ok = false;
    }

    public String getHost() {
        return this.host.getText();
    }

    public String getPort() {
        return this.port.getText();
    }
    
    public String getNickname() {
        return this.nickname.getText();
    }

    public boolean isOK() {
        return false;
    }

    private void closeIt() {
        setVisible(false);
        dispose();
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals(this.connect.getText())) {
            this.ok = true;
        }
        this.closeIt();
    }
}
Wie sieht dann der Aufruf der Klasse aus?
Code:
ConnectDialog con = new ConnectDialog(this);
// irgendwie darauf warten das der User auf "Verbinden" geklickt hat
if (con.isOK()) {
    String host = con.getHost();
    ....
}

Das implementieren des ActionListeners kann ruhig raus, war noch zu testzwecken drin weil ich es irgendwie hinkriegen wollte (this übergeben für crossreferenzen und so...).
 
Du musst den JDialog modal machen (das heisst, dass das Hauptprogramm erst nach dem Schliessen des Dialogs weiterarbeitet):
Code:
public class ConnectDialog extends JDialog implements ActionListener {
    private JTextField host;
    private JTextField port;
    private JTextField nickname;
    private JButton connect;
    private JButton cancel;
    private boolean ok;
    private MainFrame main;

    public ConnectDialog(MainFrame main, JFrame owner) {
        super(owner, "mein Dialog", true);
        this.initComponents();
        this.main = main;
    }

    private void initComponents() {
        this.setTitle("Zum Server verbinden");
        this.setLayout(new GridLayout(4, 2));
        this.add(new JLabel("Adresse"));
        this.add(this.host = new JTextField());
        this.add(new JLabel("Port"));
        this.add(this.port = new JTextField("40000"));
        this.add(new JLabel("Nickname"));
        this.add(this.nickname = new JTextField());
        this.add(this.connect = new JButton("Verbinden"));
        this.connect.addActionListener(this);
        this.add(this.cancel = new JButton("Abbrechen"));
        this.cancel.addActionListener(this);
        this.setSize(250, 120);
        this.setLocation(400, 400);
        this.setVisible(true);
        this.ok = false;
    }

    public String getHost() {
        return this.host.getText();
    }

    public String getPort() {
        return this.port.getText();
    }
   
    public String getNickname() {
        return this.nickname.getText();
    }

    public boolean isOK() {
        return false;
    }

    private void closeIt() {
        setVisible(false);
        dispose();
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals(this.connect.getText())) {
            this.ok = true;
        }
        this.closeIt();
    }
}

Dem Dialog musst du dann als "Owner" das aufrufende Fenster übergeben (bei dir warscheinlich ungefähr so):

Code:
ConnectDialog con = new ConnectDialog(this, /*Der owner-->*/this);
// irgendwie darauf warten das der User auf "Verbinden" geklickt hat
if (con.isOK()) {
    String host = con.getHost();
    ....
}
 
Das klappt nun soweit. Er wartet bis ich das Fenster geschlossen habe. Nun kann ich aber nicht alle Werte auslesen. Die Eigenschaft ok bekommt den Wert false obwohl ich diesen auf true setze und dies auch die Debug-Zeilen zeigen. Die Werte aus den Feldern Host, Port und Nickname werden richtig zurückgeliefert.
Code:
public class ConnectDialog extends JDialog implements ActionListener {
    private JTextField host;
    private JTextField port;
    private JTextField nickname;
    private JButton connect;
    private JButton cancel;
    private boolean ok;

    public ConnectDialog(JFrame owner) {
        super(owner, true);
        this.initComponents();
    }

    private void initComponents() {
        this.setTitle("Zum Server verbinden");
        this.setLayout(new GridLayout(4, 2));
        this.add(new JLabel("Adresse"));
        this.add(this.host = new JTextField());
        this.add(new JLabel("Port"));
        this.add(this.port = new JTextField("40000"));
        this.add(new JLabel("Nickname"));
        this.add(this.nickname = new JTextField()); 
        this.add(this.connect = new JButton("Verbinden"));
        this.connect.addActionListener(this);
        this.add(this.cancel = new JButton("Abbrechen"));
        this.cancel.addActionListener(this);
        this.setSize(250, 120);
        this.setLocation(400, 400);
        this.setVisible(true);
        this.ok = false;
    }

    public String getHost() {
        return this.host.getText();
    }

    public String getPort() {
        return this.port.getText();
    }
    
    public String getNickname() {
        return this.nickname.getText();
    }

    public boolean isOK() {
        System.out.println("OKAY ist: "+this.ok);
        return this.ok;
    }

    private void closeIt() {
        setVisible(false);
        System.out.println(this.ok);
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
        System.out.println(this.connect.getText());
        if (e.getActionCommand().equals(this.connect.getText())) {
            this.ok = true;
        }
        System.out.println(this.ok);
        this.closeIt();
        System.out.println(this.ok);
    }
}
Aufruf:
Code:
ConnectDialog con = new ConnectDialog(this);
System.out.println("Done:");
System.out.println(con.isOK());
System.out.println(con.getHost());
System.out.println(con.getPort());
System.out.println(con.getNickname());
Ausgabe:
Code:
Verbinden
Verbinden
true
true
true
Done:
OKAY ist: false
false
derhost
40000
dernickname
Gibt es irgendwie Probleme mit Primitiven Datentypen? Werden diese zurückgesetzt und warum?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben