Swing KeyBindings

jf

Bekanntes Mitglied
Ich habe nun für die Verwendung von HotKeys verschiedene KeyBindings in meiner Anwendung eingeführt.

Nun habe ich da aber noch ein Problem bei einem JTabbedPane und einer JList:
Beim JTabbedPane will ich die Nach-Links- und Nach-Rechts-Tastenschläge überschreiben. (mit dem Ziel, das die Tabs zwar auch immer noch gewechselt werden, aber wenn man am Ende angelengt ist, dass dann nicht wieder zum Anfang gesprungen wird)
In der JList möchte ich das Gleiche erreichen: Navigation durch die Tabs (jedes Tab hat eine JList).

Lässt sich das Gewünschte auch mittels KeyBindings lösen - oder ist es doch nur mit KeyListenern möglich?
 

Michael...

Top Contributor
Ich vermute mal, das Du hier mit Key Bindings leichter zum Ziel kommen wirst, weil Du hiermit das Verhalten direkt festlegen kannst. Mit einem KeyListener müsstest Du das Verhalten der Komponente "korrigieren". Allerdings kann es sein, dass Du beim Überschreiben bestehender Key Bindings mehr beachten musst, z.B. dass deaktivierte Tabs einer TabbedPane bei der Navigation mit den Cursortasten übersprungen werden.
 

jf

Bekanntes Mitglied
Ich vermute mal, das Du hier mit Key Bindings leichter zum Ziel kommen wirst, weil Du hiermit das Verhalten direkt festlegen kannst. Mit einem KeyListener müsstest Du das Verhalten der Komponente "korrigieren". Allerdings kann es sein, dass Du beim Überschreiben bestehender Key Bindings mehr beachten musst, z.B. dass deaktivierte Tabs einer TabbedPane bei der Navigation mit den Cursortasten übersprungen werden.
Ok, ich bin bei meinen Versuch leider gescheitet - ich hatte es wie auf dieser Seite probiert.

Ich habe jetzt auch mal eine Demo gemacht, weil sich noch ein weiteres, für mich unlösbares Problem auftat.
Evtl. könntest du da mal drüber schauen... :)
 

Michael...

Top Contributor
Hier mal ein Bsp. für die rechte Cursor Taste, allerdings wird hier - wie gesagt - nicht berücksichtig, ob ein Tab für den Anwender deaktiviert ist.
Java:
	pane.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "moveright");
	ActionMap action = pane.getActionMap();
	action.put("moveright", new AbstractAction() {
		public void actionPerformed(ActionEvent e) {
			int index = pane.getSelectedIndex();
			if (index<pane.getTabCount()-1)
				pane.setSelectedIndex(++index);
		}
	});
 

jf

Bekanntes Mitglied
Hier mal ein Bsp. für die rechte Cursor Taste, allerdings wird hier - wie gesagt - nicht berücksichtig, ob ein Tab für den Anwender deaktiviert ist.
Vielen Dank Michael - das hat für die JTabbedPane geholfen! :toll:
Es musste ja nur
Code:
WHEN_IN_FOCUSED_WINDOW
in
Code:
WHEN_FOCUSED
geändert werden. :D

Wenn ich das KeyBinding aber auf die JList anwende, ist weiterhin kein Tabwechsel möglich.
Muss hierfür evtl. noch weiteres beachtet werden?

PS: das Deaktivieren von Tabs ist in meiner Anwendung nicht vorgesehen.
 

Michael...

Top Contributor
Wenn ich das KeyBinding aber auf die JList anwende, ist weiterhin kein Tabwechsel möglich.
Muss hierfür evtl. noch weiteres beachtet werden?
Sollte eigentlich so möglich sein.
Eine andere Möglichkeit, wäre einfach die bestehenden Key Bindings für die Cursortasten mit "nichts" zu überschreiben.
Java:
	final JTabbedPane pane = new JTabbedPane();
	JList[] list = new JList[4];
	for (int i=0; i<list.length; i++) {
		list[i] = new JList(new String[] {"  A " + i, "  B " + i, "  C " + i, "  D " + i});
		list[i].getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "machnix");
		pane.addTab("Tab " + (i+1), list[i]);
	}
	
	pane.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "machnix");
	pane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "moveright");
	pane.getActionMap().put("moveright", new AbstractAction() {
		public void actionPerformed(ActionEvent e) {
			int index = pane.getSelectedIndex();
			System.out.println(index);
			if (index<pane.getTabCount()-1)
				pane.setSelectedIndex(++index);
		}
	});
 

jf

Bekanntes Mitglied
Sollte eigentlich so möglich sein.
Ja, du hast natürlich Recht!
Meine Listen-Componente war eigentlich eine gewrappte JList (Komposition aus JList, JScrollPane und DefaultListModel) - daher hatte ich das KeyBinding dummerweise zum Basis-JPanel der Komponente hinzugefügt und nicht zur JList-Komponente selber, welche aber den Fokus hat.

Gibt es evtl. einen Listener, welcher das Hinzufügen von Listenern und das Ändern von KeyBindings erkennt, so dass mein List-Wrapper die Änderungen automatisch auf die richtige Komponente umleiten kann?

Eine andere Möglichkeit, wäre einfach die bestehenden Key Bindings für die Cursortasten mit "nichts" zu überschreiben.
Nochmals vielen Dank!
 

Ähnliche Java Themen

Neue Themen


Oben