2 réponses
Voici ce que j'ai réussi à faire avec un KeyListener en héritant de JComboBox.
Si tu appuies sur une touche la liste est modifiée en ajoutant le caractère à un préfixe qui détermine les items à afficher. Sauf pour le backspace qui enlève le dernier caractère. Il y a surement d'autres cas particulier à traiter (touche entrée par exemple), mais je te laisse regarder ce que j'ai fait, voir si ça correspond à ce que tu as besoin.
Si tu appuies sur une touche la liste est modifiée en ajoutant le caractère à un préfixe qui détermine les items à afficher. Sauf pour le backspace qui enlève le dernier caractère. Il y a surement d'autres cas particulier à traiter (touche entrée par exemple), mais je te laisse regarder ce que j'ai fait, voir si ça correspond à ce que tu as besoin.
import java.awt.Choice;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.PopupMenu;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.util.List;
import java.util.LinkedList;
import javax.swing.JComboBox;
import javax.swing.JFrame;
class MaBox extends JComboBox
{
private static final long serialVersionUID = 1L;
// Liste de tous les éléments
private final List<String> liste;
// String rempli au fur et à mesure des KeyListener
private String prefixe;
// this
private final MaBox reflect;
MaBox(final String data[])
{
reflect=this;
prefixe = "";
// On remplit la liste de tous les éléments (items par défaut)
liste = new LinkedList<String>();
for (String str : data)
{
liste.add(str);
insertItemAt(str, getItemCount());
}
// Quand on appuie sur une touche on modifie le préfixe
// Les items sont sélectionnés pour correspondre au préfixe
addKeyListener(new KeyListener()
{
@Override
public void keyPressed(KeyEvent evt)
{
reflect.removeAllItems();
if (evt.getKeyCode()==KeyEvent.VK_BACK_SPACE)
{
// On enlève le dernier caractère
if (!prefixe.isEmpty())
prefixe=prefixe.substring(0,prefixe.length()-1);
}
else // On ajoute un caractère à la fin
prefixe+=evt.getKeyChar();
// On ajoute aux que les éléments qui correspondent au préfixe
for (String str : data)
if (str.startsWith(prefixe))
insertItemAt(str,getItemCount());
}
@Override
public void keyReleased(KeyEvent evt) {}
@Override
public void keyTyped(KeyEvent evt) {}
});
}
}
public class Test extends JFrame
{
private static final long serialVersionUID = 1;
public Test()
{
setLayout(new FlowLayout());
String[] tab ={"aaaa","aaab","aaba","aabb","abaa","abab","abba","abbb","baaa","baab","baba","babb","bbaa","bbab","bbba","bbbb",};
add(new MaBox(tab));
setMinimumSize(new Dimension(200,200));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String...args)
{
new Test();
}
}
Tu peux faire ce que tu veux en ajoutant un TextListener avec la méthode addTextListener, malheureusement seul un TextComponent peux l'utiliser, il te faut donc soit un TextArea, soit un TextField.
Je vais réfléchir à ce qui pourrait se faire ou non, c'est peut-être possible en héritant de JComboBox, et en modifiant la zone de saisie par un TextComponent, ou alors recréer un ComboBox spécifique à ce que tu veux, mais en tout cas ce n'est pas possible de le faire directement avec un JComboBox...
À part éventuellement jouer sur l'infobulle au fur et à mesure avec setToolTipText(String)
Sinon il faut faire intervenir un composant auxiliaire avec une zone de texte...