KeyStroke hierarchisch nach unten löschen

Halli Hallo

Ich hab mal wieder eine Frage zu den KeyStrokes.
Es gibt ein MainWindow mit verschiedenen Elementen darin. Desweiteren gibt es eine Art Shortcut System welches frei konfigurierbar ist. Einer dieser Shortcut’s schließt die aktuelle Anwendung. Außerdem gibt es ein Eingabefeld innerhalb der Anwendung. Problem ist nun, wenn ich in diesem Eingabefeld den Shortcut, z.B. “s”, drücke, geht die Anwendung zu. Eher suboptimal. Im Grunde soll ein “globaler Shortcut” für spezielle Komponenten deaktiviert werden.

Meine Idee war, die Action zu fragen welche Source sie hat. Dies gibt aber immer das MainWindow aus und nicht das Textfeld. Das ist also auch keine Lösung.
Daher die Frage wie man hierarchisch nach unten KeyEvents verbietet bzw. löscht. Beim Init Prozess das ganze manuell zu löschen ist auch eher schlecht, da, sobald ein neue Tastenkombo gewählt wird, man das ganze wieder durchlaufen müsste.

Ein kl. Beispiel sähe so aus:

public class KeyTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
		Action ke1 = new Action();
		Action ke2 = new Action();
		
		JXPanel main = new JXPanel(new FlowLayout());
		main.setName("main");
		
		JXPanel p1 = new JXPanel(new FlowLayout());
		p1.setName("p1");
		JXLabel l1 = new JXLabel("Label1");
		JTextField tf1 = new JTextField(20);
		p1.add(l1);
		p1.add(tf1);
		
		JXPanel p2 = new JXPanel(new FlowLayout());
		p2.setName("p2");
		JXLabel l2 = new JXLabel("Label2");
		JTextField tf2 = new JTextField(20);
		p2.add(l2);
		p2.add(tf2);
		
		main.add(p1);
		main.add(p2);
		
		f.add(main);
		f.pack();
		f.setVisible(true);
		
		main.getInputMap(JXPanel.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_T, 0, false), "ke");
		main.getActionMap().put("ke", ke1);
	}
}

class Action extends AbstractAction{
	@Override
	public void actionPerformed(ActionEvent e) {System.out.println(e.getSource());}
}

In diesem Fall wäre der Plan das in einem Textfeld keine in dem anderen aber weiterhin eine Ausgabe kommt. Das zweite Textfeld ist nur beispielhaft. Später ist dort eher eine Tabelle und andere Komponenten zu finden, und die sollen weiterhin auf Tastenkombos reagieren.

€: Jedesmal beim ändern der Tastenkombo alle Childs des MainWindows durchlaufen und die Action manuell zu löschen erscheint mir eher als Workaround

Wie stellst du dir das vor? Woher soll der Computer wissen, dass in dem einen Textfeld der globale Listener nicht gilt. Vielleicht hifts ja schon, wenn du für deine globalen Hotkeys die ALT Taste erforderlich machst (kommt dem Benutzer doch komisch vor wenn ein simples “s” das Programm schließt). So kommst du jedenfalls an die Komponente mit Focus (von der unweigerlich das Event stammen sollte):

class Action extends AbstractAction {
	@Override
	public void actionPerformed(ActionEvent e) {
		JComponent source = (JComponent) e.getSource();
		JFrame frame = (JFrame) source.getTopLevelAncestor();
		Component focusedComponent = frame.getFocusOwner();
		
		System.out.println(focusedComponent);		
	}

Weiß ich nicht, daher ja die Frage. Das mit dem “s” war ja nur ein Beispiel da die tstenbelegung frei wählbar ist. Unter Umständen gefällt das nicht und es wird z.B. ein STRG+U oder H oder STRG+ALT+DEL gewählt.

Aber dein Code ist ja schon das was ich suche, glaub ich .).

if(focusedComponent instanceof JTextField){}

Danke dafür schonmal

€: Textfelder sind ja nur für Eingaben da, daher brauch ic hda auch nicht unterscheiden ob Feld1 oder Feld2. Aber z.B. soll “s” im Textfeld nicht auslösen, im Gegensatz zu der Situation wo der Fokus in einer Tabelle liegt

Sorry, übermüdet, bisher nur überflogen, aber das klingt nach http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html , mit InputMaps für JComponent.WHEN_FOCUSED und so, aber … “morgen” les’ ich nochmal genauer.