JDK-8024328 : [macosx] ActionListeners fire twice for JMenuItems still in the ScreenMenuBar.
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 7u10
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: os_x
  • Submitted: 2013-04-04
  • Updated: 2013-09-06
  • Resolved: 2013-09-06
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8
8Resolved
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version  " 1.7.0_12-ea " 
Java(TM) SE Runtime Environment (build 1.7.0_12-ea-b02)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b25, mixed mode)
AND
java version  " 1.7.0_10-ea " 
Java(TM) SE Runtime Environment (build 1.7.0_10-ea-b16)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
OS X 10.8.2

A DESCRIPTION OF THE PROBLEM :
JMenuItems still fire twice when used with the ScreenMenuBar and when they use shift-cmd or alt-cmd modifiers. They fire only once when the only modifier is cmd.

I was verifying that bug 7160951 was actually fixed when I noticed that it still fired twice for more complicated modifiers. There are also times when it only fires once with shift-cmd and alt-cmd but most often it fires twice.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the provided test frame and try both key shortcuts.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
The output shows that the action listener fires twice for each key press.
ACTUAL -
There should only be one line of output per key press.

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;


public class TestFrame extends JFrame {

public TestFrame() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu( " File " );

JMenuItem shiftItem = new JMenuItem( " Shift " );
shiftItem.setAccelerator(KeyStroke.getKeyStroke('O',
KeyEvent.SHIFT_MASK |
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
shiftItem.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
System.out.println( " Shift was called " );
}
});
fileMenu.add(shiftItem);

JMenuItem altItem = new JMenuItem( " Alt " );
altItem.setAccelerator(KeyStroke.getKeyStroke('O',
KeyEvent.ALT_MASK |
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
altItem.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
System.out.println( " Alt was called " );
}
});
fileMenu.add(altItem);

menuBar.add(fileMenu);
setJMenuBar(menuBar);
pack();
setVisible(true);
}

public static void main(String[] args) throws InvocationTargetException, InterruptedException {
System.setProperty( " apple.laf.useScreenMenuBar " ,  " true " );
SwingUtilities.invokeAndWait(new Runnable() {
@Override public void run() {
new TestFrame();
}
});
}
}

---------- END SOURCE ----------