Swing "Tabreihenfolge" (nächstes Element)

Klein0r

Erfahrenes Mitglied
Hallo!

Ich werde hier nirgends fündig und weiß auch nicht so recht nach was ich suchen soll.

Wie lege ich fest welches Element das nächste ist wenn ich Tab drücke.

Also ich habe nen Button im Focus und will beispielsweise auf ne Liste am andern Ende des Frames wechseln oder sonst wohin. Das kann man doch bestimmt festlegen?! Von alleine gehts irgendwie nicht! Also ich kann 100-fach Tab drücken, aber in meine Liste wechselt er nie! Von ner Textbox in den Button daneben erkennt er irgendwie und funkt auch gut!

Wäre euch dankbar wenn ihr mir die etwas blöde Frage verzeiht ;)
Unter vb geht das ganze ja sehr einfach indem man einen TabIndex festlegen kann.

lg
 

Klein0r

Erfahrenes Mitglied
Bin leider erst gerade dazu gekommen das ganze zu testen und es funktioniert wunderbar! Ist ja ehrlich supereinfach wenn man weiß nach was man suchen muss!

Allerdings wunder ich mich, dass man sich eine Methode selbst schreiben muss die sich darum kümmert und so eine Liste erzeugt. So glücklich bin ich damit noch nicht. Vllt habe ich das ganze auch etwas umständlich gemacht (so das es dynamisch wird - was ich eigentlich garnicht brauche).

Ich habe die Methode aus dem Forum im zweiten Link genutzt:
Java:
public class TabTravel {

	public static FocusTraversalPolicy getFocusTraversal(
			final JComponent order[]) {
		FocusTraversalPolicy policy = new FocusTraversalPolicy() {
			java.util.List list = java.util.Arrays.asList(order);

			public java.awt.Component getFirstComponent(
					java.awt.Container focusCycleRoot) {
				return order[0];
			}

			public java.awt.Component getLastComponent(
					java.awt.Container focusCycleRoot) {
				return order[order.length - 1];
			}

			public java.awt.Component getComponentAfter(
					java.awt.Container focusCycleRoot,
					java.awt.Component aComponent) {
				int index = list.indexOf(aComponent);
				return order[(index + 1) % order.length];
			}

			public java.awt.Component getComponentBefore(
					java.awt.Container focusCycleRoot,
					java.awt.Component aComponent) {
				int index = list.indexOf(aComponent);
				return order[(index - 1 + order.length) % order.length];
			}

			public java.awt.Component getDefaultComponent(
					java.awt.Container focusCycleRoot) {
				return order[0];
			}

			public java.awt.Component getInitialComponent(java.awt.Window window) {
				return order[0];
			}
		};
		return policy;
	}
}

und dann meine ganzen elemente im Array übergeben um eine FocusTraversalPolicy zu erhalten.
Java:
		// Tabreihenfolgen wird festgelegt
		FocusTraversalPolicy policy = TabTravel
				.getFocusTraversal(new JComponent[] { this.txtDirectory, this.btnChangeDir,
						this.lstFiles, this.chbShowAll, this.btnSave, this.cmbLang, this.btnExit });
		
		this.setFocusTraversalPolicy(policy);
		this.setFocusCycleRoot(true);

EDIT:

Natürlich ist das ganze mit anonymer Klasse viel kürzer:

Java:
		final JComponent[] order = new JComponent[] { this.txtDirectory, this.btnChangeDir,
						this.lstFiles, this.chbShowAll, this.btnSave, this.cmbLang, this.btnExit };
		
		FocusTraversalPolicy policy = new FocusTraversalPolicy() {
			List<JComponent> list = java.util.Arrays.asList(order);
			
			public Component getFirstComponent(Container focusCycleRoot) {
				return order[0];
			}
			
			public Component getLastComponent(Container focusCycleRoot) {
				return order[order.length - 1];
			}
			
			public Component getComponentAfter(Container focusCycleRoot, Component aComponent) {
				int index = list.indexOf(aComponent);
				return order[(index + 1) % order.length];
			}
			
			public Component getComponentBefore(Container focusCycleRoot, Component aComponent) {
				int index = list.indexOf(aComponent);
				return order[(index - 1 + order.length) % order.length];
			}
			
			public Component getDefaultComponent(
					java.awt.Container focusCycleRoot) {
				return order[0];
			}
			
			public Component getInitialComponent(Window window) {
				return order[0];
			}
		};

lg und dankeschön
 
Zuletzt bearbeitet: