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
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);
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;
}
}
Bạn có thể cần phải nhập org.apache.commons.lang3.text.WordUtils ... – Malith
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. –
Một thư viện mát mẻ mà tìm kiếm thông qua một JComboBox : http://www.jidesoft.com/products/oss.htm
bạn có thể tải về jar đây: http://www.java2s.com/Code/JarDownload/jide/jide-oss-3.5.7.jar.zip
Sau khi nhập viện trong dự án của bạn tất cả các bạn phải làm là:
JComboBox comboBox = ....;
ComboBoxSearchable searchable = new ComboBoxSearchable(comboBox);
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