jcombobox filter in java - Voir et se sentir indépendant
J'ai un simple JComboBox filtre de code comme ceci :
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class FilterComboBox extends JComboBox {
private List<String> array;
public FilterComboBox(List<String> array) {
super(array.toArray());
this.array = array;
this.setEditable(true);
final JTextField textfield = (JTextField) this.getEditor().getEditorComponent();
textfield.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
comboFilter(textfield.getText());
}
});
}
});
}
public void comboFilter(String enteredText) {
List<String> filterArray= new ArrayList<String>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i).toLowerCase().contains(enteredText.toLowerCase())) {
filterArray.add(array.get(i));
}
}
if (filterArray.size() > 0) {
this.setModel(new DefaultComboBoxModel(filterArray.toArray()));
this.setSelectedItem(enteredText);
this.showPopup();
}
else {
this.hidePopup();
}
}
/* Testing Codes */
public static List<String> populateArray() {
List<String> test = new ArrayList<String>();
test.add("");
test.add("Mountain Flight");
test.add("Mount Climbing");
test.add("Trekking");
test.add("Rafting");
test.add("Jungle Safari");
test.add("Bungie Jumping");
test.add("Para Gliding");
return test;
}
public static void makeUI() {
JFrame frame = new JFrame("Adventure in Nepal - Combo Filter Test");
FilterComboBox acb = new FilterComboBox(populateArray());
frame.getContentPane().add(acb);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) throws Exception {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
makeUI();
}
}
La performance de la liste de filtre n'est pas très bon mais c'est très bien pour quelques jeu de données. Mon problème est lorsque je supprime le commentaire UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
pour changer de look and feel, le filtre ne fonctionne pas. Dans WindowsLookAndFeel, la liste déroulante ne prend seul caractère en remplaçant le caractère précédemment saisi.
Pouvez-vous s'il vous plaît dites-moi ce qui se passe? Manoj Shrestha la réponse ci-dessous permet d'une certaine manière, mais , pouvez-vous nous fournir quelques suggestions pour obtenir de zone de liste déroulante filtre en Java?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Tout d'abord vous créer un nouveau modèle à chaque fois et puis l'invocation afficher popup à partir de code qui conduit à scintillement, etc. Nous pouvons modifier le modèle lui-même. D'autre part, vous définissez l'entrée de texte comme élément sélectionné qui semble avoir selectAll comportement comme indiqué par d'autres. J'ai modifié le code comme suit:
Espère que cela fonctionne pour vous.
Cette composante est appelée la saisie semi-automatique et est inclus dans une sorte de swing extensions porject.
Juste un coup d'oeil: http://swingx.java.net/
Il y a un webstart: http://swinglabs-demos.java.net/demos/swingxset6/swingxset.jnlp
De saisie semi-automatique est le Menu pour sélectionner. Avoir du plaisir et moins sujette aux erreurs de code 🙂
évidemment, le problème est dans la zone de texte du composant utilisé. Ce qui se passe, lorsque apparence windows est utilisé , le texte de ce composant est sélectionné, l'utilisation de la ligne "textfield.selectAll();", et c'est pourquoi, lorsque vous tapez quelque chose d'autre, le texte sélectionné est effacé forme le composant textfield. Ainsi, dans le code ci-dessous la position du curseur de cet élément est réglé. Voilà comment cela fonctionne, d'abord mémoriser la position du curseur d'un champ de texte dans une variable "currentCaretPosition", puis déplacer la position du curseur au début du texte dans le composant. Après filtrage de la restauration de la position du curseur de retour à la "currentCaretPosition" valeur de la variable. J'espère qu'il fonctionne comme vous le souhaitez.
Le raffinement de code est donné ci-dessous:-
Il ressemble, comme vous l'avez mentionné, lorsque les entrées de l'utilisateur tous les textes dans la zone de liste déroulante, le Windows Look & Feel sélectionne (faits saillants) le texte saisi. Donc, lorsque vous appuyez sur une autre touche, il remplace le précédent. Donc, la solution n'est pas de mettre en évidence les textes. Vous pouvez atteindre cet objectif en ajoutant l'un des énoncés suivants dans votre keylistener.
OU
Donc, votre keylistener devrait ressembler à ceci :