Java 如何为Jcombobox设置智能

Java 如何为Jcombobox设置智能,java,swing,autocomplete,jcombobox,Java,Swing,Autocomplete,Jcombobox,在Jcombobox中,当我键入字母say('j')时,以'j'开头的第一个项目将默认聚焦。但相同的逻辑不适用于许多字母(比如'ji')。如何使我在键入“ji”时能够关注以“ji”开头的第一项,依此类推?在子类JComboBox中实现KeyListener并搜索JComboBox元素。我不喜欢发布大型内容,但这是我多年前使用的源代码(不记得在哪里)并修复了一些问题以使其正常工作 用法: String[] aItems = new String[] {"Ester", "Jordi", "Jord

在Jcombobox中,当我键入字母say('j')时,以'j'开头的第一个项目将默认聚焦。但相同的逻辑不适用于许多字母(比如'ji')。如何使我在键入“ji”时能够关注以“ji”开头的第一项,依此类推?

在子类JComboBox中实现KeyListener并搜索JComboBox元素。

我不喜欢发布大型内容,但这是我多年前使用的源代码(不记得在哪里)并修复了一些问题以使其正常工作

用法:

String[] aItems = new String[] {"Ester", "Jordi", "Jordina", "Jorge", "Sergi"};

JAutoCompleteComboBox cboxInputModelNumber = new JAutoCompleteComboBox();

for(nItem = 0;nItem < lItems.size();nItem++)
{
    aItems[nItem] = lItems.get(nItem).getNumber();
}

cboxInputModelNumber.getCompleter().setItems(lItems.toArray());
String[]aItems=新字符串[]{“Ester”、“Jordi”、“Jordina”、“Jorge”、“Sergi”};
JAutoCompleteComboBox cboxInputModelNumber=新的JAutoCompleteComboBox();
对于(nItem=0;nItem
JAutoCompleteComboBox.java

import java.util.List;
import java.util.Vector;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;

/**
 *
 * @author Improved by Alexandre Lavoie
 * 
 * Source : http://www.java2s.com/Code/Java/Swing-Components/AutocompleteComboBox.htm
 */
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 AutoCompleter getCompleter()
    {
        return completer;
    }
}
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.JTextField;

/**
 *
 * @author Improved by Alexandre Lavoie
 * 
 * Source : http://jwms-lqik2004.googlecode.com/svn/jwms_linux_eclipse/src/com/res0w/jwms/method/AutoCompleter.java
 */
public class AutoCompleter implements KeyListener, ItemListener
{
    private JComboBox m_oParent = null;
    private JTextField m_oEditor = null;
    private ComboBoxModel m_oModel = null;
    private Object[] items;

    public AutoCompleter(JComboBox comboBox)
    {
        m_oParent = comboBox;
        m_oEditor = (JTextField) comboBox.getEditor().getEditorComponent();
        m_oEditor.addKeyListener(this);
        m_oModel = comboBox.getModel();
        m_oParent.addItemListener(this);
    }

    public void keyTyped(KeyEvent e)
    {

    }

    public void keyPressed(KeyEvent e)
    {

    }

    public void keyReleased(KeyEvent e)
    {
        char ch = e.getKeyChar();

        // TODO : Maybe catch keys that won't update the content here
        {
            int caretPosition = m_oEditor.getCaretPosition();
            String str = m_oEditor.getText();

            if(str.length() == 0)
            {
                m_oParent.setPopupVisible(false);
                return;
            }
            else
            {
                autoComplete(str,caretPosition);
            }
        }
    }

    /**
    *   ×Ô¶¯Íê³É¡£¸ù¾ÝÊäÈëµÄÄÚÈÝ£¬ÔÚÁбíÖÐÕÒµ½ÏàËƵÄÏîÄ¿.
    */
    protected void autoComplete(String strf, int caretPosition)
    {
        Object[] opts;
        opts = getMatchingOptions(strf.substring(0,caretPosition));

        if(m_oParent != null)
        {
            m_oModel = new DefaultComboBoxModel(opts);
            m_oParent.setModel(m_oModel);
        }

        if(opts.length > 0)
        {
            m_oEditor.setCaretPosition(caretPosition);
            m_oEditor.setText(strf.substring(0,caretPosition));

            if(m_oParent != null)
            {
                try
                {
                    m_oParent.showPopup();
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        }
        else
        {
            m_oEditor.setText(strf);
        }
    }

    /**
    *
    *   ÕÒµ½ÏàËƵÄÏîÄ¿,   ²¢ÇÒ½«Ö®ÅÅÁе½Êý×éµÄ×îÇ°Ãæ¡£
    *   @param   str
    *   @return   ·µ»ØËùÓÐÏîÄ¿µÄÁÐ±í¡£
    */
    protected Object[] getMatchingOptions(String str)
    {
        List v = new Vector();

        for(int k = 0; k < items.length; k++)
        {
            Object itemObj = items[k];

            if(itemObj != null)
            {
                String item = itemObj.toString();
                if(KMPAlgorithm.kmp(item,str))
                {
                    v.add(items[k]);
                }
            }
        }
        return v.toArray();
    }

    protected Object[] getMatchingOptionsDel(String str)
    {
        List v = new Vector();

        for(int k = 0; k < items.length; k++)
        {
            Object itemObj = items[k];

            if(itemObj != null)
            {
                String item = itemObj.toString().toLowerCase();

                if(KMPAlgorithm.kmp(item, str))
                {
                    v.add(items[k]);
                }
            }
        }

        return v.toArray();
    }

    public void itemStateChanged(ItemEvent event)
    {
        if (event.getStateChange() == ItemEvent.SELECTED)
        {
            int caretPosition = m_oEditor.getCaretPosition();

            if(caretPosition != -1)
            {
                try
                {
                    m_oEditor.moveCaretPosition(caretPosition);
                }
                catch(IllegalArgumentException ex)
                {
                    ex.printStackTrace();
                }
            }
        }
    }

    public void setItems(Object[] x)
    {
        items = x;
    }
}
/**
 *
 * @author Alexandre Lavoie
 * 
 * Source : http://jwms-lqik2004.googlecode.com/svn/jwms_linux_eclipse/src/com/res0w/jwms/method/KMPAlgorith.java
 */
public class KMPAlgorithm {

    public static boolean kmp(String target, String pattern) {
        /*int pLen = pattern.length();
        int tLen = target.length();
        //the fail function
        int failFunc[] = new int[pLen];
        failFunc[0] = -1;
        //build fail function
        for (int i = 1; i < pLen; i++) {
            int j = failFunc[i - 1];
            while (pattern.charAt(i) != pattern.charAt(j + 1) && j >= 0) {
                //recursion
                j = failFunc[j];
            }
            if (pattern.charAt(i) == pattern.charAt(j + 1)) {
                failFunc[i] = j + 1;
            } else {
                failFunc[i] = -1;
            }
        }
        int pPos = 0, tPos = 0;
        while (tPos < tLen && pPos < pLen) {
            if (target.charAt(tPos) == pattern.charAt(pPos)) {
                //match ,then do forward
                tPos++;
                pPos++;
            } else if (pPos == 0) {
                //target go forward
                tPos++;
            } else {
                //target postion don't change,pattern go back
                pPos = failFunc[pPos - 1] + 1;
            }
        }
        if (pPos < pLen) {
            return false;
        } else {
            return true;
        }*/

        return target.toLowerCase().startsWith(pattern.toLowerCase());
    }
}
import java.util.List;
导入java.util.Vector;
导入javax.swing.ComboxModel;
导入javax.swing.JComboBox;
导入javax.swing.JTextField;
/**
*
*@作者由Alexandre Lavoie改进
* 
*资料来源:http://www.java2s.com/Code/Java/Swing-Components/AutocompleteComboBox.htm
*/
公共类JAutoCompleteComboBox扩展了JComboBox
{
专用自动完成器;
公共JAutoCompleteComboBox()
{
超级();
addCompleter();
}
public JAutoCompleteComboBox(ComboBoxModel cm)
{
超级(厘米);
addCompleter();
}
公共JAutoCompleteComboBox(对象[]项)
{
超级(项目);
addCompleter();
}
公共JAutoCompleteComboBox(列表五)
{
超级((向量)v);
addCompleter();
}
私有void addCompleter()
{
可编辑设置(真);
完成器=新的自动完成器(此);
}
公共void自动完成(字符串str)
{
this.completer.autoComplete(str,str.length());
}
公共字符串getText()
{
return((JTextField)getEditor().getEditorComponent()).getText();
}
公共void setText(字符串文本)
{
((JTextField)getEditor().getEditorComponent()).setText(文本);
}
公共布尔containsItem(String itemString)
{
对于(int i=0;i
AutoCompleter.java

import java.util.List;
import java.util.Vector;
import javax.swing.ComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;

/**
 *
 * @author Improved by Alexandre Lavoie
 * 
 * Source : http://www.java2s.com/Code/Java/Swing-Components/AutocompleteComboBox.htm
 */
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 AutoCompleter getCompleter()
    {
        return completer;
    }
}
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.JTextField;

/**
 *
 * @author Improved by Alexandre Lavoie
 * 
 * Source : http://jwms-lqik2004.googlecode.com/svn/jwms_linux_eclipse/src/com/res0w/jwms/method/AutoCompleter.java
 */
public class AutoCompleter implements KeyListener, ItemListener
{
    private JComboBox m_oParent = null;
    private JTextField m_oEditor = null;
    private ComboBoxModel m_oModel = null;
    private Object[] items;

    public AutoCompleter(JComboBox comboBox)
    {
        m_oParent = comboBox;
        m_oEditor = (JTextField) comboBox.getEditor().getEditorComponent();
        m_oEditor.addKeyListener(this);
        m_oModel = comboBox.getModel();
        m_oParent.addItemListener(this);
    }

    public void keyTyped(KeyEvent e)
    {

    }

    public void keyPressed(KeyEvent e)
    {

    }

    public void keyReleased(KeyEvent e)
    {
        char ch = e.getKeyChar();

        // TODO : Maybe catch keys that won't update the content here
        {
            int caretPosition = m_oEditor.getCaretPosition();
            String str = m_oEditor.getText();

            if(str.length() == 0)
            {
                m_oParent.setPopupVisible(false);
                return;
            }
            else
            {
                autoComplete(str,caretPosition);
            }
        }
    }

    /**
    *   ×Ô¶¯Íê³É¡£¸ù¾ÝÊäÈëµÄÄÚÈÝ£¬ÔÚÁбíÖÐÕÒµ½ÏàËƵÄÏîÄ¿.
    */
    protected void autoComplete(String strf, int caretPosition)
    {
        Object[] opts;
        opts = getMatchingOptions(strf.substring(0,caretPosition));

        if(m_oParent != null)
        {
            m_oModel = new DefaultComboBoxModel(opts);
            m_oParent.setModel(m_oModel);
        }

        if(opts.length > 0)
        {
            m_oEditor.setCaretPosition(caretPosition);
            m_oEditor.setText(strf.substring(0,caretPosition));

            if(m_oParent != null)
            {
                try
                {
                    m_oParent.showPopup();
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        }
        else
        {
            m_oEditor.setText(strf);
        }
    }

    /**
    *
    *   ÕÒµ½ÏàËƵÄÏîÄ¿,   ²¢ÇÒ½«Ö®ÅÅÁе½Êý×éµÄ×îÇ°Ãæ¡£
    *   @param   str
    *   @return   ·µ»ØËùÓÐÏîÄ¿µÄÁÐ±í¡£
    */
    protected Object[] getMatchingOptions(String str)
    {
        List v = new Vector();

        for(int k = 0; k < items.length; k++)
        {
            Object itemObj = items[k];

            if(itemObj != null)
            {
                String item = itemObj.toString();
                if(KMPAlgorithm.kmp(item,str))
                {
                    v.add(items[k]);
                }
            }
        }
        return v.toArray();
    }

    protected Object[] getMatchingOptionsDel(String str)
    {
        List v = new Vector();

        for(int k = 0; k < items.length; k++)
        {
            Object itemObj = items[k];

            if(itemObj != null)
            {
                String item = itemObj.toString().toLowerCase();

                if(KMPAlgorithm.kmp(item, str))
                {
                    v.add(items[k]);
                }
            }
        }

        return v.toArray();
    }

    public void itemStateChanged(ItemEvent event)
    {
        if (event.getStateChange() == ItemEvent.SELECTED)
        {
            int caretPosition = m_oEditor.getCaretPosition();

            if(caretPosition != -1)
            {
                try
                {
                    m_oEditor.moveCaretPosition(caretPosition);
                }
                catch(IllegalArgumentException ex)
                {
                    ex.printStackTrace();
                }
            }
        }
    }

    public void setItems(Object[] x)
    {
        items = x;
    }
}
/**
 *
 * @author Alexandre Lavoie
 * 
 * Source : http://jwms-lqik2004.googlecode.com/svn/jwms_linux_eclipse/src/com/res0w/jwms/method/KMPAlgorith.java
 */
public class KMPAlgorithm {

    public static boolean kmp(String target, String pattern) {
        /*int pLen = pattern.length();
        int tLen = target.length();
        //the fail function
        int failFunc[] = new int[pLen];
        failFunc[0] = -1;
        //build fail function
        for (int i = 1; i < pLen; i++) {
            int j = failFunc[i - 1];
            while (pattern.charAt(i) != pattern.charAt(j + 1) && j >= 0) {
                //recursion
                j = failFunc[j];
            }
            if (pattern.charAt(i) == pattern.charAt(j + 1)) {
                failFunc[i] = j + 1;
            } else {
                failFunc[i] = -1;
            }
        }
        int pPos = 0, tPos = 0;
        while (tPos < tLen && pPos < pLen) {
            if (target.charAt(tPos) == pattern.charAt(pPos)) {
                //match ,then do forward
                tPos++;
                pPos++;
            } else if (pPos == 0) {
                //target go forward
                tPos++;
            } else {
                //target postion don't change,pattern go back
                pPos = failFunc[pPos - 1] + 1;
            }
        }
        if (pPos < pLen) {
            return false;
        } else {
            return true;
        }*/

        return target.toLowerCase().startsWith(pattern.toLowerCase());
    }
}
import java.awt.event.ItemEvent;
导入java.awt.event.ItemListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.List;
导入java.util.Vector;
导入javax.swing.ComboxModel;
导入javax.swing.DefaultComboxModel;
导入javax.swing.JComboBox;
导入javax.swing.JTextField;
/**
*
*@作者由Alexandre Lavoie改进
* 
*资料来源:http://jwms-lqik2004.googlecode.com/svn/jwms_linux_eclipse/src/com/res0w/jwms/method/AutoCompleter.java
*/
公共类自动完成器实现KeyListener、ItemListener
{
私有JComboBox m_oParent=null;
私有JTextField m_oEditor=null;
私有ComboBoxModel m_oModel=null;
私有对象[]项;
公共自动完成器(JComboBox组合框)
{
m_opart=组合框;
m_oEditor=(JTextField)组合框.getEditor().getEditorComponent();
m_oEditor.addKeyListener(本);
m_oModel=comboBox.getModel();
m_oParent.addItemListener(本);
}
public void keyTyped(KeyEvent e)
{
}
按下公共无效键(按键事件e)
{
}
公共无效密钥已释放(密钥事件e)
{
char ch=e.getKeyChar();
//TODO:可能捕获不会更新此处内容的密钥
{
int caretPosition=m_oEditor.getCaretPosition();
String str=m_oEditor.getText();
如果(str.length()==0)
{
m_oParent.setPopupVisible(false);
返回;
}
其他的
{
自动完成(str,caretPosition);
}
}
}
/**
*   ×Ô¶¯Íê³É¡£¸ù¾ÝÊäÈëµÄÄÚÈÝ£¬ÔÚÁбíÖÐÕÒµ½ÏàËƵÄÏîÄ¿.
*/
受保护的空自动完成(字符串strf,int caretPosition)
{
对象[]选择;
opts=getMatchingOptions(strf.substring(0,caretPosition));
如果(m_oParent!=null)
{
m_oModel=新的DefaultComboxModel(opts);
m_oParent.setModel(m_oModel);
}
如果(选择长度>0)
{
m_oEditor.setCaretPosition(caretPosition);
m_oEditor.setText(strf.substring(0,caretPosition));
如果(m_oParent!=null)
{
尝试
{
m_oParent.showPopup();
}
捕获(例外情况除外)
{
例如printStackTrace();
}
}
}
其他的
{
m_oEditor.setText(strf);
}
}
/**
*
*   ÕÒµ½ÏàËƵÄÏîÄ¿,   ²¢ÇÒ½«Ö®ÅÅÁе½Êý×éµÄ×îÇ°Ãæ¡£
*@param str
*返回
*/
受保护对象[]getMatchingOptions(字符串str)
{
列表v=新向量();
对于(int k=0;k