Focus Listener(Focus lost)

BLOEBAUM

Erfahrenes Mitglied
Hallo,

ich möchte in einer Swing Anwendung in einem Eingabefeld eine korrekte Eingabe erzwingen. Dazu habe ich einen Fokus Listener implementiert.
Im Ereignis Focus Lost habe ich bei Fehleingaben einen requestFokus auf dieses Eingabefeld gesetzt und gebe eine Fehlermeldung aus.
Diese Fehlermeldung kommt jedoch mehrfach!.
Ich habe in der Zwischenzeit keine Möglichkeit, den Wert im Eingabefeld zu korrigieren.
Warum wird das Ereignis Fokus Lost ein zweites, drittes und viertes Mal durchlaufen, obwohl ich keine Eingaben vornehme.

Frage zwei: Erkenne ich im Ereignis "Fokus Lost" , wenn der Anwender eine andere Taste (z. B. EXIT) gedrückt hat, damit das Programm z. B. beendet werden kann.
Momentan muss der Wert des Feldes korrekt eingegeben werden, erst dann zündet die EXIT Taste.

Programmauszug:
Code:
jTDatum.addFocusListener(new java.awt.event.FocusAdapter() { 
public void focusLost(java.awt.event.FocusEvent e) {    
Datumsroutinen daro	= new Datumsroutinen();
	try {
		if (daro.pruefeDatum(jTDatum.getText()) == true)
			{
			if (daro.pruefeDatumKleinerHeute(jTDatum.getText()) == false)
				{
			JOptionPane.showMessageDialog(getParent(), "Wann willst du dir was kaufen?");	
//			Fokus bleibt auf diesem Feld
			jTDatum.requestFocus();
			}
		}
		else
		{
		JOptionPane.showMessageDialog(getParent(), "bitte Datum korrekt eingeben");	
//		Fokus bleibt auf diesem Feld
		jTDatum.requestFocus();
			}	
	} catch (Exception ed) {
		ed.printStackTrace();
		jTDatum.requestFocus();
		JOptionPane.showMessageDialog(getParent(), "bitte Datum korrekt eingeben");	
			}
			}
});
 
Zuletzt bearbeitet von einem Moderator:
Moin,
um korrekte Eingaben abzufragen, gibt es mehrere Möglichkeiten, z.B. InputVerifier (prüft erst beim Verlassen des Feldes) oder Document (prüft direkt bei der Eingabe). Bei Datumseingaben kann man sich allerdings beliebig schwer tun und in beliebige Fallen rennen (z.B. 31.02. verhindern).
Mein Vorschlag lautet daher: Nimm lieber eine fertige Komponente, z.B. den
JDateTimePicker, hier z.B. zu finden: http://www.javable.com/eng/code/
 
Hallo Snape,

danke für die schnelle Antwort.
Mit der Datumsprüfung hatte ich eigentlich schon gelöst (Sourcecode sieh unten),
oder spricht aus der Sicht des Profis etwas dagegen (ich bin da noch absoluter Anfänger).
Der 31.02 wird dabei jedenfalls abgefangen.
Der InputVerifier ist bestimmt die Lösung, die ich gesucht habe.
Trotzdem würde mich mal interessieren, warum der Fokus bei meiner obigen Lösung mehrfach auf das Feld zurückgesetzt wird, ohne dass mir die Möglichkeit gegeben wird eine Eingabe vorzunehmen.
Was plaziert man den im FokusLost?

Gibt es eine Möglichkeit in einem Textfeld einen Betrag mit einem Komma als Dezimalpunkt einzugeben und dafür zu sorgen,
dass der Double.parseDouble(jTWert.getText() funktioniert.
Ausserdem sollen nur 2 Nachkommastellen erlaubt sein!

Problem: Der Dezimalpunkt soll als Komma eingegeben werden!!


//******************************************************
// Methode zur Gültigkeitsprüfung eines Datums
//******************************************************
public boolean pruefeDatum (String datum ) throws Exception
{

//eine auf die Rechnerlokation abgestimmte Instanz der Klasse
//DateFormat wird erzeugt.
DateFormat df = DateFormat.getDateInstance();

//strenge Datumsprüfung einschalten
df.setLenient(false);

//Datum überprüfen und in ein Date Objekt wandeln.
//Die Methode parse() wirft eine ParseException, wenn in
//datum kein gültiges Datum steht.
try
{
Date d = df.parse(datum);
System.out.println("Datum: " +d);
return true;
}
catch (ParseException e)
{
return false;
}

}:


Danke für die Unterstützung

Harald Blöbaum
 
>Mit der Datumsprüfung hatte ich eigentlich schon gelöst (Sourcecode sieh unten),
oder spricht aus der Sicht des Profis etwas dagegen (ich bin da noch absoluter Anfänger).

Nö, sieht OK aus. Es gibt eigentlich immer mehrere Lösungsmöglichkeiten.

>Der InputVerifier ist bestimmt die Lösung, die ich gesucht habe.

Du kannst ihn Dir ja näher anschauen.

>Trotzdem würde mich mal interessieren, warum der Fokus bei meiner obigen Lösung mehrfach auf das Feld zurückgesetzt wird, ohne dass mir die Möglichkeit gegeben wird eine Eingabe vorzunehmen.

K.A.

>Was plaziert man den im FokusLost?

Habe ich noch nie benutzt... ;)

>Gibt es eine Möglichkeit in einem Textfeld einen Betrag mit einem Komma als Dezimalpunkt einzugeben und dafür zu sorgen,
dass der Double.parseDouble(jTWert.getText() funktioniert.

Nicht direkt, das Komma muss schon in einen Punkt konvertiert werden. Wir haben das z.B. über ein Document gelöst. Hierbei wird ein eingegebenes Komma automatisch direkt bei der Eingabe in einen Punkt umgewandelt.

>Ausserdem sollen nur 2 Nachkommastellen erlaubt sein!

Auch sowas lässt sich mit einem Document erledigen.

>Problem: Der Dezimalpunkt soll als Komma eingegeben werden!!

S.o.? Oder soll das Komma sichtbar bleiben? Wenn ja, dann geht mein obiger Vorschlag natürlich nicht. Dann musst Du den Inhalt auslesen und vor dem Double-Parsen das Komma durch Punkt ersetzen. (API, Klasse String, replace() / replaceAll()).
 
Hallo Snape,

mit dem InputVerifier läuft super. Habe alle FocusListener rausgenommen und durch InputVerifier ersetzt..
Das Problem mit der mehrfachen Anzeige der Fehlermeldung auf einem Feld hatte ich auch beim InputVerifier. Habe ich durch die Abfrage "if (jTWert.getText().length() > 0)<" gelöst.
Programm läuft jetzt so , wie es soll.
Danke noch einmal für die vielen Tipps.

Harald

// ##### Start Input Verifier
jTWert.setInputVerifier(new InputVerifier() {
public boolean verify(JComponent input) {
// Zuerst wird das Dezimalkomma (Deutschland) durch den Dezimalpunkt (USA) ersetzt
jTWert.setText(jTWert.getText().replaceFirst(",", "."));

// Ist der eigegebene Wert korrekt?
try {
if (Double.parseDouble(jTWert.getText()) > 0)
{
}
else
{
if (jTWert.getText().length() > 0)
{
JOptionPane.showMessageDialog(getParent(), "bitte Wert korrieren(z.B. 123,45");
}
return false;
}
}catch ( NumberFormatException ex )
{
// Fokus auf ein Feld setzten
if (jTWert.getText().length() > 0)
{
JOptionPane.showMessageDialog(getParent(), "error bitte Wert korrieren(z.B. 123,45");
}
return false;
}
// Ende Werteprüfung

return true;
}
});
//##### Ende Input Verifier
 
Zurück