如何使JMenuBar激活菜单而不弹出它?

时间:2012-11-20 13:43:29

标签: java swing jmenuitem jmenubar

我尝试让我的JMenuBarJMenu上激活第一个Alt KeyEvent,但是没有打开弹出窗口,以便以后可以用箭头按键打开弹出窗口。就像它在NetBeans,Mozilla,任何其他程序窗口中完成一样。

这是不符合预期的代码。最糟糕的副作用是它对alt + tab组合作出反应,它绝对不应该在 alt + tab 上弹出菜单。我只需要让菜单进入“武装”状态,并能够通过箭头键(右箭头和左边的“手臂”菜单和向下箭头来打开“武装”菜单弹出窗口)。有没有简单的方法来实现这一目标?

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;

public class Test5 extends JFrame {

    public Test5() {
        super("test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel pan = new JPanel(new BorderLayout());

        final JMenuBar bar = new JMenuBar();
        final JMenu menu = new JMenu("File", false);

        menu.setMnemonic(KeyEvent.VK_ALT);

        JMenuItem item = new JMenuItem("All");
        JMenuItem item2 = new JMenuItem("Exit");
        menu.add(item);
        menu.add(item2);

        JMenu menu1 = new JMenu("Test");
        JMenuItem item1 = new JMenuItem("All");
        menu1.add(item1);

        bar.add(menu);
        bar.add(menu1);

        setJMenuBar(bar);

        setSize(200, 200);
        setVisible(true);
    }


    public static void main(String[] args) {
        new Test5();
    }

}

感谢Guillaume Polet : com.sun.java.swing.plaf.windows.WindowsLookAndFeel类中有一些代码,可以使用Alt键击:

public void initialize() {
    super.initialize();
    // some more initialization here
    KeyboardFocusManager.getCurrentKeyboardFocusManager()
                        .addKeyEventPostProcessor(WindowsRootPaneUI.altProcessor);
}

AltProcessor类可以完成所有的魔术。

如果您没有任何自定义LaF,您可以直接使用WindowsLookAndFeel,或者有适当的示例如何在您自己的特殊LaF的菜单中处理Alt事件。​​

2 个答案:

答案 0 :(得分:3)

在启动GUI之前,请调用以下行:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

删除助记符。

这将自动在Windows上安装所需的行为。 如果你需要在所有平台上使用它,那么你将不得不使用KeyBindings,但由于这种行为只能在Windows上观察到,所以我发现只在Windows上重新创建它才有问题。

答案 1 :(得分:1)

不知道为什么,但关于回答问题