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