--- old/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxUI.java 2014-11-19 15:02:09.000000000 +0400 +++ new/src/java.desktop/macosx/classes/com/apple/laf/AquaComboBoxUI.java 2014-11-19 15:02:09.000000000 +0400 @@ -496,10 +496,15 @@ // This is somewhat messy. The difference here from BasicComboBoxUI.EnterAction is that // arrow up or down does not automatically select the @SuppressWarnings("serial") // anonymous class - private static final Action triggerSelectionAction = new AbstractAction() { + private final Action triggerSelectionAction = new AbstractAction() { public void actionPerformed(final ActionEvent e) { triggerSelectionEvent((JComboBox)e.getSource(), e); } + + @Override + public boolean isEnabled() { + return comboBox.isPopupVisible() && super.isEnabled(); + } }; @SuppressWarnings("serial") // anonymous class --- old/test/javax/swing/JComboBox/ConsumedEscTest/ConsumedEscTest.java 2014-11-19 15:02:10.000000000 +0400 +++ new/test/javax/swing/JComboBox/ConsumedEscTest/ConsumedEscTest.java 2014-11-19 15:02:10.000000000 +0400 @@ -36,9 +36,15 @@ */ public class ConsumedEscTest { private static volatile JFrame frame; - private static volatile boolean passed = false; + private static volatile boolean passed; public static void main(String... args) throws Exception { + test(KeyEvent.VK_ESCAPE); + test(KeyEvent.VK_ENTER); + } + + private static void test(final int key) throws Exception { + passed = false; try { SwingUtilities.invokeAndWait(() -> { frame = new JFrame(); @@ -47,14 +53,14 @@ panel.add(combo); combo.requestFocusInWindow(); frame.setBounds(100, 150, 300, 100); - addAction(panel); + addAction(panel, key); frame.add(panel); frame.setVisible(true); }); ExtendedRobot robot = new ExtendedRobot(); robot.waitForIdle(); - robot.type(KeyEvent.VK_ESCAPE); + robot.type(key); robot.waitForIdle(); if (!passed) { throw new RuntimeException("FAILED: ESC was consumed by combo box"); @@ -64,10 +70,11 @@ frame.dispose(); } } + } - private static void addAction(JComponent comp) { - KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); + private static void addAction(JComponent comp, int key) { + KeyStroke k = KeyStroke.getKeyStroke(key, 0); Object actionKey = "cancel"; comp.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(k, actionKey); Action cancelAction = new AbstractAction() {