swing模拟IE地址栏

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值