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(); } }); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |