JComboBox 自动完成

Posted

技术标签:

【中文标题】JComboBox 自动完成【英文标题】:JComboBox autocomplete 【发布时间】:2012-11-20 20:14:51 【问题描述】:

如何在 Netbeans 7.1 中的可编辑 JComboBox 中执行自动完成,就像在 VB dot net 中的 ComboBox 中一样。我有一个带有列表绑定的组合框,我想通过仅键入列表中项目的一些首字母来选择项目,例如,如果列表有 kitten,那么当我键入 ki 时应该选择它。

【问题讨论】:

【参考方案1】:

如果您想自己执行此操作,可以按照this article 中说明的步骤操作。

this.comboBox = new JComboBox(new Object[]  "Ester", "Jordi",
        "Jordina", "Jorge", "Sergi" );
AutoCompleteDecorator.decorate(this.comboBox);

【讨论】:

不知道写这篇文章的时候怎么样,但是第一个链接中的代码现在在公共领域并且可以在网站上找到。马上就可以使用了。 第二个链接已更改。 你不会添加库(swingx-all-1.6.4.jar)java2s.com/Code/Jar/s/Downloadswingxall164jar.htm【参考方案2】:

我开发了一个名为“AutoComboBox”的自定义摇摆 JComboBox,它会在您通过 fork gist 输入时自动完成。

这是一个小演示。

首先声明并初始化它。 (如果您使用的是 IDE,只需将 Class 拖放到您的 JFrame 或 JDialog Form 上)

AutoComboBox autoComboBox = new AutoComboBox();

接下来,设置项目列表。它需要一个字符串数组。您可以通过修改 AutoComboBox 类来更改类型。

String[] itemArray =  "Malith", "John", "Jack" ;
autoComboBox.setKeyWord(itemArray);

现在您有一个自动完成的 JComboBox,其中包含“Malith”、“John”、“Jack”作为项目!

这是我开发的两个类,

AutoComboBox.java

import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;


public class AutoComboBox extends JComboBox<Object> 

String keyWord[] = "item1", "item2", "item3";
Vector myVector = new Vector();

public AutoComboBox() 

    setModel(new DefaultComboBoxModel(myVector));
    setSelectedIndex(-1);
    setEditable(true);
    JTextField text = (JTextField) this.getEditor().getEditorComponent();
    text.setFocusable(true);
    text.setText("");
    text.addKeyListener(new ComboListener(this, myVector));
    setMyVector();


/**
 * set the item list of the AutoComboBox
 * @param keyWord an String array
 */
public void setKeyWord(String[] keyWord) 
    this.keyWord = keyWord;
    setMyVectorInitial();


private void setMyVector() 
    int a;
    for (a = 0; a < keyWord.length; a++) 
        myVector.add(keyWord[a]);
    


private void setMyVectorInitial() 
    myVector.clear();
    int a;
    for (a = 0; a < keyWord.length; a++) 

        myVector.add(keyWord[a]);
    



ComboListener.java

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import org.apache.commons.lang3.text.WordUtils;

public class ComboListener extends KeyAdapter

@SuppressWarnings("rawtypes")
JComboBox cbListener;
@SuppressWarnings("rawtypes")
Vector vector;

@SuppressWarnings("rawtypes")
public ComboListener(JComboBox cbListenerParam, Vector vectorParam)

    cbListener = cbListenerParam;
    vector = vectorParam;


@SuppressWarnings( "unchecked", "rawtypes" )
public void keyReleased(KeyEvent key)

            // TODO Auto-generated method stub
            String text = ((JTextField)key.getSource()).getText();

            cbListener.setModel(new DefaultComboBoxModel(getFilteredList(text)));
            cbListener.setSelectedIndex(-1);
            ((JTextField)cbListener.getEditor().getEditorComponent()).setText(text);
            cbListener.showPopup();



@SuppressWarnings( "rawtypes", "unchecked" )
public Vector getFilteredList(String text)

    Vector v = new Vector();
    for(int a = 0;a<vector.size();a++)
    
        if(vector.get(a).toString().startsWith(text))
        
            v.add(vector.get(a).toString());
        
                    else if(vector.get(a).toString().startsWith(text.toLowerCase()))
        
            v.add(vector.get(a).toString());
        
                     else if(vector.get(a).toString().startsWith(text.toUpperCase()))
        
            v.add(vector.get(a).toString());
        
                     else if(vector.get(a).toString().startsWith(WordUtils.capitalizeFully(text)))
        
            v.add(vector.get(a).toString());
        
                     else if(vector.get(a).toString().startsWith(WordUtils.uncapitalize(text)))
        
            v.add(vector.get(a).toString());
        
    
    return v;


【讨论】:

很有趣,但它需要一些改变。最重要的是,home 键在您的解决方案中不起作用。我在这里解决了这个问题:tinybrain.de/1007529。一个悬而未决的问题是如何使向下箭头正常工作。【参考方案3】:

另一个通过 JComboBox 搜索的酷库: http://www.jidesoft.com/products/oss.htm

您可以在此处下载 jar: http://www.java2s.com/Code/JarDownload/jide/jide-oss-3.5.7.jar.zip

在您的项目中导入库后,您所要做的就是:

JComboBox comboBox = ....;
ComboBoxSearchable searchable = new ComboBoxSearchable(comboBox);

【讨论】:

如何将searchable 添加到jpanel

以上是关于JComboBox 自动完成的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 自动完成(或自动建议)与 TAB 完成/自动填充类似于 shell 命令行完成?

Notepad++ 中 HTML 或 PHP 的自动完成语法。不自动关闭,自动完成

成功完成初始自动完成后,如何在 WinForm 文本框上重新启动自动完成?

如何使用 Selenium 填写自动完成输入框? (为啥自动输入不加载自动完成选项但手动输入呢?)

如何创建自定义自动完成功能,如内置自动完成功能?

IntelliJ自动完成:自动完成期间的小写首字母