The Java Developers Almanac 1.4


Order this book from Amazon.

   
Home > List of Packages > javax.swing  [141 examples] > JComboBox  [12 examples]

e760. Selecting an Item in a JComboBox Component with Multiple Keystrokes

By default, when the user types a keystroke in a read-only combobox and an item in the combobox starts with the typed keystroke, the combobox will select that item. This behavior is not ideal if there are multiple items that start with the same letter.

This example demonstrates how to customize a combobox so that it will select an item based on multiple keystrokes. More specifically, if a keystroke is typed within 300 milliseconds of the previous keystroke, the new keystroke is appended to the previous keystroke, and the combobox will select an item that starts with both keystrokes.

    // Create a read-only combobox
    String[] items = {"Ant", "Ape", "Bat", "Boa", "Cat", "Cow"};
    JComboBox cb = new JComboBox(items);
    
    // Install the custom key selection manager
    cb.setKeySelectionManager(new MyKeySelectionManager());
    
    // This key selection manager will handle selections based on multiple keys.
    class MyKeySelectionManager implements JComboBox.KeySelectionManager {
        long lastKeyTime = 0;
        String pattern = "";
    
        public int selectionForKey(char aKey, ComboBoxModel model) {
            // Find index of selected item
            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;
                    }
                }
            }
    
            // Get the current time
            long curTime = System.currentTimeMillis();
    
            // If last key was typed less than 300 ms ago, append to current pattern
            if (curTime - lastKeyTime < 300) {
                pattern += ("" + aKey).toLowerCase();
            } else {
                pattern = ("" + aKey).toLowerCase();
            }
    
            // Save current time
            lastKeyTime = curTime;
    
            // Search forward from current selection
            for (int i=selIx+1; i<model.getSize(); i++) {
                String s = model.getElementAt(i).toString().toLowerCase();
                if (s.startsWith(pattern)) {
                    return i;
                }
            }
    
            // Search from top to current selection
            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;
        }
    }

 Related Examples
e756. Creating a JComboBox Component
e757. Getting and Setting the Selected Item in a JComboBox Component
e758. Getting the Items in a JComboBox Component
e759. Adding and Removing an Item in a JComboBox Component
e761. Determining If the Menu of a JComboBox Component Is Visible
e762. Displaying the Menu in a JComboBox Component Using a Keystroke
e763. Displaying the Menu in a JComboBox Component Using a Keystroke If the Selected Item Is Not Unique
e764. Setting the Number of Visible Items in the Menu of a JComboBox Component
e765. Listening for Changes to the Selected Item in a JComboBox Component
e766. Listening for Action Events from a JComboBox Component
e767. Determining When the Menu of a JComboBox Component Is Displayed

See also: Actions    JButton    JCheckBox    JDesktop and JInternalFrame    JFrame, JWindow, JDialog    JLabel    JList    JProgressBar    JRadioButton    JScrollPane    JSlider    JSpinner    JSplitPane    JTabbedPane    JToolBar    Keystrokes and Input Maps    Layout    Look and Feel    Menus    Progress Monitor    The Screen    Tool Tips    UI Default Values   


© 2002 Addison-Wesley.