# Problem mit AbstractAction und Shortcut



## Guest (17. Jul 2008)

Hi,

ich habe in meiner GUI eine Tabelle und oberhalb der Tabelle eine JToolbar mit verschiedenen Aktionen die die Daten in der Tabelle betrefenn wie z.B. "Neu", "Löschen", "Undo", "Copy" etc. pp.

Diese Aktionen habe ich alle als einzelne AbstractActions gespeichert und diesen auch per:

```
putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke('N',InputEvent.CTRL_MASK));
```
z.B. einen Shortcut  zugewiesen.

Zeige ich mir in der Tabelle mein PopupMenü an, was ebenfalls über die Actions läuft wird der Shortcut auch richtig und entsprechend angezeigt.

Habe ich nun allerdins eine Zeile in meiner Tabelle markiert und drücke STRG+N passiert gar nichts ...
Ich vermute mal, da die Tabelle den Fokus hat und nicht der jeweilige Frame wo z.B. die Menübar liegt oder dergleichen.

Wie bekomme ich es denn hin, das meine Shortcuts funktionieren - egal wer und wo der Focus gerade liegt?
Danke für eure Hilfe!


----------



## Wildcard (17. Jul 2008)

Schau dir mal Input und Action Map an.
http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html


----------



## Gast (17. Jul 2008)

bedeutet ist muss überall in meiner anwendung meine kompletten shortcuts für die jewilige komponente sperren, so dass der einzige der das noch abarbeiten darf meine AbstractAction ist?!


----------



## Gast (17. Jul 2008)

oder gibts auch nen anderen weg?


----------



## Wildcard (17. Jul 2008)

Nein, ich glaube du hast den Artikel falsch verstanden. Mach es doch einfach in die InputMap für WHEN_IN_FOCUSED_WINDOW.
Aufpassen muss man nur, wenn eine andere Komponente das gleiche Binding verwendet, dann muss man überschreiben.


----------



## Guest (17. Jul 2008)

Wildcard hat gesagt.:
			
		

> Nein, ich glaube du hast den Artikel falsch verstanden. Mach es doch einfach in die InputMap für WHEN_IN_FOCUSED_WINDOW.
> Aufpassen muss man nur, wenn eine andere Komponente das gleiche Binding verwendet, dann muss man überschreiben.



Heisst ich übergebe der InputMap für WHEN_IN_FOCUSED_WINDOW zum jeweiligen Shortcut die jewelige AbstractAction?


----------



## Gast (17. Jul 2008)

hmm funzt iwie nich ...

kannst du mir vllt. verraten wie ich es hinbekomme das EGAL welche komponente den focus hat (maybe die input map des mainframes?) bei entsprechendem Tastendruck die jeweilige Action ausführt die den Shortcut zugewiesen hat?


----------



## GilbertGrape (17. Jul 2008)

ich denke, sowas hier ist gemeint:


```
InputMap iMap = mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
   ActionMap aMap = mainPanel.getActionMap();
   iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "enterAction");
   aMap.put("enterAction", new AbstractAction(){
	   public void actionPerformed(ActionEvent e){
		   startBtnClicked();
	   }
   });
```

In diesem Fall wird immer auf die Enter-Taste reagiert, wenn sich der Fokus irgendwo im Fenster befindet.
Und für die Action kannst du ja dann deine übergeben.


----------



## Gast (17. Jul 2008)

ja das ist mir klar ...

allerdings habe ich für meine ganzen Menüs, Buttons und so weiter schon fertige AbstractActions die ja auch den VErweis auf den jeweiligen Shortcut haben.

Würde ungern für jeden einzelnen Shortcut nochmal einen extra Eintrag in der ActionMap des mainPanels machen nur um dort dann in der ActionPerformed Methode mir die jeweilge AbstractAction zu holen und diese dann auszuführen.

Wenn das der einzigste Weg ist, Frag ich mich wieso man den Actions einen Shortcut zuweisen kann, denn ich musste dann ja doch alles 2x programmieren ...


----------



## Wildcard (17. Jul 2008)

Gerade nochmal nachgelesen, eigentlich sollten Accelerators bereits in WHEN_IN_FOCUSED_WINDOW eingetragen werden.
Vermutlich 'frisst' die Tabelle dein Binding, oder hat selbst eine Action für CTRL+N definiert.


----------



## Guest (17. Jul 2008)

Wildcard hat gesagt.:
			
		

> Gerade nochmal nachgelesen, eigentlich sollten Accelerators bereits in WHEN_IN_FOCUSED_WINDOW eingetragen werden.
> Vermutlich 'frisst' die Tabelle dein Binding, oder hat selbst eine Action für CTRL+N definiert.



Also das letztere trifft auf keinen Fall zu ...
Wie kann ich es denn umgehen, das die Tabelle mein Binding "frisst" ?


----------



## Gast (17. Jul 2008)

Achja, Problem ist wirklich:
Aktuell funktioniert das Binding halt wirklich nur wenn das Popup Menu offen ist - ansonsten überhaupt nicht


----------



## Gast (21. Jul 2008)

hat denn wirklich niemand eine idee wie die shortcuts in verschiedenen abstractactions programmweit funktionieren?


----------



## Gast (29. Jan 2009)

hab da sselbe problem :-/ inzwischen vllt. jemand eine idee wie das ganze funktionieren kann?


----------



## AdaLovelace (18. Jun 2011)

Dies ist zwar ein alter Beitrag, aber falls jemand, wie ich, drauf stößt und eine Lösung sucht:

Ich hatte das Problem, dass mein MenuItem zwar einen Shortcut bekam, aber der als String nicht in der Menüleiste auftauchte. Stattdessen wurde er durch den String der zugewiesenen AbstractAction überschrieben. Geklappt hat es, als ich dem Item keine Action, sondern einen ActionListener zugefügt habe (AbstractAction implementiert den).


```
T_waehlen = new JMenuItem("waehlen");
		T_waehlen.setAccelerator(
				KeyStroke.getKeyStroke('W', InputEvent.CTRL_MASK)
			);

		Action A_WaehleThema = new AbstractAction(){
			public void actionPerformed(ActionEvent arg0) {
				AbfrageSichtbarMachen();
			}
		};
		
		
		T_waehlen.addActionListener(A_WaehleThema);
```


----------

