在GUI中向JMenuItem添加加速器描述,而不实际添加加速器

时间:2014-05-23 00:00:37

标签: java swing jmenuitem

我正在尝试设置一些文本,以便显示JMenuItem通常显示加速器绑定的位置。 下图中的划分 Ctrl + Z 文本是我正在尝试为另一个JMenuItem设置的示例。

accelerator text example

实际上想要为此JMenuItem设置加速器。 我在几个类的源代码中搜索过,如JMenuItemBasicMenuItemUI,但无济于事。 实现这一目标的最简单方法是什么?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

我假设您希望这样做的原因是,当键组合已经绑定在帧上的组件上时,您可以阻止菜单第二次触发撤消操作,但这不是必需的。如果组件消耗了键事件,菜单将无法检测到它。

这是一个JTextArea的例子,看看我的意思:

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JMenuBar menu = new JMenuBar();
frame.setJMenuBar(menu);
JMenu menuEdit = new JMenu("Edit");
menu.add(menuEdit);
JMenuItem menuEditUndo = new JMenuItem("Undo");
menuEdit.add(menuEditUndo);
menuEditUndo.setAccelerator(KeyStroke.getKeyStroke("control Z"));
menuEditUndo.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("menu");
    }
});

JTextArea textArea = new JTextArea(20, 40);
textArea.getInputMap().put(KeyStroke.getKeyStroke("control Z"), "undo");
textArea.getActionMap().put("undo", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("text");
    }
});
frame.add(new JScrollPane(textArea));

frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

文本区域和菜单项都绑定到相同的键组合,但按 Ctrl + Z ,而文本区域具有焦点仅打印" text"从来没有" menu"。即,动作不会发生两次。虽然这使用了JTextArea,但任何组件都应该如此。