我用按键加速器创建了JMenuItems,然后我直接将它们添加到菜单栏中,而不需要添加到JMenu中,这样它们看起来就像JButtons,每件事都很好,但我注意到当点击或按键时JMenuItem永远不会获得焦点,这给我带来了一些问题,例如:其中一个JMenuItems是用于保存的,我还有一个JTextField,它在失去焦点时做一些验证,但由于当按下保存时,焦点保持在JTextField上,所以不起作用。
有什么想法吗?!
发布于 2012-11-20 08:48:27
我建议使用JToolBar并利用Action API
这里有一个非常简短的示例,演示如何实现对工具栏(或任何)按钮的快捷键支持。
public class MenuTest {
public static void main(String[] args) {
new MenuTest();
}
public MenuTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JToolBar tb = new JToolBar();
tb.add(new FastButton(new OpenAction()));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(tb, BorderLayout.NORTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class FastButton extends JButton {
private FastButton(Action action) {
super(action);
setHideActionText(true);
}
@Override
protected void configurePropertiesFromAction(Action a) {
super.configurePropertiesFromAction(a);
if (a != null) {
KeyStroke ks = (KeyStroke) a.getValue(Action.ACCELERATOR_KEY);
InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = getActionMap();
inputMap.put(ks, "Action.accelerator");
actionMap.put("Action.accelerator", a);
}
}
}
public class OpenAction extends AbstractAction {
public OpenAction() {
putValue(NAME, "Open");
putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
putValue(SMALL_ICON, new ImageIcon(getClass().getResource("/folder_document.png")));
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Open");
}
}
}https://stackoverflow.com/questions/13464784
复制相似问题