Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Accelerator zu JMenuItem des JPopupMenu einer JList
JList<String> list = new JList<>();
final JMenuItem someItem = new JMenuItem( "Tu was." );
final JPopupMenu menu = new JPopupMenu();
someItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println( "Hallo" );
}
});
someItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
menu.add(someItem);
list.setComponentPopupMenu(menu);
Das ist der gesamte Code.
Wenn mein JPopupMenu angezeigt wird und ich CTRL-S eingebe, funktionierts. Aber ich will, dass es auch funktioniert, wenn nur die JList fokussiert ist (ohne KeyListener).
Hat irgendeiner eine Ahnung, ob das zu machen ist?
Ich habe eine Lösung gefunden... Tut genau, was ich machen will, leider geht's nicht ohne Unterklasse von JMenuItem:
Java:
@SuppressWarnings("serial")
private static class MyMenuItem extends JMenuItem {
/**
* JComponent whose input map will be modified upon setting this object's accelerator.
*/
private final JComponent target;
private MyMenuItem(JComponent target) {
super();
this.target = target;
}
@Override
public void setAccelerator(KeyStroke keyStroke) {
super.setAccelerator( keyStroke );
target.getInputMap().put( keyStroke, keyStroke );
target.getActionMap().put( keyStroke, getAction() );
getInputMap( WHEN_IN_FOCUSED_WINDOW ).put( keyStroke, "none" );
}
}
Dies bewerkstelligt, dass mein "target"-Component den Fokus haben muss, dass der Accelerator ausgeführt wird. Ist das PopupMenu geöffnet und man betätigt den KeyStroke, passiert absolut nichts.
Der einzige Nachteil ist, dass man im Konstruktor nicht mehr den Namen angeben kann und diesen in
Code:
myMenuItem.setAction( new AbstractAction( name ) { ... } );
angeben muss.
E: @vanny:
Ja mit KeyBindings funktionierts. Was ich eigentlich wollte (ich hab mich unklar ausgedrückt), war einen Shortcut von einem JComponent zu dieser Action aber gleichzeitig, dass dieser Accelerator im Menu angezeigt wird aber während das Menu den Fokus hat, nichts passiert. Was ich mir vorgestellt hatte, wäre einfach den Accelerator Text zu setzen (was aber anscheinend unmöglich ist... höchstens hiermit)