我估计需要些自定义类才行,用java的默认行为?估计不行。

解决方案 »

  1.   

    你在jcombobox下面再放个List
    然后写一个modifyText(ModifyEvent)处理jcombobox中输入的文本改变的事件
    怎么注册事件处理不用说了吧
    当然你要有以前输入的历史纪录才可能给出提示
    所以还得有一个函数来匹配历史纪录文件中与输入匹配的结果
    在modifyText(ModifyEvent)把这些结果放到List里的item中
    如果要实现你要的效果就得没输入一次就匹配一次用来更新List中的item
    当然还要做一些改动 比如说按键的处理 这个可以根据List是否可见来处理
    还有一些别的 自己处理吧
    大概思路就是这样了
     *^-^*
      

  2.   

    首先将你的JComboBox设为EditEnable
    然后,作一个KeyListener或ChanagerListener对你的JCombobox进行监听,
    然后,当输入的数值有变化的时候,指向你的JCombobox对象的第几条,
      

  3.   

    思路就是这么简单,而自动查找的算法,任何一个对编程不陌生的人都可以写出。以下我列出完整的程序代码: 
    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();
                    }
                }        }
        }
      

  4.   

    改装思路如下: 
    1. 先继承一个JComboBox类,将其setEditable为true. 这样的话,用户才可以在combobox上输入文字。 
    2. 我们知道combobox的输入框是一个JTextField, 可以通过comboBox.getEditor().getEditorComponent()取得这个文本框。 
    3. 为这个文本框加上一个KeyListener. 
    4. 当用户在文本框中按键时,会解发keyReleased事件,我们在这个事件里写主要的实现自动查找和完成的代码。