/* * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * @test * @key headful * @bug 4515752 4337071 * @author Mark Davidson * @summary Tests the invocation of the default button within the JComboBox. */ public class DefaultButtonTest extends JFrame implements ActionListener { private static boolean defaultButtonPressed = false; private static boolean editChanged = false; private static String[] strData = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; private static String[] strData2 = { "One", "Two", "Three", "Four", "Five", "Six", "Seven" }; public static void main(String[] args) throws Throwable { SwingUtilities.invokeAndWait(new Runnable(){ public void run() { new DefaultButtonTest(); } }); test(); System.out.println("Test Passed"); } public DefaultButtonTest() { getContentPane().add(new DefaultPanel(this)); pack(); setVisible(true); } public static void test() { // Use Robot to automate the test Robot robot = null; try { robot = new Robot(); } catch (Exception ex) { ex.printStackTrace(); } robot.setAutoDelay(125); for (int i = 0; i < 3; i++) { // Test ENTER press on the non editable combo. robot.waitForIdle(); robot.keyPress(KeyEvent.VK_ENTER); robot.waitForIdle(); robot.keyRelease(KeyEvent.VK_ENTER); robot.waitForIdle(); testDefaultButton(true); // Test the ENTER press on the editable combo box robot.keyPress(KeyEvent.VK_TAB); robot.waitForIdle(); robot.keyRelease(KeyEvent.VK_TAB); robot.waitForIdle(); robot.keyPress(KeyEvent.VK_ENTER); robot.waitForIdle(); robot.keyRelease(KeyEvent.VK_ENTER); robot.waitForIdle(); testDefaultButton(true); // Change the value, should generate a change but not a Default Button press. robot.waitForIdle(); robot.keyPress(KeyEvent.VK_D); robot.waitForIdle(); robot.keyRelease(KeyEvent.VK_D); robot.waitForIdle(); robot.keyPress(KeyEvent.VK_ENTER); robot.waitForIdle(); robot.keyRelease(KeyEvent.VK_ENTER); robot.waitForIdle(); testEditChange(true); robot.waitForIdle(); testDefaultButton(true); // Change value, changing focus should fire an ActionEvent. robot.waitForIdle(); robot.keyPress(KeyEvent.VK_BACK_SPACE); robot.waitForIdle(); robot.keyRelease(KeyEvent.VK_BACK_SPACE); robot.waitForIdle(); robot.keyPress(KeyEvent.VK_SHIFT); robot.waitForIdle(); robot.keyPress(KeyEvent.VK_TAB); robot.waitForIdle(); robot.keyRelease(KeyEvent.VK_SHIFT); robot.waitForIdle(); robot.keyRelease(KeyEvent.VK_TAB); robot.waitForIdle(); testEditChange(true); robot.waitForIdle(); testDefaultButton(false); } } public void actionPerformed(ActionEvent evt) { String cmd = evt.getActionCommand(); System.out.println("ActionEvent: " + cmd); if (cmd.equals("OK")) { defaultButtonPressed = true; } if (cmd.equals("comboBoxChanged")) { editChanged = true; } } public static void testDefaultButton(boolean flag) { if (defaultButtonPressed != flag) { new RuntimeException("defaultButtonPressed unexpectedly = " + defaultButtonPressed); } // reset defaultButtonPressed = false; } public static void testEditChange(boolean flag) { if (editChanged != flag) { new RuntimeException("editChanged unexpectedly = " + editChanged); } // reset editChanged = false; } class DefaultPanel extends JPanel { public JComboBox combo; public JComboBox combo2; private JButton okButton = new JButton("OK"); private JButton cancelButton = new JButton("Cancel"); public DefaultPanel(JFrame root) { setLayout(new BorderLayout()); add(createPanel(), BorderLayout.NORTH); add(createInfoPanel(), BorderLayout.CENTER); add(createButtonPanel(root), BorderLayout.SOUTH); } private JPanel createPanel() { combo = new JComboBox(strData); combo.addActionListener(DefaultButtonTest.this); combo2 = new JComboBox(strData2); combo2.setEditable(true); combo2.addActionListener(DefaultButtonTest.this); JPanel panel = new JPanel(); panel.add(combo); panel.add(combo2); return panel; } private JScrollPane createInfoPanel() { StringBuffer txt = new StringBuffer("Test for 4337071:\n"); txt.append("ENTER pressed in NON-EDITABLE combo box should be passed to the OK button.\n"); txt.append("For an EDITABLE combo box, the combo box should fire an action event."); txt.append("\n\nTest for 4515752:\n"); txt.append("ENTER on an EDITABLE combo box in which the contents has not changed\n"); txt.append("should be passed to the default button"); JTextArea text = new JTextArea(txt.toString()); text.setEditable(false); return new JScrollPane(text); } private JPanel createButtonPanel(JFrame frame) { frame.getRootPane().setDefaultButton(okButton); // This is just to check when the OK Button was pressed. okButton.addActionListener(DefaultButtonTest.this); JPanel panel = new JPanel(); panel.add(okButton); panel.add(cancelButton); return panel; } } }