你可以到这个网上看下.
www.manning.com

解决方案 »

  1.   

    这个要自己去实现.这里给你一个演示代码.
    你自己修改一下就可以了./*
    在许多Windows应用程序里面,最常见的是IE的地址栏,当我们在ComboBox的文本框内容时,
    它的下拉列表中自动列出最匹配的项目,并且将最匹配的项目显示在输入框中。 
    在Java中有个JComboBox类,它可以实现下拉选择或者输入选择。
    但是它本身没有提供自动查找和完成功能。我们现在就来 “改装”这个类,使它具有自动查找和完成功能。 
     
    改装思路如下: 
    1.先继承一个JComboBox类,将其setEditable为true. 这样的话,用户才可以在combobox上输入文字。 
    2.我们知道combobox的输入框是一个JTextField, 可以通过comboBox.getEditor().getEditorComponent()取得这个文本框。 
    3.为这个文本框加上一个KeyListener. 
    4.当用户在文本框中按键时,会解发keyReleased事件,我们在这个事件里写主要的实现自动查找和完成的代码。 
    思想就是这么简单,而自动查找的算法,任何一个对编程不陌生的人都可以写出。以下我列出完整的程序代码: 
    */import java.awt.event.ItemEvent; 
    import java.awt.event.ItemListener; 
    import java.awt.event.KeyEvent; 
    import java.awt.event.KeyListener; 
    import java.util.List; 
    import java.util.Vector; 
    import javax.swing.ComboBoxModel; 
    import javax.swing.DefaultComboBoxModel; 
    import javax.swing.JComboBox; 
    import javax.swing.JFrame; 
    import javax.swing.JTextField; public class JAutoCompleteComboBox extends JComboBox { 
        private AutoCompleter completer;    public JAutoCompleteComboBox()
        {
            super();
            addCompleter();
        }    public JAutoCompleteComboBox(ComboBoxModel cm) {
            super(cm);
            addCompleter();
        }
        
        public JAutoCompleteComboBox(Object[] items) {
            super(items);
            addCompleter();
        }
        
        public JAutoCompleteComboBox(List v) {
            super((Vector) v);
            addCompleter();
        }    private void addCompleter() {
            setEditable(true);
            completer = new AutoCompleter(this);
        }    public void autoComplete(String str) {
            this.completer.autoComplete(str,str.length());
        }    public String getText() {
            return ((JTextField) getEditor().getEditorComponent()).getText();
        }    public void setText(String text) {
            ((JTextField) getEditor().getEditorComponent()).setText(text);
        }    public boolean containsItem(String itemString)
        {
            for (int i = 0; i < this.getModel().getSize(); i++) {
                String _item = "" + this.getModel().getElementAt(i);
                if (_item.equals(itemString))
                    return true;
            }
            return false;
        }
        
        public static void main(String[] args)
        {
            JFrame frame = new JFrame();
            Object[] items = new Object[]
            { "abc", "aab", "aba", "hpp", "pp", "hlp" };
            DefaultComboBoxModel model = new DefaultComboBoxModel();
            JComboBox cmb = new JAutoCompleteComboBox(model);
            model.addElement("abc");
            model.addElement("aab");
            model.addElement("aba");
            model.addElement("hpp");
            model.addElement("pp");
            model.addElement("hlp");
            frame.getContentPane().add(cmb);
            frame.setSize(400, 80);
            frame.setVisible(true);
        }

     
    /** 
     * 自动完成器。自动找到最匹配的项目,并排在列表的最前面。
     * 
     * @author Turbo Chen
     */class AutoCompleter implements KeyListener, ItemListener {     private JComboBox owner = null;
        private JTextField editor = null; private ComboBoxModel model = null;     public AutoCompleter(JComboBox comboBox)
        {
            owner = comboBox;
            editor = (JTextField) comboBox.getEditor().getEditorComponent();
            editor.addKeyListener(this);
    model = comboBox.getModel(); 
            owner.addItemListener(this);
        }
        
        public void keyTyped(KeyEvent e) { }    public void keyPressed(KeyEvent e) { }    public void keyReleased(KeyEvent e)
        {
            char ch = e.getKeyChar();
            if (ch == KeyEvent.CHAR_UNDEFINED||Character.isISOControl(ch)||ch == KeyEvent.VK_DELETE)
                return;        int caretPosition = editor.getCaretPosition();
            String str = editor.getText();
            if (str.length() == 0)
             return;
            autoComplete(str, caretPosition);
        }
        
        /**
         * 自动完成。根据输入的内容,在列表中找到相似的项目.
         */
        protected void autoComplete(String strf, int caretPosition)
        {
            Object[] opts;
            opts = getMatchingOptions(strf.substring(0, caretPosition));
            if (owner != null) {
             model = new DefaultComboBoxModel(opts);
                owner.setModel(model);
            }
            if (opts.length > 0) {
                String str = opts[0].toString();
                editor.setCaretPosition(caretPosition);
                if (owner != null) {
                    try {
                        owner.showPopup();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
        
        /**
         * 
         * 找到相似的项目, 并且将之排列到数组的最前面。
         * @param str 
         * @return 返回所有项目的列表。
         */
        protected Object[] getMatchingOptions(String str)
        {
            List v = new Vector();
            List v1 = new Vector();
            
            for (int k = 0; k < model.getSize(); k++) {
                Object itemObj = model.getElementAt(k);
                if ( itemObj!=null ) {
                    String item = itemObj.toString().toLowerCase();
                    if (item.startsWith(str.toLowerCase()))
                        v.add(model.getElementAt(k));
                    else
                        v1.add(model.getElementAt(k));
                }else
                    v1.add(model.getElementAt(k));
            }
            for (int i = 0; i < v1.size(); i++) {
                v.add(v1.get(i));
            }
            if (v.isEmpty())
                v.add(str);
            return v.toArray();
        }
        public void itemStateChanged(ItemEvent event)
        {
            if (event.getStateChange() == ItemEvent.SELECTED)
            {
                int caretPosition = editor.getCaretPosition();
                if (caretPosition != -1) {
                    try {
                        editor.moveCaretPosition(caretPosition);
                    } catch (IllegalArgumentException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }