Problem mit AbstractAction und Shortcut

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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:
Code:
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!
 
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?!
 
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.
 
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?
 
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?
 
ich denke, sowas hier ist gemeint:

Code:
 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.
 
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 ...
 
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.
 
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" ?
 
Achja, Problem ist wirklich:
Aktuell funktioniert das Binding halt wirklich nur wenn das Popup Menu offen ist - ansonsten überhaupt nicht 🙁
 
hat denn wirklich niemand eine idee wie die shortcuts in verschiedenen abstractactions programmweit funktionieren?
 
hab da sselbe problem :-/ inzwischen vllt. jemand eine idee wie das ganze funktionieren kann?
 
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).

Java:
		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);
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben