估计这问题都遇到过吧比如一个JComboBox,里面是所有到城市(都是汉字到)。
但要实现到是,比如输入字母,比如B,则显示所有B开头到城市。
而输入汉字,比如南,则显示所有南开头到城市。如果实现?

解决方案 »

  1.   

    如果只输入字符的话,
    可以用
    firstComboBox.setKeySelectionManager(new KeySelectionManager(){ public int selectionForKey(char aKey, ComboBoxModel aModel) {//实现这个接口。输入一个字符,然后返回在model中它的index

    return 0;
    }

    });
      

  2.   

    也许这个更符合要求:
    简单的实现了一下,还有一些问题,lz自行完善吧。
    提个思路,看对不。import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;import javax.swing.DefaultComboBoxModel;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;public class ComboBoxTest2 extends JFrame{ /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private final JComboBox jcb = new JComboBox();

    private final DefaultComboBoxModel aModel = new DefaultComboBoxModel();

    private final String[] data = { "nanjing", "wuxi", "suzhou", "yangzhou",
    "yancheng", "suqian" };

    public ComboBoxTest2(){
    super("ComboBoxTest");

    setSize(300, 200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    for(String tmp : data){
    aModel.addElement(tmp);
    }
    jcb.setModel(aModel);
    jcb.setEditable(true);
    jcb.getEditor().getEditorComponent().addKeyListener(new KeyAdapter(){ public void keyTyped(KeyEvent e) {
    macher(jcb.getEditor().getItem().toString());
    }

    private void macher(String macher){
    if(macher != null){

    //这里要实现筛选。根据输入的字符串,在全部城市中筛选合适的程序,添加到model里
                                            //如果什么都没有输入,则将全部城市放在model中。需要做一些判断处理。
    String[] machers = {"yangzhou", "yancheng"};

    aModel.removeAllElements();
    for(String tmp : machers){
    aModel.addElement(tmp);
    }

    }
    }
    });

    JPanel p = new JPanel(new FlowLayout());
    p.add(jcb, FlowLayout.LEFT);
    add(p, BorderLayout.NORTH);
    setVisible(true);
    }

    public static void main(String args[]){
    new ComboBoxTest2();
    }
    }
      

  3.   

    这个是我自己 重构的一个FilterComboBox 带有过滤功能的 自己看下吧 代码可行!import java.awt.Component;
    import java.awt.event.ActionListener;import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;import javax.swing.AbstractListModel;
    import javax.swing.ComboBoxEditor;
    import javax.swing.MutableComboBoxModel;
    import javax.swing.JComboBox;
    import javax.swing.JTextField;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.border.*;public class GuiFilterComboBox
        extends JComboBox {    public GuiFilterComboBox() {        setModel(new FilterableComboBoxModel(new ArrayList()));
            setEditor(new MyEditor());
            setEditable(true);
        }    public class FilterableComboBoxModel
            extends AbstractListModel implements MutableComboBoxModel {        private List items;
            private Filter filter;
            private List filteredItems;
            private Object selectedItem;        public FilterableComboBoxModel(List items) {            this.items = new ArrayList(items);
                filteredItems = new ArrayList(items.size());
                updateFilteredItems();
            }
            
            public void addElementList(ArrayList list) { 
             if (list == null || list.size() == 0) {
             return;
             }
             items.addAll(list);
             updateFilteredItems();
            }         public void addElement(Object obj) {            items.add(obj);
                updateFilteredItems();
            }        public void removeElement(Object obj) {            items.remove(obj);
                updateFilteredItems();
            }        public void removeElementAt(int index) {            items.remove(index);
                updateFilteredItems();
            }        public void insertElementAt(Object obj, int index) {}        public void setFilter(Filter filter) {            this.filter = filter;
                updateFilteredItems();
            }        protected void updateFilteredItems() {            fireIntervalRemoved(this, 0, filteredItems.size());
                filteredItems.clear();            if (filter == null) {
                    filteredItems.addAll(items);
                }
                else {
                    for (Iterator iterator = items.iterator(); iterator.hasNext(); ) {                    Object item = iterator.next();                    if (filter.accept(item)) {
                            filteredItems.add(item);
                        }
                    }
                }
                fireIntervalAdded(this, 0, filteredItems.size());
            }        public int getSize() {
                return filteredItems.size();
            }        public Object getElementAt(int index) {
                return filteredItems.get(index);
            }        public Object getSelectedItem() {
                return selectedItem;
            }        public void setSelectedItem(Object val) {            if ( (selectedItem == null) && (val == null)) {
                    return;
                }            if ( (selectedItem != null) && selectedItem.equals(val)) {
                    return;
                }            if ( (val != null) && val.equals(selectedItem)) {
                    return;
                }            selectedItem = val;
                fireContentsChanged(this, -1, -1);
            }
        }    public static interface Filter {
            public boolean accept(Object obj);
        }    class StartsWithFilter
            implements Filter {        private String prefix;
            public StartsWithFilter(String prefix) {
                this.prefix = prefix;
            }        public boolean accept(Object o) {
                return o.toString().toLowerCase().startsWith(prefix.toLowerCase());
            }
        }    public class MyEditor
            implements ComboBoxEditor, DocumentListener {        public JTextField text;
            private volatile boolean filtering = false;
            private volatile boolean setting = false;        public MyEditor() {
                text = new JTextField(35) {
                    public void setBorder(Border b) {
                    }
                };
                text.getDocument().addDocumentListener(this);
            }        public Component getEditorComponent() {
                return text;
            }        public void setItem(Object item) {
                if (filtering) {
                    return;
                }
                setting = true;
                String newText = (item == null) ? "" : item.toString();
                text.setText(newText);
                setting = false;
            }        public Object getItem() {
                return text.getText();
            }        public void selectAll() {
                text.selectAll();
            }        public void addActionListener(ActionListener l) {
                text.addActionListener(l);
            }        public void removeActionListener(ActionListener l) {
                text.removeActionListener(l);
            }        public void insertUpdate(DocumentEvent e) {
                try {
                    handleChange();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }        public void removeUpdate(DocumentEvent e) {
                try {
                    handleChange();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }        public void changedUpdate(DocumentEvent e) {}        protected void handleChange() {
                if (setting) {
                    return;
                }
                filtering = true;            Filter filter = null;
                if (text.getText().length() > 0) {
                    filter = new StartsWithFilter(text.getText());
                }            ( (FilterableComboBoxModel) getModel()).setFilter(filter);
                // A bit nasty but it seems to get the popup validated properly
                setPopupVisible(false);
                setPopupVisible(true);
                filtering = false;
            }
        }
    }