隐藏菜单栏时JMenuItem加速器不起作用

时间:2013-08-09 20:53:10

标签: java swing jmenuitem jmenubar

此问题是对this question的跟进。

我有一个JMenuBar,其行为类似于Firefox和iTunes中的菜单栏。也就是说,菜单栏最初是隐藏的,但是当您按Alt时,会出现菜单栏。

另一个问题的答案解决了实现该功能的问题,但它带来了另一个问题:当JMenuItem不是JMenuBar时,Alt加速器无效可见。换句话说,您必须在CTRL+F(已安装的加速器)工作之前按setAccelerator()

但事实并非如此,因为Alt方法声明如下:

  

public void setAccelerator(KeyStroke keyStroke)

     

设置调用菜单项的动作侦听器而不导航菜单层次结构的组合键。 UI负责安装正确的操作。 请注意,当键入键盘加速键时,无论当前是否显示菜单,它都会起作用。

所以,我想知道这是否是另一个Java bug?

SSCCE(要显示菜单,请按CTRL+F,已安装的加速器JOptionPane用于“查找”,这会为输入显示一个虚拟import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.KeyStroke; import javax.swing.MenuElement; import javax.swing.MenuSelectionManager; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.WindowConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class MenuBarTest extends JFrame { public MenuBarTest() { JMenu jMenu1 = new JMenu(); JMenu jMenu2 = new JMenu(); final JMenuBar jMenuBar1 = new JMenuBar(); JMenuItem jMenuItem1 = new JMenuItem(); JMenuItem jMenuItem2 = new JMenuItem(); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); jMenu1.setText("File"); jMenuItem1.setText("jMenuItem1"); jMenu1.add(jMenuItem1); jMenuBar1.add(jMenu1); jMenu2.setText("Edit"); jMenuItem2.setText("Find"); jMenu2.add(jMenuItem2); jMenuBar1.add(jMenu2); setJMenuBar(jMenuBar1); jMenuBar1.setVisible(false); ChangeListener listener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { MenuElement[] elements = MenuSelectionManager.defaultManager().getSelectedPath(); jMenuBar1.setVisible(elements.length > 0 && elements[0] == jMenuBar1); } }; MenuSelectionManager.defaultManager().addChangeListener(listener); jMenuItem2.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK)); jMenuItem2.setText("Find"); jMenuItem2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { String what = JOptionPane.showInputDialog(MenuBarTest.this, "Search for what?"); System.out.println(what); } }); pack(); setSize(500,500); setLocationRelativeTo(null); setVisible(true); } public static void main(String args[]) { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MenuBarTest(); } }); } } ):

{{1}}

1 个答案:

答案 0 :(得分:3)

仔细阅读你的重点

  

请注意,键入加速键盘时,无论菜单当前是否显示,它都会起作用。

这是关于菜单而不是其父级的。这意味着当前可能未显示菜单。然而,真正的(可能没有过多记录的)决定性的财产是它必须显示。已经更新了我之前问题的答案。