FocusAbfrage innerhalb eines JDialogs

Hm, alle Componenten müsstest du eigentlich mit "Component[] getComponents()" erreichen können.

Danke schon mal für Deine Hilfe. Aber ich möchte die Prüfung durchführen, wenn das Feld den Fokus verliert. Ich habe das in der Methode focusLost implementiert, aber das klappt irgendwie nicht. Hast Du noch eine Idee?[

*grübel* Genau das Macht das Programm doch... wenn eines der Felder Straße, PLZ und Ort den Focus verliert, wird die Überprüfung durchgeführt. Natürlich wird auch eine Boolean Variable gesetzt, ob diese Felder überhaupt schoneinmal den Focus hatten.

Code:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;


public class FocusTest extends JFrame implements FocusListener {


    private GridBagLayout gbl = new GridBagLayout();
    private boolean firstVisit = false;
    private JTextField txtFieldFirstName = new JTextField(10);
    private JTextField txtFieldLastName = new JTextField();
    private JTextField txtFieldStreet = new JTextField();
    private JTextField txtFieldZip = new JTextField();
    private JTextField txtFieldPlace = new JTextField();
    private JLabel lblFirstName = new JLabel("First Name:");
    private JLabel lblLastName = new JLabel("Last Name:");
    private JLabel lblStreet = new JLabel("Street:");
    private JLabel lblZip = new JLabel("ZIP:");
    private JLabel lblPlace = new JLabel("Place:");


    FocusTest() {

        super("FocusTest");
        initializeComponents();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }


    private void initializeComponents() {

        setLayout(gbl);

        txtFieldFirstName.addFocusListener(this);
        txtFieldLastName.addFocusListener(this);
        txtFieldStreet.addFocusListener(this);
        txtFieldZip.addFocusListener(this);
        txtFieldPlace.addFocusListener(this);

        gbl.setConstraints(lblFirstName, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0));
        gbl.setConstraints(txtFieldFirstName, new GridBagConstraints(1, 0, 1, 1, 2, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(10, 0, 0, 10), 0, 0));
        gbl.setConstraints(lblLastName, new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 10, 0, 10), 0, 0));
        gbl.setConstraints(txtFieldLastName, new GridBagConstraints(1, 1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 0, 10), 0, 0));

        gbl.setConstraints(lblStreet, new GridBagConstraints(0, 2, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0));
        gbl.setConstraints(txtFieldStreet, new GridBagConstraints(1, 2, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(10, 0, 0, 10), 0, 0));
        gbl.setConstraints(lblZip, new GridBagConstraints(0, 3, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 10, 0, 10), 0, 0));
        gbl.setConstraints(txtFieldZip, new GridBagConstraints(1, 3, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 0, 10), 0, 0));
        gbl.setConstraints(lblPlace, new GridBagConstraints(0, 4, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 10, 10, 10), 0, 0));
        gbl.setConstraints(txtFieldPlace, new GridBagConstraints(1, 4, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 0, 10, 10), 0, 0));

        add(txtFieldFirstName);
        add(txtFieldLastName);
        add(txtFieldStreet);
        add(txtFieldZip);
        add(txtFieldPlace);

        add(lblFirstName);
        add(lblLastName);
        add(lblStreet);
        add(lblZip);
        add(lblPlace);
    }


    private void showInfo() {


        JOptionPane.showMessageDialog(this, "Check Data for Street, Zip and Place", "Validate", JOptionPane.INFORMATION_MESSAGE);
        firstVisit = false;
    }


    public void focusGained(FocusEvent e) {

        Object o = e.getSource();

        if(o.equals(txtFieldStreet)) { firstVisit = true; }
        else if(o.equals(txtFieldZip)) { firstVisit = true; }
        else if(o.equals(txtFieldPlace)) { firstVisit = true; }
        else if(o.equals(txtFieldFirstName) && firstVisit) { showInfo(); }
        else if(o.equals(txtFieldLastName) && firstVisit) { showInfo(); }
    }


    public void focusLost(FocusEvent e) {

    }

    public static void main(String args[]) {

        new FocusTest();
    }
}

---
Moment, irriertiert dich der Umstand, dass bei meinem Beispiel die focusLost Methode Leer ist? Meinst du das mit "wenn das Feld den Focus verliert" ? Du kannst es leider nicht mit focusLost lösen, denn wenn du auf FocusLost reagierst, weißt du nicht, ob nicht eine der drei Komponenten als nächstens den Focus erhält. Wechselst du zB von Straße zu PLZ wird zuerst die FocusLost Methode und anschließend erst die FocusGained Methode. Und beim Aufruf von FocusLost weißt du ja noch nicht, welche Componente im Moment den Focus hat.
 
Zuletzt bearbeitet:
Jau das hilft mir auf jeden Fall weiter. Ein Problem habe ich allerdings immer noch. Wenn ich nun aus den 3 Feldern auf eine andere Komonente klicke, klappt das bestens. Aber wenn ich den Dialog schliesse, wird die Prüfung nicht durchgeführt. Kann man das Schliessen mit Hilfe des Kreuzes rechts oben in der Maske irgendwie abfangen oder kann man dieses Kreuz ausblenden?
 
Da hast du zwei Möglichkeiten, entweder weißt dem Dialog einen WindowListener zu und reagierst dort entsprechend auf das Schließen des Fenster oder du benutzt die Methode setDefaultCloseOperation(int operation). Diese kann folgende Werte annehmen:

DISPOSE_ON_CLOSE
DO_NOTHING_ON_CLOSE (das was du suchst).
EXIT_ON_CLOSE
HIDE_ON_CLOSE

Bps.
Code:
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
 
Hallo. Danke nochmal für Deine Ausdauer. Könntest Du mir mal ein ausführliches Beispiel für den von Dir erwähnten WindowsListener posten?:rolleyes:
 
Hier ein Beispiel. Ich sehe aber gerade dass damit das schließen des Fensters nicht unterdrückt wird, aber du kannst vor dem schließen noch eine Überprüfung laufen lassen. Am Besten wäre es, du setzt setDefaultCloseOperation(int) auf DO_NOTHING_ON_CLOSE und überschreibst wie folgt die Methode:

Code:
    public void windowClosing(WindowEvent e) {

        if(Eingaben gültig) setVisible(false);
        else ... Fehlermeldung
    }


Code:
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JTextField;


public class WindowListenerExample extends JFrame implements WindowListener {


    private JTextField txtField = new JTextField();


    WindowListenerExample() {

        super("WindowsListenerExample");
        addWindowListener(this);
        add(txtField);
        pack();
        setVisible(true);

    }


    public void windowActivated(WindowEvent e) {

        txtField.setText("windowActivated");
    }


    public void windowClosed(WindowEvent e) {

        txtField.setText("windowClosed");
    }


    public void windowClosing(WindowEvent e) {

        txtField.setText("windowClosing");
    }


    public void windowDeactivated(WindowEvent e) {

        txtField.setText("windowDeactivated");
    }


    public void windowDeiconified(WindowEvent e) {

        txtField.setText("windowDeiconified");
    }


    public void windowIconified(WindowEvent e) {

        txtField.setText("windowIconified");
    }


    public void windowOpened(WindowEvent e) {

        txtField.setText("windowOpened");
    }


    public static void main(String args[]) {

        new WindowListenerExample();
    }
}
 
Zurück