JMenuItem keyboard accelerator not showing when using the	useScreenMenuBar property
    Marco Dinacci 
    marco.dinacci at gmail.com
       
    Mon Jun 18 08:54:24 PDT 2012
    
    
  
Hi Leonid,
I think I've found the issue. In ScreenMenuItem.addNotify there's the
following code:
        setAccelerator(fMenuItem.getAccelerator());
         final String label = fMenuItem.getText();
         if (label != null) {
             setLabel(label);
         }
setLabel(label) in CMenuItem calls:
        setLabel(label, (char)0, KeyEvent.VK_UNDEFINED, 0);
which resets any accelerator previously set with setAccelerator.
If the call to setAccelerator(fMenuItem.getAccelerator()) is placed
after setLabel(label) than the accelerator is set again and the
shortcut is visible. I don't know if it's the best way to reset the
accelerator in setLabel and then setting it back again but at least it
works.
Here's the test file I used:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MenuBug {
    public JMenuBar createMenuBar(final JFrame frame) {
        JMenuBar menuBar;
        JMenu menu, submenu;
        JMenuItem menuItem;
        menuBar = new JMenuBar();
        menu = new JMenu("A Menu");
        menu.setMnemonic(KeyEvent.VK_A);
        menuBar.add(menu);
        menuItem = new JMenuItem("menu item");
        KeyStroke s = KeyStroke.getKeyStroke(
                KeyEvent.VK_T, ActionEvent.META_MASK);
        menuItem.setAccelerator(s);
        menu.add(menuItem);
        return menuBar;
    }
    private static void createAndShowGUI() {
        JFrame frame = new JFrame("MenuBug");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MenuBug demo = new MenuBug();
        frame.setJMenuBar(demo.createMenuBar(frame));
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
Best,
Marco
    
    
More information about the macosx-port-dev
mailing list