加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何为JMenu子菜单设置加速器?

发布时间:2020-12-15 04:59:01 所属栏目:Java 来源:网络整理
导读:我有一个用户请求将加速器添加到子菜单(JMenu),这将允许用户按下快捷方式并使相应的子菜单“折叠”,显示其包含的菜单项. 我不记得每个人都看过这样的东西(用Java或任何其他语言).我们的应用程序是使用Swing用J??ava编写的.我们有许多带有加速器的JMenuItem,
我有一个用户请求将加速器添加到子菜单(JMenu),这将允许用户按下快捷方式并使相应的子菜单“折叠”,显示其包含的菜单项.

我不记得每个人都看过这样的东西(用Java或任何其他语言).我们的应用程序是使用Swing用J??ava编写的.我们有许多带有加速器的JMenuItem,但是当我尝试向JMenu添加加速器时,我得到以下异常:

java.lang.Error:没有为JMenu定义setAccelerator().请改用setMnemonic().

我试过用MenuDemo!代码进一步试验这一点.

这是我试过的:

//a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
submenu.setMnemonic(KeyEvent.VK_S);
submenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));

最后一行是我添加的一行,导致异常.

我已经尝试了大量的谷歌搜索,但我能找到的是关于如何向JMenuItem添加加速器的文章.

似乎JMenu不支持这种原生.有没有解决方法来实现这种行为?

解决方法

另一种选择是覆盖加速器get / set并重现JMenuItem行为.然后UI将完成剩下的工作.

重要的是触发属性更改并为加速器设置一致的get / set.该解决方案的优点在于它还提供了快捷方式/加速器的可视指示.

这是一个小的演示代码:

import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestMenu {

    protected void initUI() {
        JFrame frame = new JFrame(TestMenu.class.getSimpleName());
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        JMenuBar bar = new JMenuBar();
        JMenu topMenu = new JMenu("Top Menu");
        JMenu subMenu = new JMenu("Sub menu") {
            private KeyStroke accelerator;

            @Override
            public KeyStroke getAccelerator() {
                return accelerator;
            }

            @Override
            public void setAccelerator(KeyStroke keyStroke) {
                KeyStroke oldAccelerator = accelerator;
                this.accelerator = keyStroke;
                repaint();
                revalidate();
                firePropertyChange("accelerator",oldAccelerator,accelerator);
            }
        };
        subMenu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,KeyEvent.CTRL_MASK));
        JMenuItem item1 = new JMenuItem("Item 1");
        JMenuItem item2 = new JMenuItem("Item 2");
        subMenu.add(item1);
        subMenu.addSeparator();
        subMenu.add(item2);
        topMenu.add(subMenu);
        bar.add(topMenu);
        frame.setJMenuBar(bar);
        frame.setSize(400,300);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (UnsupportedLookAndFeelException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                new TestMenu().initUI();
            }
        });
    }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读