首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java、menuBar、JMenuitems焦点

Java、menuBar、JMenuitems焦点
EN

Stack Overflow用户
提问于 2012-11-20 08:22:58
回答 1查看 659关注 0票数 0

我用按键加速器创建了JMenuItems,然后我直接将它们添加到菜单栏中,而不需要添加到JMenu中,这样它们看起来就像JButtons,每件事都很好,但我注意到当点击或按键时JMenuItem永远不会获得焦点,这给我带来了一些问题,例如:其中一个JMenuItems是用于保存的,我还有一个JTextField,它在失去焦点时做一些验证,但由于当按下保存时,焦点保持在JTextField上,所以不起作用。

有什么想法吗?!

EN

回答 1

Stack Overflow用户

发布于 2012-11-20 08:48:27

我建议使用JToolBar并利用Action API

这里有一个非常简短的示例,演示如何实现对工具栏(或任何)按钮的快捷键支持。

代码语言:javascript
复制
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");
        }

    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13464784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档