sun78410683 2011-07-05 08:46
浏览 763
已采纳

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

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

  • 写回答

1条回答

  • yexinjia999 2011-07-05 17:48
    关注

    这个要自己去实现.这里给你一个演示代码.
    你自己修改一下就可以了.

    /*
    在许多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(); 
                                } 
                        } 
                } 
        } 
    

    }

    祝成功~~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决