【问题标题】:How to make JMenuBar activate menu without popping it up?如何让 JMenuBar 在不弹出菜单的情况下激活菜单?
【发布时间】:2012-11-08 14:23:58
【问题描述】:

我尝试让我的JMenuBarAlt KeyEvent 上激活第一个JMenu,但没有打开弹出窗口,以便稍后可以打开带有箭头键击的弹出窗口。就像在 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 事件。

【问题讨论】:

  • 看看,可能对你有帮助stackoverflow.com/questions/8657801/…
  • @yggdraa 附加问题,您想以编程方式突出显示还是从 MouseEvents 突出显示
  • Georgy,我做到了,这个例子就像这个例子一样 - 它在 alt+tab 上弹出菜单。

标签: java swing jmenuitem jmenubar


【解决方案1】:

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

  • 第一步

    1. 必须使用KeyBindings并输出到Swing Action (adviced)ActionListener

    2. 有两种方法menu.setArmed(true)menu.setSelected(true)

  • 但在这两种情况下,JMenu 都被永远选中,然后是所需的第二个。步骤添加MenuListener 并将先前选择或武装恢复为false

【讨论】:

    【解决方案2】:

    在启动您的 GUI 之前,调用此行:

    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    

    并删除助记符。

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

    【讨论】:

    • @user714965 不,它还安装了适当的 KeyBindings,它将重现 Windows 上的行为,因此它完全是一个解决方案。
    • @user714965 是的,我刚刚做到了,它完全按预期工作。我采用了 OP 的代码,将确切的行添加为 main 的第一行。启动代码并按下“ALT”和...“瞧”!
    • 我试过这个,不,看起来像 Windows,但行为就像以前一样
    • @yggdraa 抱歉,忘记我删除了助记符。确保也将其删除
    • @user714965 忘了告诉你必须删除助记符
    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多