2012-12-03 50 views
14

Làm cách nào để thực hiện tự động hoàn thành trong có thể chỉnh sửa JComboBox trong Netbeans 7.1 như trong ComboBox trong VB dot net. Tôi có một hộp kết hợp với một danh sách ràng buộc, tôi muốn chọn mục bằng cách gõ chỉ một số chữ cái đầu tiên của mục trong danh sách ví dụ nếu một danh sách có kitten, sau đó nó sẽ được chọn khi tôi gõ ki.JComboBox tự động hoàn thành

Trả lời

37

Nếu bạn muốn tự làm điều này, bạn có thể thực hiện theo các bước được giải thích trong this article.

Nếu bạn không muốn phát minh lại bánh xe, bạn có thể sử dụng lib bên thứ 3 hiện có để thêm chức năng này như được giải thích trong this article. Ví dụ sử dụng thư viện SwingX (ví dụ copy từ bài viết liên quan):

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

Không biết nó như thế nào là khi điều này đã được viết, nhưng mã trong liên kết đầu tiên hiện nằm trong miền công cộng và có sẵn trên trang web. Nó có thể sử dụng ngay lập tức. – reden

0

tôi đã phát triển một JComboBox xoay tùy chỉnh có tên là "AutoComboBox" mà tự động hoàn thành khi bạn gõ vào nó bởi forking gist này.

Đây là bản trình diễn nhỏ.

Khai báo và khởi tạo lần đầu tiên. (Nếu bạn đang sử dụng một IDE, chỉ cần kéo và đặt lớp trên để JFrame hay JDialog Form)

AutoComboBox autoComboBox = new AutoComboBox(); 

Tiếp theo, thiết lập các mục danh sách. Phải mất một mảng String. Bạn có thể thay đổi kiểu bằng cách sửa đổi lớp AutoComboBox.

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

Bây giờ bạn có hộp JComboBox hoàn tất tự động có "Malith", "John", "Jack" làm mục!

Dưới đây là hai lớp tôi phát triển,

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

} 

Các 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

Bạn có thể cần phải nhập org.apache.commons.lang3.text.WordUtils ... – Malith

+0

Thú vị nhưng cần một số thay đổi. Quan trọng nhất, chìa khóa nhà không hoạt động trong giải pháp của bạn. Tôi đã sửa lỗi ở đây: http://tinybrain.de/1007529. Câu hỏi mở là cách làm cho mũi tên xuống hoạt động đúng cách. –

Các vấn đề liên quan