# Problem mit FocusListener und FocusLost



## Meru (16. Dez 2008)

Hallo

Ich will auf meinem Panel mehrere unterschiedliche Textfelder platzieren, die alle in einer etxra Klasse gekapselt sind. Wenn ich mich in einem Textfeld befinde und eine Eingabe mache, soll eine Routine gestartet werden, die den jeweiligen Eintrag auf dessen Richtigkeit hin überprüft. Die Routine etc. funktioniert auch alles und habe ich aus dem unten stehendem Code heraus gelassen.
Der Start der Routine soll dann ausgelöst werden, wenn der Benutzer in das nächste Feld springen will, sei es mit Tabulator oder mit dem Klick einer Maustaste.
Gibt die Routine einen Fehler zurück, dann soll der Benutzer nicht wechseln dürfen solange keine richtige Nummer eingetragen wurde.

Nun zum Problem:
Wenn ich mit Tab oder mit der Maus den Fokus wechsle, dann wird das FocusLost-Event gestartet. Nun sage ich expliziet, dass der Focus innerhalb des Feldes bleiben soll (unten stehender Code). Trotzdem passiert es, dass der Focus ganz ganz ganz kurz in dem 2ten Feld landet, welches ja auch eine Routine hat. Nun passiert folgendes, dass diese beiden sich immer gegenseitig den Focus klauen, solange keine Routine als richtig ausgewiesen wird.

Nun zu meiner Frage:
Wie kann ich verhindern, dass der Focus überhaupt ins 2te Feld gelangt? Der Ablauf, so wie ich es derzeit sehe (Reihenfolge):
1. FocusLost-Event ( EVT) wird ausgelöst
2. In der FocusLost-Methode verlange ich den Focus für dieses Feld
3. Ein FocusLost hat gleichzeitig auch ein FocusGain (?) und wenn das EVT ausgelöst wird, bekommt das 2te Feld auf jedem Fall den Focus? Weil es Teil des EVT (Schritt 1) ist?



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

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


public class FocusTest extends JFrame{
	
	public static void main(String args[]){
		new FocusTest();
	}
	
	public FocusTest() {
		super("FocusTest");
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		initGUI();
	}
	
	private void initGUI(){
		this.setSize(200, 100);
		this.setLayout(new GridLayout(2,1));
		
		this.add(new MyFirstField());
		this.add(new MySecondField());
		
		
		this.setVisible(true);
	}
}


class MyFirstField extends JTextField implements FocusListener{
	
	public MyFirstField() {
		this.addFocusListener(this);
	}

	@Override
	public void focusGained(FocusEvent e) {
		
	}

	@Override
	public void focusLost(FocusEvent e) {
		// mache eine Pruefroutine
		// ...
		// Wenn fehlgeschlagen, dann
		this.requestFocus();
	}
	
}


class MySecondField extends JTextField implements FocusListener{
	
	public MySecondField() {
		this.addFocusListener(this);
	}

	@Override
	public void focusGained(FocusEvent e) {
				
	}

	@Override
	public void focusLost(FocusEvent e) {
		// mache eine Pruefroutine
		// ...
		// Wenn fehlgeschlagen, dann
		this.requestFocus();
	}	
}
```


----------



## Ebenius (16. Dez 2008)

Meru hat gesagt.:
			
		

> [...]Wenn ich mich in einem Textfeld befinde und eine Eingabe mache, soll eine Routine gestartet werden, die den jeweiligen Eintrag auf dessen Richtigkeit hin überprüft.



An dieser Stelle habe ich aufgehört zu lesen. Sag bitte Bescheid, wenn Input Verifier *nicht* der bessere Weg sind, um zu erreichen was Du willst. 

Siehe auch JComponent.setInputVerifier(...)

Grüße, Ebenius


----------



## Meru (17. Dez 2008)

Scheint wohl der bessere Weg zu sein. 
Vielen dank für den Denkanstos


----------

