Java/Swing JFC/ComboBox
Содержание
- 1 Add an item after the first item
- 2 Add an item to the end of the list
- 3 Adding and Removing an Item in a JComboBox Component
- 4 A fancy example of JComboBox with a custom renderer and editor
- 5 ArrayListComboBoxModel Demo
- 6 Color ComboBox: ComboBoxEditor Demo
- 7 Color combobox renderer
- 8 Combobox combines a button or editable field and a drop-down list.
- 9 ComboBox Demo
- 10 ComboBox Demo 2
- 11 ComboBox Sample
- 12 ComoboBox loads and saves items automatically from a file
- 13 Create a simple combobox
- 14 Creating a read-only and editable JComboBox Component
- 15 Custom ComboBox with Image
- 16 Determining If the Menu of a JComboBox Component Is Visible
- 17 Determining When the Menu of a JComboBox Component Is Displayed
- 18 Displaying the Menu in a JComboBox Component Using a Keystroke
- 19 Displaying the Menu in a JComboBox Component Using a Keystroke If the Selected Item Is Not Unique
- 20 Editable ComboBox
- 21 Font Chooser ComboBox
- 22 Getting and Setting the Selected Item in a JComboBox Component
- 23 Getting the Items in a JComboBox Component
- 24 If the combobox is editable, the new value can be any value
- 25 Listening for Action Events from a JComboBox Component
- 26 Listening for Changes to the Selected Item in a JComboBox Component
- 27 MultiKey Combo
- 28 PopupCombo Sample
- 29 Remove all items
- 30 Remove first item
- 31 Remove the last item
- 32 Selecting an Item in a JComboBox Component with Multiple Keystrokes
- 33 Selecting Combo Sample
- 34 Select the combobox by choose the nearby label
- 35 Setting the Number of Visible Items in the Menu of a JComboBox Component
- 36 Using drop-down lists
Add an item after the first item
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.insertItemAt("item0.5", 1); }
}
</source>
Add an item to the end of the list
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.addItem("item3"); }
}
</source>
Adding and Removing an Item in a JComboBox Component
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); // Add an item to the start of the list cb.insertItemAt("item0", 0); }
}
</source>
A fancy example of JComboBox with a custom renderer and editor
<source lang="java">
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O"Reilly
- /
// EditableComboBox.java //A fancy example of JComboBox with a custom renderer and editor used to //display a list of JLabel objects that include both text and icons. // import java.awt.BorderLayout; import java.awt.ruponent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; import javax.swing.ruboBoxEditor; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.BevelBorder; public class EditableComboBox extends JPanel {
private BookEntry books[] = { new BookEntry("Ant: The Definitive Guide", "covers/ant.gif"), new BookEntry("Database Programming with JDBC and Java", "covers/jdbc.gif"), new BookEntry("Developing Java Beans", "covers/beans.gif"), new BookEntry("Developing JSP Custom Tag Libraries", "covers/jsptl.gif"), new BookEntry("Java 2D Graphics", "covers/java2d.gif"), new BookEntry("Java and XML", "covers/jxml.gif"), new BookEntry("Java and XSLT", "covers/jxslt.gif"), new BookEntry("Java and SOAP", "covers/jsoap.gif"), new BookEntry("Java and XML Data Binding", "covers/jxmldb.gif"), new BookEntry("Java Cookbook", "covers/jcook.gif"), new BookEntry("Java Cryptography", "covers/jcrypto.gif"), new BookEntry("Java Distributed Computing", "covers/jdist.gif"), new BookEntry("Java I/O", "covers/javaio.gif"), new BookEntry("Java in a Nutshell", "covers/javanut.gif"), new BookEntry("Java Management Extensions", "covers/jmx.gif"), new BookEntry("Java Message Service", "covers/jms.gif"), new BookEntry("Java Network Programming", "covers/jnetp.gif"), new BookEntry("Java Performance Tuning", "covers/jperf.gif"), new BookEntry("Java RMI", "covers/jrmi.gif"), new BookEntry("Java Security", "covers/jsec.gif"), new BookEntry("JavaServer Pages", "covers/jsp.gif"), new BookEntry("Java Servlet Programming", "covers/servlet.gif"), new BookEntry("Java Swing", "covers/swing.gif"), new BookEntry("Java Threads", "covers/jthread.gif"), new BookEntry("Java Web Services", "covers/jws.gif"), new BookEntry("Learning Java", "covers/learnj.gif") }; Map bookMap = new HashMap(); public EditableComboBox() { // Build a mapping from book titles to their entries for (int i = 0; i < books.length; i++) { bookMap.put(books[i].getTitle(), books[i]); } setLayout(new BorderLayout()); JComboBox bookCombo = new JComboBox(books); bookCombo.setEditable(true); bookCombo.setEditor(new ComboBoxEditorExample(bookMap, books[0])); bookCombo.setMaximumRowCount(4); bookCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("You chose " + ((JComboBox) e.getSource()).getSelectedItem() + "!"); } }); bookCombo.setActionCommand("Hello"); add(bookCombo, BorderLayout.CENTER); } public static void main(String s[]) { JFrame frame = new JFrame("Combo Box Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(new EditableComboBox()); frame.pack(); frame.setVisible(true); }
} class BookEntry {
private final String title; private final String imagePath; private ImageIcon image; public BookEntry(String title, String imagePath) { this.title = title; this.imagePath = imagePath; } public String getTitle() { return title; } public ImageIcon getImage() { if (image == null) { image = new ImageIcon(imagePath); } return image; } // Override standard toString method to give a useful result public String toString() { return title; }
} class ComboBoxEditorExample implements ComboBoxEditor {
Map map; ImagePanel panel; ImageIcon questionIcon; public ComboBoxEditorExample(Map m, BookEntry defaultChoice) { map = m; panel = new ImagePanel(defaultChoice); questionIcon = new ImageIcon("question.gif"); } public void setItem(Object anObject) { if (anObject != null) { panel.setText(anObject.toString()); BookEntry entry = (BookEntry) map.get(anObject.toString()); if (entry != null) panel.setIcon(entry.getImage()); else panel.setIcon(questionIcon); } } public Component getEditorComponent() { return panel; } public Object getItem() { return panel.getText(); } public void selectAll() { panel.selectAll(); } public void addActionListener(ActionListener l) { panel.addActionListener(l); } public void removeActionListener(ActionListener l) { panel.removeActionListener(l); } // We create our own inner class to handle setting and // repainting the image and the text. class ImagePanel extends JPanel { JLabel imageIconLabel; JTextField textField; public ImagePanel(BookEntry initialEntry) { setLayout(new BorderLayout()); imageIconLabel = new JLabel(initialEntry.getImage()); imageIconLabel.setBorder(new BevelBorder(BevelBorder.RAISED)); textField = new JTextField(initialEntry.getTitle()); textField.setColumns(45); textField.setBorder(new BevelBorder(BevelBorder.LOWERED)); add(imageIconLabel, BorderLayout.WEST); add(textField, BorderLayout.EAST); } public void setText(String s) { textField.setText(s); } public String getText() { return (textField.getText()); } public void setIcon(Icon i) { imageIconLabel.setIcon(i); repaint(); } public void selectAll() { textField.selectAll(); } public void addActionListener(ActionListener l) { textField.addActionListener(l); } public void removeActionListener(ActionListener l) { textField.removeActionListener(l); } }
}
</source>
ArrayListComboBoxModel Demo
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import java.util.ArrayList; import java.util.Collection; import javax.swing.AbstractListModel; import javax.swing.ruboBoxModel; import javax.swing.JComboBox; import javax.swing.JFrame; public class ArrayListComboBoxModel extends AbstractListModel implements
ComboBoxModel { private Object selectedItem; private ArrayList anArrayList; public ArrayListComboBoxModel(ArrayList arrayList) { anArrayList = arrayList; } public Object getSelectedItem() { return selectedItem; } public void setSelectedItem(Object newValue) { selectedItem = newValue; } public int getSize() { return anArrayList.size(); } public Object getElementAt(int i) { return anArrayList.get(i); } public static void main(String args[]) { JFrame frame = new JFrame("ArrayListComboBoxModel"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Collection col = System.getProperties().values(); ArrayList arrayList = new ArrayList(col); ArrayListComboBoxModel model = new ArrayListComboBoxModel(arrayList); JComboBox comboBox = new JComboBox(model); Container contentPane = frame.getContentPane(); contentPane.add(comboBox, BorderLayout.NORTH); frame.setSize(300, 225); frame.setVisible(true); }
}
</source>
Color ComboBox: ComboBoxEditor Demo
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ruboBoxEditor; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; import javax.swing.event.EventListenerList; public class ColorComboBox {
static class ColorCellRenderer implements ListCellRenderer { protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer(); // width doesn"t matter as combobox will size private final static Dimension preferredSize = new Dimension(0, 20); public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel renderer = (JLabel) defaultRenderer .getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof Color) { renderer.setBackground((Color) value); } renderer.setPreferredSize(preferredSize); return renderer; } } public static void main(String args[]) { Color colors[] = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow }; JFrame frame = new JFrame("Color JComboBox"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); final JComboBox comboBox = new JComboBox(colors); comboBox.setMaximumRowCount(5); comboBox.setEditable(true); comboBox.setRenderer(new ColorCellRenderer()); Color color = (Color) comboBox.getSelectedItem(); ComboBoxEditor editor = new ColorComboBoxEditor(color); comboBox.setEditor(editor); contentPane.add(comboBox, BorderLayout.NORTH); final JLabel label = new JLabel(); label.setOpaque(true); label.setBackground((Color) comboBox.getSelectedItem()); contentPane.add(label, BorderLayout.CENTER); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { Color selectedColor = (Color) comboBox.getSelectedItem(); label.setBackground(selectedColor); } }; comboBox.addActionListener(actionListener); frame.setSize(300, 200); frame.setVisible(true); }
} class ColorComboBoxEditor implements ComboBoxEditor {
final protected JButton editor; transient protected EventListenerList listenerList = new EventListenerList(); public ColorComboBoxEditor(Color initialColor) { editor = new JButton(""); editor.setBackground(initialColor); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { Color currentBackground = editor.getBackground(); Color color = JColorChooser.showDialog(editor, "Color Chooser", currentBackground); if ((color != null) && (currentBackground != color)) { editor.setBackground(color); fireActionEvent(color); } } }; editor.addActionListener(actionListener); } public void addActionListener(ActionListener l) { listenerList.add(ActionListener.class, l); } public Component getEditorComponent() { return editor; } public Object getItem() { return editor.getBackground(); } public void removeActionListener(ActionListener l) { listenerList.remove(ActionListener.class, l); } public void selectAll() { // ignore } public void setItem(Object newValue) { if (newValue instanceof Color) { Color color = (Color) newValue; editor.setBackground(color); } else { // Try to decode try { Color color = Color.decode(newValue.toString()); editor.setBackground(color); } catch (NumberFormatException e) { // ignore - value unchanged } } } protected void fireActionEvent(Color color) { Object listeners[] = listenerList.getListenerList(); for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == ActionListener.class) { ActionEvent actionEvent = new ActionEvent(editor, ActionEvent.ACTION_PERFORMED, color.toString()); ((ActionListener) listeners[i + 1]) .actionPerformed(actionEvent); } } }
}
</source>
Color combobox renderer
<source lang="java">
import java.awt.Color; import java.awt.ruponent; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; import javax.swing.ToolTipManager; import javax.swing.border.rupoundBorder; import javax.swing.border.LineBorder; import javax.swing.border.MatteBorder; public class ColorComboRenderer extends JPanel implements ListCellRenderer {
protected Color m_c = Color.black; public ColorComboRenderer() { super(); setBorder(new CompoundBorder( new MatteBorder(2, 10, 2, 10, Color.white), new LineBorder( Color.black))); } public Component getListCellRendererComponent(JList list, Object obj, int row, boolean sel, boolean hasFocus) { if (obj instanceof Color) m_c = (Color) obj; return this; } public void paint(Graphics g) { setBackground(m_c); super.paint(g); } public static void main(String[] a) { JComboBox cbColor = new JComboBox(); int[] values = new int[] { 0, 128, 192, 255 }; for (int r = 0; r < values.length; r++) for (int g = 0; g < values.length; g++) for (int b = 0; b < values.length; b++) { Color c = new Color(values[r], values[g], values[b]); cbColor.addItem(c); } cbColor.setRenderer(new ColorComboRenderer()); JFrame f = new JFrame(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.getContentPane().add(cbColor); f.pack(); f.setSize(new Dimension(300, 80)); f.show(); }
}
</source>
Combobox combines a button or editable field and a drop-down list.
<source lang="java">
import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; public class ComboBox extends JDialog implements ActionListener, ItemListener {
final String[] authors = { "A", "B", "C", "D", "E", "F" }; final String[] images = { "a.jpg", "b.jpg", "c.jpg", "d.jpg","e.jpg", "f.jpg" }; JLabel display = new JLabel(); JComboBox combobox = new JComboBox(authors); JButton button = new JButton("Close"); ImageIcon icon = new ImageIcon(ClassLoader.getSystemResource("a.jpg")); public ComboBox() { setLayout(new FlowLayout()); add(display); combobox.setSelectedIndex(-1); combobox.addItemListener(this); add(combobox); button.addActionListener(this); add(button); setSize(300, 300); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { new ComboBox(); } public void actionPerformed(ActionEvent e) { System.exit(0); } public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { JComboBox combo = (JComboBox) e.getSource(); int index = combo.getSelectedIndex(); display.setIcon(new ImageIcon(ClassLoader.getSystemResource(images[index]))); } }
}
</source>
ComboBox Demo
<source lang="java">
/* From http://java.sun.ru/docs/books/tutorial/index.html */ /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
import java.awt.*; import java.awt.event.*; import javax.swing.*; /*
* ComboBoxDemo.java is a 1.4 application that uses these additional files: * images/Bird.gif * images/Cat.gif * images/Dog.gif * images/Rabbit.gif * images/Pig.gif */
public class ComboBoxDemo extends JPanel
implements ActionListener { JLabel picture; public ComboBoxDemo() { super(new BorderLayout()); String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; //Create the combo box, select the item at index 4. //Indices start at 0, so 4 specifies the pig. JComboBox petList = new JComboBox(petStrings); petList.setSelectedIndex(4); petList.addActionListener(this); //Set up the picture. picture = new JLabel(); picture.setFont(picture.getFont().deriveFont(Font.ITALIC)); picture.setHorizontalAlignment(JLabel.CENTER); updateLabel(petStrings[petList.getSelectedIndex()]); picture.setBorder(BorderFactory.createEmptyBorder(10,0,0,0)); //The preferred size is hard-coded to be the width of the //widest image and the height of the tallest image + the border. //A real program would compute this. picture.setPreferredSize(new Dimension(177, 122+10)); //Lay out the demo. add(petList, BorderLayout.PAGE_START); add(picture, BorderLayout.PAGE_END); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } /** Listens to the combo box. */ public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); String petName = (String)cb.getSelectedItem(); updateLabel(petName); } protected void updateLabel(String name) { ImageIcon icon = createImageIcon("images/" + name + ".gif"); picture.setIcon(icon); picture.setToolTipText("A drawing of a " + name.toLowerCase()); if (icon != null) { picture.setText(null); } else { picture.setText("Image not found"); } } /** Returns an ImageIcon, or null if the path was invalid. */ protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = ComboBoxDemo.class.getResource(path); if (imgURL != null) { return new ImageIcon(imgURL); } else { System.err.println("Couldn"t find file: " + path); return null; } } /** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Make sure we have nice window decorations. JFrame.setDefaultLookAndFeelDecorated(true); //Create and set up the window. JFrame frame = new JFrame("ComboBoxDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new ComboBoxDemo(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application"s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); }
}
</source>
ComboBox Demo 2
<source lang="java">
/* From http://java.sun.ru/docs/books/tutorial/index.html */ /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
import java.awt.Color; import java.awt.ruponent; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; /* ComboBoxDemo2.java is a 1.4 application that requires no other files. */ public class ComboBoxDemo2 extends JPanel implements ActionListener {
static JFrame frame; JLabel result; String currentPattern; public ComboBoxDemo2() { setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); String[] patternExamples = { "dd MMMMM yyyy", "dd.MM.yy", "MM/dd/yy", "yyyy.MM.dd G "at" hh:mm:ss z", "EEE, MMM d, ""yy", "h:mm a", "H:mm:ss:SSS", "K:mm a,z", "yyyy.MMMMM.dd GGG hh:mm aaa" }; currentPattern = patternExamples[0]; //Set up the UI for selecting a pattern. JLabel patternLabel1 = new JLabel("Enter the pattern string or"); JLabel patternLabel2 = new JLabel("select one from the list:"); JComboBox patternList = new JComboBox(patternExamples); patternList.setEditable(true); patternList.addActionListener(this); //Create the UI for displaying result. JLabel resultLabel = new JLabel("Current Date/Time", JLabel.LEADING); //== // LEFT result = new JLabel(" "); result.setForeground(Color.black); result.setBorder(BorderFactory.createCompoundBorder(BorderFactory .createLineBorder(Color.black), BorderFactory .createEmptyBorder(5, 5, 5, 5))); //Lay out everything. JPanel patternPanel = new JPanel(); patternPanel .setLayout(new BoxLayout(patternPanel, BoxLayout.PAGE_AXIS)); patternPanel.add(patternLabel1); patternPanel.add(patternLabel2); patternList.setAlignmentX(Component.LEFT_ALIGNMENT); patternPanel.add(patternList); JPanel resultPanel = new JPanel(new GridLayout(0, 1)); resultPanel.add(resultLabel); resultPanel.add(result); patternPanel.setAlignmentX(Component.LEFT_ALIGNMENT); resultPanel.setAlignmentX(Component.LEFT_ALIGNMENT); add(patternPanel); add(Box.createRigidArea(new Dimension(0, 10))); add(resultPanel); setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); reformat(); } //constructor public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox) e.getSource(); String newSelection = (String) cb.getSelectedItem(); currentPattern = newSelection; reformat(); } /** Formats and displays today"s date. */ public void reformat() { Date today = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(currentPattern); try { String dateString = formatter.format(today); result.setForeground(Color.black); result.setText(dateString); } catch (IllegalArgumentException iae) { result.setForeground(Color.red); result.setText("Error: " + iae.getMessage()); } } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { //Make sure we have nice window decorations. JFrame.setDefaultLookAndFeelDecorated(true); //Create and set up the window. JFrame frame = new JFrame("ComboBoxDemo2"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new ComboBoxDemo2(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application"s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); }
}
</source>
ComboBox Sample
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JComboBox; import javax.swing.JFrame; public class ComboBoxSample {
public static void main(String args[]) { String labels[] = { "A", "B", "C", "D","E", "F", "G", "H","I", "J" }; String title = (args.length == 0 ? "Example JComboBox" : args[0]); JFrame frame = new JFrame(title); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentpane = frame.getContentPane(); JComboBox comboBox1 = new JComboBox(labels); comboBox1.setMaximumRowCount(5); contentpane.add(comboBox1, BorderLayout.NORTH); JComboBox comboBox2 = new JComboBox(labels); comboBox2.setEditable(true); contentpane.add(comboBox2, BorderLayout.SOUTH); frame.setSize(300, 200); frame.setVisible(true); }
}
</source>
ComoboBox loads and saves items automatically from a file
<source lang="java">
import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.net.URL; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ruboBoxModel; import javax.swing.JComboBox; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; public class MemComboBoxDemo extends JFrame {
protected MemComboBox urlComboBox = new MemComboBox(); public MemComboBoxDemo() { super(); setSize(300, 100); getContentPane().setLayout(new BorderLayout()); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); p.add(new JLabel("Address")); urlComboBox.load("addresses.dat"); ComboBoxListener lst = new ComboBoxListener(); urlComboBox.addActionListener(lst); MemComboAgent agent = new MemComboAgent(urlComboBox); p.add(urlComboBox); getContentPane().add(p, BorderLayout.NORTH); WindowListener wndCloser = new WindowAdapter() { public void windowClosing(WindowEvent e) { urlComboBox.save("addresses.dat"); System.exit(0); } }; addWindowListener(wndCloser); setVisible(true); urlComboBox.grabFocus(); } class ComboBoxListener implements ActionListener{ public void actionPerformed(ActionEvent evt) { System.out.println( urlComboBox.getSelectedItem()); } } public static void main(String argv[]) { new MemComboBoxDemo(); }
} class MemComboAgent extends KeyAdapter {
protected JComboBox comboBox; protected JTextField editor; public MemComboAgent(JComboBox c) { comboBox = c; editor = (JTextField) c.getEditor().getEditorComponent(); editor.addKeyListener(this); } public void keyReleased(KeyEvent e) { char ch = e.getKeyChar(); if (ch == KeyEvent.CHAR_UNDEFINED || Character.isISOControl(ch)) return; int pos = editor.getCaretPosition(); String str = editor.getText(); if (str.length() == 0) return; for (int k = 0; k < comboBox.getItemCount(); k++) { String item = comboBox.getItemAt(k).toString(); if (item.startsWith(str)) { editor.setText(item); editor.setCaretPosition(item.length()); editor.moveCaretPosition(pos); break; } } }
} class MemComboBox extends JComboBox {
public static final int MAX_MEM_LEN = 30; public MemComboBox() { super(); setEditable(true); } public void add(String item) { removeItem(item); insertItemAt(item, 0); setSelectedItem(item); if (getItemCount() > MAX_MEM_LEN) removeItemAt(getItemCount() - 1); } public void load(String fName) { try { if (getItemCount() > 0) removeAllItems(); File f = new File(fName); if (!f.exists()) return; FileInputStream fStream = new FileInputStream(f); ObjectInput stream = new ObjectInputStream(fStream); Object obj = stream.readObject(); if (obj instanceof ComboBoxModel) setModel((ComboBoxModel) obj); stream.close(); fStream.close(); } catch (Exception e) { System.err.println("Serialization error: " + e.toString()); } } public void save(String fName) { try { FileOutputStream fStream = new FileOutputStream(fName); ObjectOutput stream = new ObjectOutputStream(fStream); stream.writeObject(getModel()); stream.flush(); stream.close(); fStream.close(); } catch (Exception e) { System.err.println("Serialization error: " + e.toString()); } }
}
</source>
Create a simple combobox
<source lang="java">
import java.awt.BorderLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.Vector; import javax.swing.JComboBox; import javax.swing.JFrame; public class ComboBox extends JFrame {
public ComboBox() { super("ComboBox"); getContentPane().setLayout(new BorderLayout()); Vector cars = new Vector(); cars.addElement("1"); cars.addElement("2"); cars.addElement("3"); getContentPane().add(new JComboBox(cars)); WindowListener wndCloser = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; addWindowListener(wndCloser); // setResizable(false); pack(); setVisible(true); } public static void main(String argv[]) { new ComboBox(); }
}
</source>
Creating a read-only and editable JComboBox Component
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { // Create a read-only combobox String[] items = { "item1", "item2" }; JComboBox readOnlyCB = new JComboBox(items); // Create an editable combobox items = new String[] { "item1", "item2" }; JComboBox editableCB = new JComboBox(items); editableCB.setEditable(true); }
}
</source>
Custom ComboBox with Image
<source lang="java">
/* From http://java.sun.ru/docs/books/tutorial/index.html */ /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
import java.awt.BorderLayout; import java.awt.ruponent; import java.awt.Dimension; import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; /*
* CustomComboBoxDemo.java is a 1.4 application that uses the following files: * images/Bird.gif * images/Cat.gif * images/Dog.gif * images/Rabbit.gif * images/Pig.gif */
public class CustomComboBoxDemo extends JPanel {
ImageIcon[] images; String[] petStrings = {"Bird", "Cat", "Dog", "Rabbit", "Pig"}; /* * Despite its use of EmptyBorder, this panel makes a fine content * pane because the empty border just increases the panel"s size * and is "painted" on top of the panel"s normal background. In * other words, the JPanel fills its entire background if it"s * opaque (which it is by default); adding a border doesn"t change * that. */ public CustomComboBoxDemo() { super(new BorderLayout()); //Load the pet images and create an array of indexes. images = new ImageIcon[petStrings.length]; Integer[] intArray = new Integer[petStrings.length]; for (int i = 0; i < petStrings.length; i++) { intArray[i] = new Integer(i); images[i] = createImageIcon("images/" + petStrings[i] + ".gif"); if (images[i] != null) { images[i].setDescription(petStrings[i]); } } //Create the combo box. JComboBox petList = new JComboBox(intArray); ComboBoxRenderer renderer= new ComboBoxRenderer(); renderer.setPreferredSize(new Dimension(200, 130)); petList.setRenderer(renderer); petList.setMaximumRowCount(3); //Lay out the demo. add(petList, BorderLayout.PAGE_START); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } /** Returns an ImageIcon, or null if the path was invalid. */ protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = CustomComboBoxDemo.class.getResource(path); if (imgURL != null) { return new ImageIcon(imgURL); } else { System.err.println("Couldn"t find file: " + path); return null; } } /** * Create the GUI and show it. For thread safety, * this method should be invoked from the * event-dispatching thread. */ private static void createAndShowGUI() { //Make sure we have nice window decorations. JFrame.setDefaultLookAndFeelDecorated(true); //Create and set up the window. JFrame frame = new JFrame("CustomComboBoxDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. JComponent newContentPane = new CustomComboBoxDemo(); newContentPane.setOpaque(true); //content panes must be opaque frame.setContentPane(newContentPane); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application"s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } class ComboBoxRenderer extends JLabel implements ListCellRenderer { private Font uhOhFont; public ComboBoxRenderer() { setOpaque(true); setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); } /* * This method finds the image and text corresponding * to the selected value and returns the label, set up * to display the text and image. */ public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { //Get the selected index. (The index param isn"t //always valid, so just use the value.) int selectedIndex = ((Integer)value).intValue(); if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } //Set the icon and text. If icon was null, say so. ImageIcon icon = images[selectedIndex]; String pet = petStrings[selectedIndex]; setIcon(icon); if (icon != null) { setText(pet); setFont(list.getFont()); } else { setUhOhText(pet + " (no image available)", list.getFont()); } return this; } //Set the font and text when no image was found. protected void setUhOhText(String uhOhText, Font normalFont) { if (uhOhFont == null) { //lazily create this font uhOhFont = normalFont.deriveFont(Font.ITALIC); } setFont(uhOhFont); setText(uhOhText); } }
}
</source>
Determining If the Menu of a JComboBox Component Is Visible
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); // Determine if the menu is visible boolean isVisible = cb.isPopupVisible(); }
}
</source>
Determining When the Menu of a JComboBox Component Is Displayed
<source lang="java">
import javax.swing.JComboBox; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.setEditable(true); MyPopupMenuListener actionListener = new MyPopupMenuListener(); cb.addPopupMenuListener(actionListener); }
} class MyPopupMenuListener implements PopupMenuListener {
public void popupMenuWillBecomeVisible(PopupMenuEvent evt) { JComboBox cb = (JComboBox) evt.getSource(); } public void popupMenuWillBecomeInvisible(PopupMenuEvent evt) { JComboBox cb = (JComboBox) evt.getSource(); } public void popupMenuCanceled(PopupMenuEvent evt) { JComboBox cb = (JComboBox) evt.getSource(); }
}
</source>
Displaying the Menu in a JComboBox Component Using a Keystroke
<source lang="java">
import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "A", "A", "B", "B", "C", "C" }; JComboBox cb = new JComboBox(items); // Create and register the key listener cb.addKeyListener(new MyKeyListener()); }
} class MyKeyListener extends KeyAdapter {
public void keyPressed(KeyEvent evt) { JComboBox cb = (JComboBox) evt.getSource(); // Get pressed character char ch = evt.getKeyChar(); // If not a printable character, return if (ch != KeyEvent.CHAR_UNDEFINED) { cb.showPopup(); } }
}
</source>
Displaying the Menu in a JComboBox Component Using a Keystroke If the Selected Item Is Not Unique
<source lang="java">
import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "A", "A", "B", "B", "C" }; JComboBox cb = new JComboBox(items); // Create and register the key listener cb.addKeyListener(new MyKeyListener()); }
} class MyKeyListener extends KeyAdapter {
public void keyPressed(KeyEvent evt) { JComboBox cb = (JComboBox) evt.getSource(); int curIx = cb.getSelectedIndex(); char ch = evt.getKeyChar(); JComboBox.KeySelectionManager ksm = cb.getKeySelectionManager(); if (ksm != null) { // Determine if another item has the same prefix int ix = ksm.selectionForKey(ch, cb.getModel()); boolean noMatch = ix < 0; boolean uniqueItem = ix == curIx; // Display menu if no matching items or the if the selection is not unique if (noMatch || !uniqueItem) { cb.showPopup(); } } }
}
</source>
Editable ComboBox
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class EditComboBox {
public static void main(String args[]) { String labels[] = { "A", "B", "C", "D","E", "F", "G", "H","I", "J" }; JFrame frame = new JFrame("Editable JComboBox"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); final JComboBox comboBox = new JComboBox(labels); comboBox.setMaximumRowCount(5); comboBox.setEditable(true); contentPane.add(comboBox, BorderLayout.NORTH); final JTextArea textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); contentPane.add(scrollPane, BorderLayout.CENTER); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { textArea.append("Selected: " + comboBox.getSelectedItem()); textArea.append(", Position: " + comboBox.getSelectedIndex()); textArea.append(System.getProperty("line.separator")); } }; comboBox.addActionListener(actionListener); frame.setSize(300, 200); frame.setVisible(true); }
}
</source>
Font Chooser ComboBox
<source lang="java">
import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class FontComboBox extends JFrame implements ActionListener {
JLabel fontLabel = new JLabel( "The quick brown fox jumps over the lazy dog."); private JComboBox fontComboBox; public FontComboBox() { setTitle("ComboBoxTest"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); fontComboBox = new JComboBox(); fontComboBox.setEditable(true); fontComboBox.addItem("Serif"); fontComboBox.addItem("SansSerif"); fontComboBox.addItem("Monospaced"); fontComboBox.addItem("Dialog"); fontComboBox.addItem("DialogInput"); fontComboBox.addActionListener(this); JPanel p = new JPanel(); p.add(fontComboBox); getContentPane().add(p, "North"); getContentPane().add(fontLabel, "Center"); } public void actionPerformed(ActionEvent evt) { JComboBox source = (JComboBox) evt.getSource(); String item = (String) source.getSelectedItem(); fontLabel.setFont(new Font(item, Font.PLAIN, 12)); } public static void main(String[] args) { JFrame frame = new FontComboBox(); frame.show(); }
}
</source>
Getting and Setting the Selected Item in a JComboBox Component
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); // Get current value Object obj = cb.getSelectedItem(); // Set a new value cb.setSelectedItem("item2"); obj = cb.getSelectedItem(); // If the new value is not in the list of valid items, the call is ignored cb.setSelectedItem("item3"); obj = cb.getSelectedItem(); }
}
</source>
Getting the Items in a JComboBox Component
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2", "item3" }; JComboBox cb = new JComboBox(items); // Get number of items int num = cb.getItemCount(); // Get items for (int i = 0; i < num; i++) { Object item = cb.getItemAt(i); } }
}
</source>
If the combobox is editable, the new value can be any value
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { // Create a read-only combobox String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.setEditable(true); cb.setSelectedItem("item3"); Object obj = cb.getSelectedItem(); }
}
</source>
Listening for Action Events from a JComboBox Component
<source lang="java">
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.setEditable(true); // Create and register listener MyActionListener actionListener = new MyActionListener(); cb.addActionListener(actionListener); }
} class MyActionListener implements ActionListener {
Object oldItem; public void actionPerformed(ActionEvent evt) { JComboBox cb = (JComboBox) evt.getSource(); Object newItem = cb.getSelectedItem(); boolean same = newItem.equals(oldItem); oldItem = newItem; if ("comboBoxEdited".equals(evt.getActionCommand())) { // User has typed in a string; only possible with an editable combobox } else if ("comboBoxChanged".equals(evt.getActionCommand())) { // User has selected an item; it may be the same item } }
}
</source>
Listening for Changes to the Selected Item in a JComboBox Component
<source lang="java">
import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.setEditable(true); MyItemListener actionListener = new MyItemListener(); cb.addItemListener(actionListener); }
} class MyItemListener implements ItemListener {
// This method is called only if a new item has been selected. public void itemStateChanged(ItemEvent evt) { JComboBox cb = (JComboBox) evt.getSource(); Object item = evt.getItem(); if (evt.getStateChange() == ItemEvent.SELECTED) { // Item was just selected } else if (evt.getStateChange() == ItemEvent.DESELECTED) { // Item is no longer selected } }
}
</source>
MultiKey Combo
<source lang="java">
/* Definitive Guide to Swing for Java 2, Second Edition By John Zukowski ISBN: 1-893115-78-X Publisher: APress
- /
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.ruboBoxModel; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.Timer; public class MultiKeyCombo {
public static void main(String args[]) { String labels[] = { "One", "Only", "Once", "Okay", "oneself", "onlooker", "Onslaught", "Onyx", "onus", "onward" }; JFrame f = new JFrame("Example JList"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JComboBox jc = new JComboBox(labels); MultiKeySelectionManager mk = new MultiKeySelectionManager(); jc.setKeySelectionManager(mk); // jc.setKeySelectionManager (new JComboBox.KeySelectionManager() { // public int selectionForKey (char aKey, ComboBoxModel aModel) { // return -1; // } // }); Container c = f.getContentPane(); c.add(jc, BorderLayout.NORTH); f.setSize(200, 200); f.setVisible(true); }
} class MultiKeySelectionManager implements JComboBox.KeySelectionManager {
private StringBuffer currentSearch = new StringBuffer(); private Timer resetTimer; private final static int RESET_DELAY = 3000; public MultiKeySelectionManager() { resetTimer = new Timer(RESET_DELAY, new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { currentSearch.setLength(0); } }); } public int selectionForKey(char aKey, ComboBoxModel aModel) { // Reset if invalid character if (aKey == KeyEvent.CHAR_UNDEFINED) { currentSearch.setLength(0); return -1; } // Since search, don"t reset search resetTimer.stop(); // Convert input to uppercase char key = Character.toUpperCase(aKey); // Build up search string currentSearch.append(key); // Find selected position within model to starting searching from Object selectedElement = aModel.getSelectedItem(); int selectedIndex = -1; if (selectedElement != null) { for (int i = 0, n = aModel.getSize(); i < n; i++) { if (aModel.getElementAt(i) == selectedElement) { selectedIndex = i; break; } } } boolean found = false; String search = currentSearch.toString(); // Search from selected forward, wrap back to beginning if not found for (int i = 0, n = aModel.getSize(); i < n; i++) { String element = aModel.getElementAt(selectedIndex).toString() .toUpperCase(); if (element.startsWith(search)) { found = true; break; } selectedIndex++; if (selectedIndex == n) { selectedIndex = 0; // wrap } } // Restart timer resetTimer.start(); return (found ? selectedIndex : -1); }
}
</source>
PopupCombo Sample
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.plaf.ruboBoxUI; import javax.swing.plaf.ruponentUI; import javax.swing.plaf.basic.BasicArrowButton; import javax.swing.plaf.basic.BasicComboBoxUI; public class PopupComboSample {
public static void main(String args[]) { String labels[] = { "A", "B", "C", "D","E", "F", "G", "H","I", "J" }; JFrame frame = new JFrame("Popup JComboBox"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); JComboBox comboBox = new JComboBox(labels); comboBox.setMaximumRowCount(5); comboBox.setUI((ComboBoxUI) MyComboBoxUI.createUI(comboBox)); contentPane.add(comboBox, BorderLayout.NORTH); frame.setSize(300, 200); frame.setVisible(true); comboBox.showPopup(); } static class MyComboBoxUI extends BasicComboBoxUI { public static ComponentUI createUI(JComponent c) { return new MyComboBoxUI(); } protected JButton createArrowButton() { JButton button = new BasicArrowButton(BasicArrowButton.EAST); return button; } }
}
</source>
Remove all items
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.removeAllItems(); }
}
</source>
Remove first item
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.removeItemAt(0); }
}
</source>
Remove the last item
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "item1", "item2" }; JComboBox cb = new JComboBox(items); cb.removeItemAt(cb.getItemCount() - 1); }
}
</source>
Selecting an Item in a JComboBox Component with Multiple Keystrokes
<source lang="java">
import javax.swing.ruboBoxModel; import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = { "A", "A", "B", "B", "C", "C" }; JComboBox cb = new JComboBox(items); cb.setKeySelectionManager(new MyKeySelectionManager()); }
} class MyKeySelectionManager implements JComboBox.KeySelectionManager {
long lastKeyTime = 0; String pattern = ""; public int selectionForKey(char aKey, ComboBoxModel model) { int selIx = 01; Object sel = model.getSelectedItem(); if (sel != null) { for (int i = 0; i < model.getSize(); i++) { if (sel.equals(model.getElementAt(i))) { selIx = i; break; } } } long curTime = System.currentTimeMillis(); if (curTime - lastKeyTime < 300) { pattern += ("" + aKey).toLowerCase(); } else { pattern = ("" + aKey).toLowerCase(); } lastKeyTime = curTime; for (int i = selIx + 1; i < model.getSize(); i++) { String s = model.getElementAt(i).toString().toLowerCase(); if (s.startsWith(pattern)) { return i; } } for (int i = 0; i < selIx; i++) { if (model.getElementAt(i) != null) { String s = model.getElementAt(i).toString().toLowerCase(); if (s.startsWith(pattern)) { return i; } } } return -1; }
}
</source>
Selecting Combo Sample
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import java.awt.ItemSelectable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.PrintWriter; import java.io.StringWriter; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class SelectingComboSample {
static private String selectedString(ItemSelectable is) { Object selected[] = is.getSelectedObjects(); return ((selected.length == 0) ? "null" : (String) selected[0]); } public static void main(String args[]) { String labels[] = { "A", "B", "C", "D","E", "F", "G", "H","J", "I" }; JFrame frame = new JFrame("Selecting JComboBox"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); JComboBox comboBox = new JComboBox(labels); contentPane.add(comboBox, BorderLayout.SOUTH); final JTextArea textArea = new JTextArea(); textArea.setEditable(false); JScrollPane sp = new JScrollPane(textArea); contentPane.add(sp, BorderLayout.CENTER); ItemListener itemListener = new ItemListener() { public void itemStateChanged(ItemEvent itemEvent) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); int state = itemEvent.getStateChange(); String stateString = ((state == ItemEvent.SELECTED) ? "Selected": "Deselected"); pw.print("Item: " + itemEvent.getItem()); pw.print(", State: " + stateString); ItemSelectable is = itemEvent.getItemSelectable(); pw.print(", Selected: " + selectedString(is)); pw.println(); textArea.append(sw.toString()); } }; comboBox.addItemListener(itemListener); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); pw.print("Command: " + actionEvent.getActionCommand()); ItemSelectable is = (ItemSelectable) actionEvent.getSource(); pw.print(", Selected: " + selectedString(is)); pw.println(); textArea.append(sw.toString()); } }; comboBox.addActionListener(actionListener); frame.setSize(400, 200); frame.setVisible(true); }
}
</source>
Select the combobox by choose the nearby label
<source lang="java">
import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Box; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class LabelForComboBox extends JPanel {
public LabelForComboBox() { JLabel lbl = new JLabel("Color:"); lbl.setDisplayedMnemonic("c"); add(lbl); add(Box.createHorizontalStrut(20)); JComboBox cbColor = new JComboBox(); cbColor.addItem("red"); cbColor.addItem("blue"); lbl.setLabelFor(cbColor); add(cbColor); } public static void main(String[] a) { JFrame f = new JFrame(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.getContentPane().add(new LabelForComboBox()); f.pack(); f.setSize(new Dimension(300, 200)); f.show(); }
}
</source>
Setting the Number of Visible Items in the Menu of a JComboBox Component
<source lang="java">
import javax.swing.JComboBox; public class Main {
public static void main(String[] argv) throws Exception { String[] items = new String[50]; for (int i = 0; i < items.length; i++) { items[i] = "" + Math.random(); } JComboBox cb = new JComboBox(items); // Retrieve the current max visible rows int maxVisibleRows = cb.getMaximumRowCount(); // Change the current max visible rows maxVisibleRows = 20; cb.setMaximumRowCount(maxVisibleRows); }
}
</source>
Using drop-down lists
<source lang="java">
// : c14:ComboBoxes.java // Using drop-down lists. // <applet code=ComboBoxes width=200 height=125></applet> // From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002 // www.BruceEckel.ru. See copyright notice in CopyRight.txt. import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JTextField; public class ComboBoxes extends JApplet {
private String[] description = { "Ebullient", "Obtuse", "Recalcitrant", "Brilliant", "Somnescent", "Timorous", "Florid", "Putrescent" }; private JTextField t = new JTextField(15); private JComboBox c = new JComboBox(); private JButton b = new JButton("Add items"); private int count = 0; public void init() { for (int i = 0; i < 4; i++) c.addItem(description[count++]); t.setEditable(false); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (count < description.length) c.addItem(description[count++]); } }); c.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { t.setText("index: " + c.getSelectedIndex() + " " + ((JComboBox) e.getSource()).getSelectedItem()); } }); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(t); cp.add(c); cp.add(b); } public static void main(String[] args) { run(new ComboBoxes(), 200, 125); } public static void run(JApplet applet, int width, int height) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(applet); frame.setSize(width, height); applet.init(); applet.start(); frame.setVisible(true); }
} ///:~
</source>