我尝试使我的JMenuBar激活JMenu上的第一个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事件。

最佳答案

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

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());


并删除助记符。

这将自动在Windows上安装所需的行为。
如果在所有平台上都需要这样做,则必须使用KeyBindings,但是由于仅在Windows上会观察到此行为,因此我认为仅在Windows上重新创建它就不会有问题。

10-06 13:06
查看更多