/* * [TestJComboBox.java] * * Summary: Demonstrate the use of javax.swing.JComboBox. * * Copyright: (c) 2009-2017 Roedy Green, Canadian Mind Products, http://mindprod.com * * Licence: This software may be copied and used freely for any purpose but military. * http://mindprod.com/contact/nonmil.html * * Requires: JDK 1.8+ * * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/ * * Version History: * 1.0 2009-01-01 initial version * 1.1 2009-04-27 demonstrate use of setMaximumRowCount */ package com.mindprod.example; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.SwingUtilities; import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import static java.lang.System.*; /** * Demonstrate the use of javax.swing.JComboBox. * * @author Roedy Green, Canadian Mind Products * @version 1.1 2009-04-27 demonstrate use of setMaximumRowCount * @since 2009-01-01 */ public final class TestJComboBox { private static final Color FOREGROUND_FOR_LABEL = new Color( 0x0000b0 ); /** * Debugging harness for a Frame * * @param args command line arguments are ignored. */ public static void main( String args[] ) { SwingUtilities.invokeLater( new Runnable() { public void run() { final JFrame jFrame = new JFrame(); final Container contentPane = jFrame.getContentPane(); contentPane.setLayout( new FlowLayout() ); final JComboBox flavour = new JComboBox<>( new String[] { "strawberry", "chocolate", "vanilla" } ); // ensure all three choices will be displayed without scrolling. flavour.setMaximumRowCount( 3 ); flavour.setForeground( FOREGROUND_FOR_LABEL ); flavour.setBackground( Color.WHITE ); flavour.setFont( new Font( "Dialog", Font.BOLD, 15 ) ); // turn off the write-in feature flavour.setEditable( false ); // setting the selection flavour.setSelectedIndex( 0 ); // alternatively, by value. // Compares against defined items with. .equals, not ==. // For custom objects will want a custom equals method. // Selected items work best with enums. flavour.setSelectedItem( "chocolate" ); // No multiple selections permitted, ever, even though this is called a combo box. // so there is nothing we need to do to prevent them. final ItemListener theListener = new ItemListener() { /** * Called whenever the value of the selection changes. Will * be called twice for every change. * @param e the event that characterizes the change. */ public void itemStateChanged( ItemEvent e ) { final int selectedIndex = flavour.getSelectedIndex(); // even though JComboBox is generic, you still need the (String) cast, a legacy quirk. final String choice = ( String ) flavour.getSelectedItem(); out.println( selectedIndex + " " + choice + " " + e.toString() ); } }; // add components flavour.addItemListener( theListener ); contentPane.add( flavour ); // build frame jFrame.setSize( 100, 100 ); jFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); jFrame.validate(); jFrame.setVisible( true ); // experiment with JComboBox.setSelectedIndex // This generates TWO itemStateChanged events. // One with item=old value stateChange=DESELECTED // and one with item=new value and stateChange=SELECTED flavour.setSelectedIndex( 2 ); // suppress itemChangedEvents flavour.removeItemListener( theListener ); // generates no itemChangedEvents flavour.setSelectedIndex( 1 ); // turn itemChangedEvents back ot flavour.addItemListener( theListener ); // generates two itemChangedEvents, usual per usual flavour.setSelectedIndex( 0 ); } } ); } // end main }