2012-12-03 26 views
14

Come eseguire il completamento automatico in JComboBox modificabile in Netbeans 7.1 come in ComboBox in VB dot net. Ho una casella combinata con una lista vincolante, voglio selezionare l'elemento digitando solo una prima lettera dell'elemento nell'elenco, ad esempio se un elenco contiene kitten, quindi dovrebbe essere scelto quando si digita ki.Completamento automatico JComboBox

risposta

37

Se si desidera eseguire da soli, è possibile seguire i passaggi illustrati in this article.

Se non si desidera reinventare la ruota, è possibile utilizzare una terza lib di terze parti esistente per aggiungere questa funzionalità come spiegato in this article. Ad esempio utilizzando la libreria SwingX (ad esempio copiato dalla articolo collegato):

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

Non so come lo era quando questo è stato scritto, ma il codice nel primo link è ora di dominio pubblico e disponibile sul sito. Era utilizzabile subito. – reden

0

ho sviluppato un JComboBox altalena personalizzata denominata "AutoComboBox", che completa automaticamente durante la digitazione su di esso da sborsare questa gist.

Ecco una piccola demo.

Prima dichiararlo e inizializzarlo. (Se si utilizza un IDE, è sufficiente trascinare e posizionare la classe al vostro JFrame o JDialog Form)

AutoComboBox autoComboBox = new AutoComboBox(); 

Avanti, impostare l'elenco delle voci. Prende un array di stringhe. È possibile modificare il tipo modificando la classe AutoComboBox.

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

Ora avete un auto completamento JComboBox che ha "Malith", "John", "Jack" come elementi!

Qui ci sono le due classi che ho sviluppato,

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

} 

Il 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; 
} 
} 
+1

Potrebbe essere necessario importare org.apache.commons.lang3.text.WordUtils ... – Malith

+0

Interessante, ma richiede alcune modifiche. Ancora più importante, la chiave di casa non funziona nella soluzione. Ho risolto questo qui: http://tinybrain.de/1007529. Una domanda aperta è come far funzionare correttamente la freccia giù. –