# FocusLost verhindert selektieren eines Listeneintrags



## Andi_CH (5. Feb 2012)

Ich habe ein kleines GUI mit einigen Eingabefeldern (JTextField) und einer JList in der Dateien angezeigt werden.
(Der Code ist ein wenig zu gross um den hier zu posten, aber vielleicht ist ja meine Beschreibung genügend um das Problem zu erkennen)

In den Feldern kann ich Filterkriterien eingeben und immer bei FocusLost wird der Inhalt der JList angepasst.

Die Auswahl eines Elementes aus der Liste werte ich mit einem ListSelectionListener (valueChanged) aus.

Wenn ich nun einen Listeneintrag anklicke kommt zuerst der ListSelectionListener und danach der FocusListener, weil als Folge des Mausklicks ja eines der Felder den Focus verloren hat. Das hat zur Folge, dass in der Liste kein Element mehr selektiert ist. Erst bei den weiteren Klicks in die Liste verhält sich alles wie gewünscht.

Wie kann ich das verhindern? Eine Statusvariable ist wohl eher suboptimal, weil ich damit die bieden Listenr verbinde, was ich lieber incht möchte.

Das im focusGained anstatt focusLost zu machen ist auch nicht einfach, weil ich im focusLost noch den Wertebereich überprüfe und Werte speichere.

Kann ich im FocusListener abfragen wo der Focus jetzt ist? Wie?


----------



## Andi_CH (6. Feb 2012)

So, mal nach vorne pushen...

Weitere Fragen?

Ist es klar definiert in welcher Reihenfolge die beiden Listener ausgeführt werden?

Es gibt schon die Möglichkeit, die Liste nur neu aufzubauen, wenn sich etwas an den Werten verändert hat, aber das liebe ich auch nicht so - refresh kann manchmal ganz gut sein ...

Hat jemand einen konstruktiven Vorschlag?


----------



## bERt0r (6. Feb 2012)

Wüsste nicht was bei dem Problem so schwer ist, ein KSKB davon zu machen:

```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.Vector;

import javax.swing.AbstractListModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.ListModel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;


public class FocusTest extends JFrame
{
	
	private JPanel contentPane;
	private JTextField textField;
	private JList list;
	private String[] values = new String[] {"Hallo", "Welt", "Wie", "Gehts"};
	private JLabel lblAusgewhlt;
	private JScrollPane scrollPane;
	private JLabel lblAuswahl;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
			{
				public void run()
				{
					try
					{
						FocusTest frame = new FocusTest();
						frame.setVisible(true);
					} catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			});
	}
	
	/**
	 * Create the frame.
	 */
	public FocusTest()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JPanel panel = new JPanel();
		contentPane.add(panel, BorderLayout.CENTER);
		
		JLabel lblFilter = new JLabel("Filter:");
		
		textField = new JTextField();
		textField.addFocusListener(new FocusAdapter() {
			@Override
			public void focusLost(FocusEvent arg0) 
			{
				filterList(textField.getText());
			}
		});
		textField.setColumns(10);
		
		lblAusgewhlt = new JLabel("Auswahl:");
		
		lblAuswahl = new JLabel("");
		GroupLayout groupLayout = new GroupLayout(panel);
		groupLayout.setAutoCreateContainerGaps(true);
		groupLayout.setAutoCreateGaps(true);
		groupLayout.setHorizontalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
						.addComponent(lblAusgewhlt)
						.addComponent(lblFilter))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
						.addComponent(textField)
						.addComponent(lblAuswahl))
					.addContainerGap())
		);
		groupLayout.setVerticalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addContainerGap()
					.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
						.addComponent(lblFilter)
						.addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
					.addPreferredGap(ComponentPlacement.RELATED)
					.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
						.addComponent(lblAusgewhlt)
						.addComponent(lblAuswahl))
					.addContainerGap(209, Short.MAX_VALUE))
		);
		panel.setLayout(groupLayout);
		
		scrollPane = new JScrollPane();
		scrollPane.setPreferredSize(new Dimension(150, 200));
		contentPane.add(scrollPane, BorderLayout.WEST);
		
		list = new JList();
		list.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) 
			{
				Object o=list.getSelectedValue();
				if(o!=null)
				{
					lblAuswahl.setText(list.getSelectedValue().toString());
				}
				else
				{
					lblAuswahl.setText(null);
				}
			}
		});
		scrollPane.setViewportView(list);
		list.setModel(new AbstractListModel() {
			public int getSize() {
				return values.length;
			}
			public Object getElementAt(int index) {
				return values[index];
			}
		});
	}

	protected void filterList(String text)
	{
		final Vector<String> newData = new Vector<String>();
		for (String s : values)
		{
			if (s.contains(text))
			{
				newData.add(s);
			}
		}
		
		ListModel model = new AbstractListModel()
			{
				Vector<String> v = newData;
				
				public int getSize()
				{
					return v.size();
				}
				
				public Object getElementAt(int index)
				{
					return v.get(index);
				}
			};
		
		Object o = list.getSelectedValue();
		list.setModel(model);
		list.setSelectedValue(o, true);
		
	}
}
```
Läuft auch alles.


----------



## Andi_CH (6. Feb 2012)

So weit habe ich logischerweise auch zum Laufen gebracht. Es fehlt ja genau der kritische Punkt, dass beim Wechseln in ein zweites Eingabefenster auf FocusLost die Liste neu aufgebaut wird

Es macht auch nicht alles. Auf den ersten Blick fehlt ja genau der kritische Punkt, dass beim Eingeben eines Wertes mit nachfolgendem FocusLost die Liste verändert wird. Um das nahzustellen braucht es mindestens zwei Eingabefelder - ich bin mal am Basteln.


----------



## bERt0r (6. Feb 2012)

Die Liste wird neu aufgebaut sobald du tab drückst oder ausserhalb des Feldes klickst. Dafür ist die methode filterList da. Und dieser ausschnitt sichert zu, dass das gleiche Element wie vorher selektiert wird:

```
Object o = list.getSelectedValue();
		list.setModel(model);
		list.setSelectedValue(o, true);
```
*wiederliebsei*


----------



## Andi_CH (6. Feb 2012)

Hat was - mal sehen ob ich mit Reverseengineering ans Ziel komme...

Ansonste poste ich dann halt mein MSKB (M = Mittelgross) hier und frage nach dem Unterschied.


----------



## SlaterB (6. Feb 2012)

bERt0r hat gesagt.:


> Wüsste nicht was bei dem Problem so schwer ist, ein KSKB davon zu machen:





bERt0r hat gesagt.:


> Blödsinn, [..]


den ersten Satz schreibe ich so ähnlich ja manchmal auch, zusammen mit dem zweiten Posting klingt das aber langsam aggressiv,
da möchte ich als Moderator zur Zurückhaltung mahnen :shock:


----------



## Andi_CH (6. Feb 2012)

Ich bin noch daran das ganze zu Verdauen - soooo einfach ist es nicht zu verstehen warum es hier tut und bei meinem Code zuhause nicht.

z.B. Warum zwei verschiedene Models? Warum gehts mit dem DefaultListModel das ich aus einem Beispiel übernommen habe hier nicht? - Fragen über Fragen ;-)

@SlaterB: Etwaige Untertöne habe ich übersehen


----------



## KrokoDiehl (6. Feb 2012)

Ein anderer Ansatz als ein FocusListener wäre ein InputVerifier. Vielleicht hilft der weiter.


----------



## Andi_CH (6. Feb 2012)

KrokoDiehl hat gesagt.:


> Ein anderer Ansatz als ein FocusListener wäre ein InputVerifier. Vielleicht hilft der weiter.



"to ensure that the text entered by the user is valid" - das mache ich von Hand (Ich habe Datumsfelder die man eingeben kann) hat der sonst noch Vorteile?

Mein Problem ist ja, dass ich in meiner Originalsoftware zwei Events bekomme

- valueChanged der Liste und danach
- focusLost des Feldes, welches mir die Liste aktualisiert und somit das selektierte Element löscht

"the focus is transfered normally" - es ist ja ein ganz normaler "Transfer" von einem Eingabefeld zur Liste der mich beübt ...

Ich verstehe noch nicht wie mir der Verifiyer dabei helfen könnte.


----------



## KrokoDiehl (6. Feb 2012)

Der Verifier (am TextField) wird vor dem FocusListener aufgerufen. Damit kannst du eine andere Reihenfolge der "Ereignisse" erreichen. In deinem Fall würde er (der Verifier) halt nicht das tun, was sein Name suggeriert.


----------



## Andi_CH (6. Feb 2012)

Ich mach einen neuen Post weil das unabhängig ist:

Software minim umgebaut - der Teilstring den man eingibt, muss im Listeneintrag vorkommen. (Nicht case sensitiv)

Also starten
w eingeben
FocusLost forcieren - es bleiben "Welt" und "Wie"
e eingeben und den Listeneintrag Wie anklicken -> Null!
In dem Fall dürfte die Liste nicht mehr aktualisiert werden.




```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.Vector;

import javax.swing.AbstractListModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.ListModel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;


@SuppressWarnings("serial")
public class FocusTest extends JFrame {

	private class TheFocusListener extends FocusAdapter {
		@Override
		public void focusLost(FocusEvent arg0) {
			String eingabe = ((JTextField)arg0.getSource()).getText();
			System.out.println("focusLost() - Eingabe = " + eingabe);
			filterList(eingabe);
		}
	}

	private class TheListSelectionListener implements ListSelectionListener {

		public void valueChanged(ListSelectionEvent e) {
			Object o=list.getSelectedValue();
			if(o!=null) {
				System.out.println("TheListSelectionListener.valueChanged() - " + list.getSelectedValue().toString());
				lblAuswahl.setText(list.getSelectedValue().toString());
			} else {
				System.out.println("TheListSelectionListener.valueChanged() - null");
				lblAuswahl.setText(null);
			}
		}
	}

	private class TheListModel extends AbstractListModel {

		final Vector<String> v;

		public TheListModel(Vector<String> data) {
			v = data;
		}

		public int getSize() {
			return v.size();
		}

		public Object getElementAt(int index) {
			System.out.println("TheListModel.getElementAt(" + index + ") = " + v.get(index));
			return v.get(index);
		}
	};

	private JPanel contentPane;
	private JTextField textField;
	private JList list;
	private String[] valuesString = new String[] {"Hallo", "Welt", "Wie", "Gehts"};
	private final Vector<String> values;
	private JLabel lblAusgewhlt;
	private JScrollPane scrollPane;
	private JLabel lblAuswahl;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) 	{
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					FocusTest frame = new FocusTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public FocusTest() {
		values = new Vector<String>();
		for (String s : valuesString) {
			values.add(s);
		}
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);

		JPanel panel = new JPanel();
		contentPane.add(panel, BorderLayout.CENTER);

		JLabel lblFilter = new JLabel("Filter:");

		textField = new JTextField();
		textField.addFocusListener(new TheFocusListener());
		textField.setColumns(10);

		lblAusgewhlt = new JLabel("Auswahl:");
		lblAuswahl = new JLabel("");
		GroupLayout groupLayout = new GroupLayout(panel);
		groupLayout.setAutoCreateContainerGaps(true);
		groupLayout.setAutoCreateGaps(true);
		groupLayout.setHorizontalGroup(
				groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
						.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
								.addComponent(lblAusgewhlt)
								.addComponent(lblFilter))
								.addPreferredGap(ComponentPlacement.RELATED)
								.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
										.addComponent(textField)
										.addComponent(lblAuswahl))
										.addContainerGap())
		);
		groupLayout.setVerticalGroup(
				groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
						.addContainerGap()
						.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
								.addComponent(lblFilter)
								.addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
								.addPreferredGap(ComponentPlacement.RELATED)
								.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
										.addComponent(lblAusgewhlt)
										.addComponent(lblAuswahl))
										.addContainerGap(209, Short.MAX_VALUE))
		);
		panel.setLayout(groupLayout);

		scrollPane = new JScrollPane();
		scrollPane.setPreferredSize(new Dimension(150, 200));
		contentPane.add(scrollPane, BorderLayout.WEST);

		list = new JList();
		list.addListSelectionListener(new TheListSelectionListener());
		scrollPane.setViewportView(list);
		list.setModel(new TheListModel(values));
	}

	protected void filterList(String text) {
		System.out.println("filterList() - " + text);
		final Vector<String> newData = new Vector<String>();
		for (String s : values) {
			if (s.toLowerCase().contains(text.toLowerCase())) {
				newData.add(s);
			}
		}
		ListModel model = new TheListModel(newData);
		Object o = list.getSelectedValue();
		list.setModel(model);
		list.setSelectedValue(o, true);
	}
}
```


----------



## bERt0r (6. Feb 2012)

Ich hab dein Beispiel durchgespielt, und bei mir kommt kein null und es werden auch Welt, Wie und Gehts angezeigt in der Liste. Und Wie ist selektiert. Java 7, Win XP


----------



## Andi_CH (7. Feb 2012)

1. Einfach meine Version der Software, ist als Anhang dabei, laufen lassen - z.B. aus Eclipse

2. Im Filterfeld "w" eingeben (Ist nicht casesensitiv)

3. Focus Lost provozieren indem man z.B. "Tab" drückt -> Die Liste wird angepasst, es sind nur noch "Welt" und "Wie" drin

4. Focus zurück ins Filterfeld der Applikation und *zusätzlich* ein "e" eingeben - Das Filterfeld enthält nun "we", die Liste zeigt nach wie vor "Welt" und "Wie"

5. Ohne "Focus lost" den Eintrag "Wie", der eben nicht mehr ins Filtermuster passt, weil er kein "we" enthält, anklicken - Auf der Konsole kommt die Ausgabe "TheListSelectionListener.valueChanged() - null" - also der Listener liefert als selektiertes Element ein "null" weil zwischen Mausklick und Abfrage welches Element selektiert ist ein Listenupdate erfolgt, welcher stört.

Auch hier kommen eben zwei Events in störender Reihenfolge - die Liste dürfte nicht mehr aktualisiert werden

Also entweder muss das FocusLost Event irgendwie unterdrückt werden oder der FocusListener muss feststellen können, dass der Focus jetzt in der Liste ist und eben schlicht nichts tun, ausser vielleicht den Wert des Filterfensters wieder auf den letzten Wert zu setzen. Wobei sich der Kreis schliesst 



Andi_CH hat gesagt.:


> Kann ich im FocusListener abfragen wo der Focus jetzt ist? Wie?


----------



## bERt0r (7. Feb 2012)

Darum steht in meinem Code ja auch:

```
list.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) 
            {
                Object o=list.getSelectedValue();
                if(o!=null)
                {
                    lblAuswahl.setText(list.getSelectedValue().toString());
                }
                else
                {
                    lblAuswahl.setText(null);
                }
            }
        });
```
Du kannst ganz einfach im SelectionListener abfragen ob es eine selektion gibt oder nicht.


----------



## Andi_CH (7. Feb 2012)

Andi_CH hat gesagt.:


> Kann ich im *FocusListener* abfragen wo der Focus jetzt ist? Wie?



Das muss im FocusListener gemacht werden, weil der sonst was tut was er nicht soll ;-)
(Liste aktualisieren)
Die JList (list) sollte man doch irgendiwe anfragen können ob der Focus da ist?
Oder muss man das bei der ScrollPane tun?


So nebenbei - entweder als Erheiterung oder um sich wieder mal ein wenig zu nerven:

Beispiel für einen [IRONIE]absolut genialen[/IRONIE] / [REALITAET]absolut unbrauchbaren[/REALITAET] Kommentar


```
/**
     * Returns true if this <code>Component</code> is the 
     *    focus owner.
     *
     * @return <code>true</code> if this <code>Component</code> is the 
     *     focus owner; <code>false</code> otherwise
     * @since 1.4
     */
    public boolean isFocusOwner() {
        return hasFocus();
    }
```

(Diese Funktion muss funktioniert weil sie Funktion heisst .... ts ts ts)


----------



## bERt0r (7. Feb 2012)

Was ist jetzt eigentlich dein Problem? Wenn du ein Item Selektieren willst, das es später nicht mehr gibt ist es doch gewünscht dass die Selektion null ist.


----------



## Andi_CH (7. Feb 2012)

Nein ganz sicher nicht! Ich will, dass beim Klick in die Liste jede Änderung zwischen dem letzten gewollten focusLost und dem Klick in die Liste wirkunglos sind - das entspricht dem natürlichen Verhalten eines Sachbearbeiters bei uns

(In der "echten" SW sind das mehrere Felder - Tag, Monat, Jahr und noch einige mehr)

Er gibt einen Teil des Filterkriterums ein (z.B. die Jahreszahl) und drückt Tab
 -> Focus im Monatsfeld, Liste angepasst
Er gibt den Monat ein und drückt Tab
 -> Focus im Tagesfeld, Liste angepasst
Er gibt irgendetwas in das Tagesfeld ein und während dem Tippen sieht er den gesuchten Eintrag bereits in der Liste und klickt den an -> Die Liste darf NICHT mehr verändert werden bei dieser Aktion.

Bei jedem anderen Verhalten dauert es keine Stunde und mein Telefon klingelt :-(

Wenn ich meinen Bildschirm filmen könnte, würde ich ja einen Film einstellen und könnte mir viel Tipparbeit ersparen ;-)


----------



## KrokoDiehl (7. Feb 2012)

Hm... so ein Abbruch des Filterns... ich glaube dann müsstest du im FocusLost-Event schon direkt prüfen, was die Gegenkomponente ist. Der FocusEvent hat die Methode 
	
	
	
	





```
getOpposite()
```
 (oder so), damit kann man dann prüfen wer den Fokus bekommt und ggfs. nicht filtern. Hilft das?

Das scheint mir aber kein Standardverhalten zu sein, vor allem weil es dann die Inkonsistenz gibt, dass im Filter-Feld "we" steht in der Liste aber noch "wie" angezeigt wird.


----------



## Andi_CH (7. Feb 2012)

Genau darauf lief es ja hinaus - ich frage "wer hat den Focus" - nur stimmt das eben vermutlich auch noch nicht, weil der Focus da möglicherweise "noch nicht angekommen" ist (doofe Formulierung  )

Es gibt nur eine Standardverhalten und das ist das wie der Benutzer damit umgeht.

Die angefügte Lösung ist etwas unschön, weil eine, aus Sicht der Listener globale, Variable zur Verriegelung eingesetzt wird, aber das Verhalten ist exakt das was ich will.

Einfach Laufen lassen einzelbuchstaben eingeben Tab-en bis man wieder im Eingabefeld ist, irgend einen weiteren (sinnlosen?) Buchstaben anhängen und dann ohne Tab in die Liste klicken.

Also ich finde das Verhalten sehr intuitiv ...

EDIT: Eben hat das Telefon geklingelt. Aussage des "Obersachbearbeiters": "Nein es ist ein Muss dass unbestätigte Eingabefelder verworfen werden, das machen alle unsere Applikationen so". Hm ... kenne ich also meine Pappenheimer doch


----------



## bERt0r (7. Feb 2012)

Das is jetzt aber nicht das Problem oder? textField.setText(letzteEingabe);


----------



## KrokoDiehl (7. Feb 2012)

Gut gut, was sein muss, das muss wohl sein. Aber ich sehe kaum eine andere Möglichkeit dies zu lösen. Wie ist denn festgelegt, was eine "unbestätigte" Eingabe ist? Da es kein Button á la "Speichern" oder "Filtern" gibt und anhand deiner bisherigen Ausführungen schließe ich, dass folgende "Definition" gilt:
- Textfeld mit Tastatur (z.B. Tab / Shift+Tab / ...) verlassen => Eingabe bestätigt
- Textfeld mit Maus verlassen (d.h. Klick woanders hin) => Eingabe verworfen

Wenn das stimmt wäre ggfs. ein anderer Weg herauszufinden was den Fokuswechsel verursacht (Mouse- oder KeyEvent) hat. Da bin ich aber auch nicht firm drin (ok, derzeit zu faul zum schauen ;-) ), wie das genau geht.
Ansonsten ... wenn deine Lösung geht und es das ist was alle wollen und sonst niemandem was besseres einfällt ... klingt nach der Ideallösung ;-)


----------



## Andi_CH (9. Feb 2012)

@bERt0r - Du hast mich zwischen den Zeile von Anfang an als doof / blöd oder beides bezeichnet und ich habe das geflissentlich überlesen und werde das auch weiterhin tun.
Dein Vorschlag hat mich zwar annährend auf die richtige Spur geführt, mehr aber auch nicht. Das lag vor allem daran, dass du recht oberflächlich gelesen und SEHR viel interpretiert hast, was naturgemäss in den meisten Fällen am Ziel vorbeiführt.

Lass einfach mal die letzte Version der SW laufen die ich als Attachment angefügt habe. Genau so muss sich die SW verhalten, denn genau so gehen die Sachbearbeiter auch mit den anderen Masken um, mit denen sie sonst noch arbeiten.

@KrokoDiehl (und alle anderen die es interessert) - Mit dem 
	
	
	
	





```
getOpposite()
```
 bekommt man es sauber hin.
Im FokusListener prüfe ich, ob das was getOpposite() liefert zum InOutPanel (so heisst das halt bei mir) gehört - das sind 6 Eingabefenster und zwei Knöpfe und kann direkt mit == verglichen werden.
(Na ja, für mich war das nicht ganz klar - ich versuchte erst instanceof aber == ist einfacher)

Wenn die Liste oder sonst etwas (z.B. Eclipse bei einem Breakpoint  ) den Fokus bekommt, kommt entweder die Liste oder null daher und das gehört bei mir beides nicht zum Panel.

Wenn ich es geschafft hätte im Beispiel ein zweites Eingabefenster einzubauen, dann .... aber dafür war ich wohl zu blöd. Der Codeteil sieht für mich extrem kryptisch aus (Man muss ja irgendwie seinem Ruf gerecht werden... ;-) )


EDIT: Aktuellste Version angehängt


----------



## bERt0r (9. Feb 2012)

Also ich hab dich niemals als blöd oder doof bezeichnet, mein "Blödsinn" bezog sich darauf, dass du gesagt hast die Liste würde sich in meinem FÜR DICH erstellten KSKB nicht neu aufbauen wenn das Eingabefenster den Fokus verliert. Wenn du dein Problem nicht genau oder gar nicht beschreibst und kein KSKB postest, muss man eben raten wenn man dir helfen will. Will ich mittlerweile nicht mehr.
Viel glück!


----------

