focusLost() soll nur 1 Meldung bringen

MScalli

Erfahrenes Mitglied
Hi Leutz.
Ich wil beim verlassen eines Textfeldes ein JOptionPane aufrufen und dann wieder in das Textfeld springen. Dieses MUSS mit focusLost() geschehen.

Da ist normalerweise eine Abfrage drin aber ich habs jetzt mal auf ein minimales zusammengefasst und ein ausführbares Prog erstellt damit Ihr wisst was ich meine.

Wegen der JOptionPane wird die Methode focusLost aber immer 2 mal aufgerufen..
weiss wer nen rat

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

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


public class FocusLostTest extends JFrame{


	JTextField tf, tf2;
	
	public FocusLostTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(800, 600);
        setLocationRelativeTo(null);
        JPanel panel = new JPanel();
        this.add(panel);
        this.setLayout(null);

        
		tf = new JTextField();
		tf.setBounds(20, 20, 200, 20);
		this.add(tf);
		
		tf.addFocusListener(new FocusListener() {
			public void focusGained(FocusEvent arg0) {
			}

			public void focusLost(FocusEvent arg0) {

				// Hier kommt normalerweise eine abfrage.. hab ich mal raus!! 
				// heisst bei falscher eingabe soll Meldung erzeugt werden und Cursor im Textfeld bleiben

		    	tf.requestFocus();
		    	JOptionPane.showMessageDialog(null, "text", "Fehler", 2);
			}
		});
        
		tf2 = new JTextField();
		tf2.setBounds(20, 50, 200, 20);
		this.add(tf2);
        
        this.setVisible(true);
	}
	
	public static void main(String[] args) {
		new FocusLostTest();
	}
}
 
Des Rärtsels Lösung

Component component = null;

if (EventQueue.getCurrentEvent() instanceof FocusEvent && ((FocusEvent)EventQueue.getCurrentEvent()).getOppositeComponent() != null){
component = ((FocusEvent)EventQueue.getCurrentEvent()).getOppositeComponent();
component.setFocusable(false);
}

JOptionPane.showMessageDialog(null, "text", "Fehler", 2);

tf.requestFocus();
if (component != null){
component.setFocusable(true);
}
 
Zuletzt bearbeitet:
Oder so:
Code:
tf.addFocusListener(new FocusListener() {
    private boolean dialogShown;
    public void focusGained(FocusEvent arg0) {
    }
    public void focusLost(FocusEvent arg0) {
        if (tf.getText().equals("") && !dialogShown) {
            dialogShown = true;
            JOptionPane.showMessageDialog(null, "text leer", "Fehler", 2);
            tf.requestFocusInWindow();
        }else{
            dialogShown = false;
        }
    }
});
Diese Art der Validierung kann erfolgen, indem man einen FocusListener verwendet, um das focusLost Ereignis zu behandeln. Jedoch ab JDK1.3 kann ein besserer Ansatz verwendet werden, nämlich der InputVerifier. Der InputVerifier wird aufgerufen, wenn die Textkomponente den Fokus verliert. Das Gute daran ist, dass der Fokus zur Textkomponente zurückgebracht wird, wenn der Validierungscode fehlschlägt. Überprüfe das Tutorial unten für eine bessere Erklärung und einem funktionierenden Beispiel:
http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html#inputVerification
Code:
tf.setInputVerifier(new InputVerifier() {
    @Override
    public boolean verify(final JComponent input) {
        if (tf.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "text leer", "Fehler", 2);
            return false;
        }
        return true;
    }
});
 
Zuletzt bearbeitet:
Zurück