JCombobox如何实现编辑数据而去检索下拉列表中的值

如何实现JCombobox的如下功能:
1:在JCombobox中编辑值时检索item,如:item中值为:ab,ac,bb,cc 我们输入a时:下拉框展示 ab ac两条数据 输入b时展示ab,bb
2:Jcombobox是在点击他时会弹出下拉列表,如何实现在编辑时自动弹出下拉列表。(其实1中就包含了2)。

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(); 
                            } 
                    } 
            } 
    } 

}

祝成功~~

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问