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
.
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);
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;
}
}