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

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

【问题讨论】:

    标签: java swing autocomplete jcombobox


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2013-02-10
    • 2014-04-19
    • 1970-01-01
    • 2015-04-09
    相关资源
    最近更新 更多