web-dev-qa-db-fra.com

Saisie semi-automatique JComboBox

Comment puis-je effectuer la saisie semi-automatique dans JComboBox modifiable dans Netbeans 7.1 comme dans ComboBox dans VB dot net. J'ai une zone de liste déroulante avec une liaison de liste, Je veux sélectionner un élément en tapant uniquement une première lettre de l'élément dans la liste, par exemple si une liste a kitten, elle doit être choisie lorsque je tape ki.

20
user1872351

Si vous voulez le faire vous-même, vous pouvez suivre les étapes expliquées dans cet article .

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

J'ai développé un JComboBox swing personnalisé nommé " AutoComboBox" qui se termine automatiquement lorsque vous tapez dessus en forçant ceci Gist .

Voici une petite démo.

Déclarez-le et initialisez-le d'abord. (Si vous utilisez un IDE, faites simplement glisser et placez la classe sur votre formulaire JFrame ou JDialog)

AutoComboBox autoComboBox = new AutoComboBox();

Ensuite, définissez la liste des articles. Il faut un tableau String. Vous pouvez changer le type en modifiant la classe AutoComboBox.

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

Maintenant, vous avez une JComboBox à auto-complétion qui a comme objets "Malith", "John", "Jack"!

Voici les deux classes que j'ai développées,

L'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]);
    }
}

}

Le 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;
}
}
0
Malith