2012-12-03 109 views
14

如何在Netbeans 7.1中編輯JComboBox自動完成,如在VB點網中的ComboBox。我有一個帶有列表綁定的組合框,我想通過在列表中僅輸入項目的某個第一個字母來選擇項目,例如,如果列表有kitten,那麼當我輸入ki時應該選擇它。JComboBox自動完成

回答

37

如果您想自己做,可以按照this article中所述的步驟操作。

如果您不想重新發明輪子,您可以使用現有的第三方庫來添加此功能,如this article中所述。例如使用SwingX庫(例如從鏈接的文章複製):

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

不知道是怎麼回事這是寫的時候,但第一個鏈接中的代碼現在處於公共領域並且可以在網站上使用。它可以馬上使用。 – reden

0

我公司開發的名爲「AutoComboBox」定製JComboBox的擺動,你通過派生此gist它類型的自動完成。

這是一個小的演示。

首先聲明並初始化它。 (如果您使用的是IDE,只需將放置類到您的JFrame或JDialog的形式)

AutoComboBox autoComboBox = new AutoComboBox(); 

接下來,設置項目列表。它需要一個String數組。您可以通過修改AutoComboBox類來更改類型。

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

現在你有一個自動完成的JComboBox其中有「Malith」,「約翰」,「傑克」的項目!

這裏有兩個類我公司開發,

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

} 

的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

您可能需要導入org.apache.commons.lang3.text.WordUtils ... – Malith

+0

有趣,但它需要一些更改。最重要的是,主密鑰在您的解決方案中不起作用。我在這裏解決了這個問題:http://tinybrain.de/1007529。一個懸而未決的問題是如何使向下箭頭正常工作。 –