这个问题是后续问题这个问题 https://stackoverflow.com/questions/18093773/jmenubar-selectionmodel-changelistener-only-fires-once.
我有一个JMenuBar
其行为类似于 Firefox 和 iTunes 中的菜单栏。也就是说,菜单栏最初是隐藏的,但是当您按Alt
,出现菜单栏。
另一个问题的答案解决了实现该功能的问题,但它带来了another问题:JMenuItem
加速器不工作时JMenuBar
不可见。换句话说,您必须按Alt
before CTRL+F
(已安装的加速器)将起作用。
然而,情况不应该是这样,因为setAccelerator()
方法规定如下:
公共无效setAccelerator(KeyStroke keyStroke)
设置调用菜单项的操作侦听器而无需导航菜单层次结构的组合键。 UI 负责安装正确的操作。请注意,当键入键盘加速器时,无论当前是否显示菜单,它都会起作用。
所以,我想知道这是否是另一个 Java 错误?
SSCCE http://sscce.org/(要显示菜单,请按Alt
,安装的加速器为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();
}
});
}
}
仔细阅读你的重点
请注意,当键入键盘加速器时,无论当前是否显示菜单,它都会起作用。
这讲的是menu不是它的父级。这意味着menu当前可能未显示。然而,真正的(可能没有详细记录的)决定性属性是它必须是showing。更新了我对您之前问题的回答。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)