2012-11-20 53 views
2

我试图让我的JMenuBar先激活JMenu,Alt KeyEvent,但没有打开弹出窗口,以便以后可以用箭头键击打开弹出窗口。就像它在NetBeans,Mozilla,以及任何其他程序窗口中完成一样。如何在不弹出JMenuBar的情况下激活菜单?

这是不符合预期的代码。最坏的副作用是它对alt + tab组合起反应,并且绝对不应该弹出菜单上的alt + 标签。我只需要让菜单进入“武装”状态,并能够通过箭头键(右侧的&左侧的箭头到“武装”菜单和向下箭头以打开“武装”菜单弹出)来遍历菜单。有没有简单的方法可以做到这一点?

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(); 
    } 

} 

解决了感谢纪尧姆波莱: 有在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事件。

+0

看看,可能会有所帮助http://stackoverflow.com/questions/8657801/focus-on-first-jmenubar-item-on-alt-key-press –

+0

@yggdraa额外的问题,你想突出显示编程或从MouseEvents – mKorbel

+0

从关键笔画 – yggdraa

回答

3

开始你的GUI之前,调用该行:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

,并删除了记忆。

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

+0

@ user714965否,它也安装适当的KeyBindings,它将重现在Windows上看到的行为,所以它完全是一个解决方案。 –

+0

@ user714965是的,我刚刚完成,它的工作原理与预期完全相同。我拿走了OP的代码,并将该确切的行添加为主行的第一行。启动代码并按下“ALT”和...“voila”! –

+0

我试过这个,不行,看起来像Windows,但行动就像之前行动 – yggdraa

1

不知道为什么,但对回答这个问题

  • 第一步

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

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

  • 但在这两种情况下,JMenu永远被选中然后需要第二个。步骤添加MenuListener并恢复以前的选择或武装假

相关问题