估计这问题都遇到过吧比如一个JComboBox,里面是所有到城市(都是汉字到)。
但要实现到是,比如输入字母,比如B,则显示所有B开头到城市。
而输入汉字,比如南,则显示所有南开头到城市。如果实现?
但要实现到是,比如输入字母,比如B,则显示所有B开头到城市。
而输入汉字,比如南,则显示所有南开头到城市。如果实现?
解决方案 »
- 线程,wait(),notify()相关,求解释
- java中边框的问题
- 用Graphics画一个管道
- ***********Delphi调用Java的WebService时的问题.急........
- 请教JDBC ResultSet的运行机制?
- 得到汉字的首字母问题(急,在线等待)
- java 读写 word (带排版格式)
- 这两个包有什么区别?
- 关于java的日期设置问题
- 怎么解决getOutputStream() has already been called for this response
- 关于包的一点疑问
- 求助:为什么会碰到添加的JComponent一开始无法显示,但窗口一缩放就显示出来了的问题??
可以用
firstComboBox.setKeySelectionManager(new KeySelectionManager(){ public int selectionForKey(char aKey, ComboBoxModel aModel) {//实现这个接口。输入一个字符,然后返回在model中它的index
return 0;
}
});
简单的实现了一下,还有一些问题,lz自行完善吧。
提个思路,看对不。import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;public class ComboBoxTest2 extends JFrame{ /**
*
*/
private static final long serialVersionUID = 1L;
private final JComboBox jcb = new JComboBox();
private final DefaultComboBoxModel aModel = new DefaultComboBoxModel();
private final String[] data = { "nanjing", "wuxi", "suzhou", "yangzhou",
"yancheng", "suqian" };
public ComboBoxTest2(){
super("ComboBoxTest");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
for(String tmp : data){
aModel.addElement(tmp);
}
jcb.setModel(aModel);
jcb.setEditable(true);
jcb.getEditor().getEditorComponent().addKeyListener(new KeyAdapter(){ public void keyTyped(KeyEvent e) {
macher(jcb.getEditor().getItem().toString());
}
private void macher(String macher){
if(macher != null){
//这里要实现筛选。根据输入的字符串,在全部城市中筛选合适的程序,添加到model里
//如果什么都没有输入,则将全部城市放在model中。需要做一些判断处理。
String[] machers = {"yangzhou", "yancheng"};
aModel.removeAllElements();
for(String tmp : machers){
aModel.addElement(tmp);
}
}
}
});
JPanel p = new JPanel(new FlowLayout());
p.add(jcb, FlowLayout.LEFT);
add(p, BorderLayout.NORTH);
setVisible(true);
}
public static void main(String args[]){
new ComboBoxTest2();
}
}
import java.awt.event.ActionListener;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import javax.swing.AbstractListModel;
import javax.swing.ComboBoxEditor;
import javax.swing.MutableComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.border.*;public class GuiFilterComboBox
extends JComboBox { public GuiFilterComboBox() { setModel(new FilterableComboBoxModel(new ArrayList()));
setEditor(new MyEditor());
setEditable(true);
} public class FilterableComboBoxModel
extends AbstractListModel implements MutableComboBoxModel { private List items;
private Filter filter;
private List filteredItems;
private Object selectedItem; public FilterableComboBoxModel(List items) { this.items = new ArrayList(items);
filteredItems = new ArrayList(items.size());
updateFilteredItems();
}
public void addElementList(ArrayList list) {
if (list == null || list.size() == 0) {
return;
}
items.addAll(list);
updateFilteredItems();
} public void addElement(Object obj) { items.add(obj);
updateFilteredItems();
} public void removeElement(Object obj) { items.remove(obj);
updateFilteredItems();
} public void removeElementAt(int index) { items.remove(index);
updateFilteredItems();
} public void insertElementAt(Object obj, int index) {} public void setFilter(Filter filter) { this.filter = filter;
updateFilteredItems();
} protected void updateFilteredItems() { fireIntervalRemoved(this, 0, filteredItems.size());
filteredItems.clear(); if (filter == null) {
filteredItems.addAll(items);
}
else {
for (Iterator iterator = items.iterator(); iterator.hasNext(); ) { Object item = iterator.next(); if (filter.accept(item)) {
filteredItems.add(item);
}
}
}
fireIntervalAdded(this, 0, filteredItems.size());
} public int getSize() {
return filteredItems.size();
} public Object getElementAt(int index) {
return filteredItems.get(index);
} public Object getSelectedItem() {
return selectedItem;
} public void setSelectedItem(Object val) { if ( (selectedItem == null) && (val == null)) {
return;
} if ( (selectedItem != null) && selectedItem.equals(val)) {
return;
} if ( (val != null) && val.equals(selectedItem)) {
return;
} selectedItem = val;
fireContentsChanged(this, -1, -1);
}
} public static interface Filter {
public boolean accept(Object obj);
} class StartsWithFilter
implements Filter { private String prefix;
public StartsWithFilter(String prefix) {
this.prefix = prefix;
} public boolean accept(Object o) {
return o.toString().toLowerCase().startsWith(prefix.toLowerCase());
}
} public class MyEditor
implements ComboBoxEditor, DocumentListener { public JTextField text;
private volatile boolean filtering = false;
private volatile boolean setting = false; public MyEditor() {
text = new JTextField(35) {
public void setBorder(Border b) {
}
};
text.getDocument().addDocumentListener(this);
} public Component getEditorComponent() {
return text;
} public void setItem(Object item) {
if (filtering) {
return;
}
setting = true;
String newText = (item == null) ? "" : item.toString();
text.setText(newText);
setting = false;
} public Object getItem() {
return text.getText();
} public void selectAll() {
text.selectAll();
} public void addActionListener(ActionListener l) {
text.addActionListener(l);
} public void removeActionListener(ActionListener l) {
text.removeActionListener(l);
} public void insertUpdate(DocumentEvent e) {
try {
handleChange();
} catch (Exception ex) {
ex.printStackTrace();
}
} public void removeUpdate(DocumentEvent e) {
try {
handleChange();
} catch (Exception ex) {
ex.printStackTrace();
}
} public void changedUpdate(DocumentEvent e) {} protected void handleChange() {
if (setting) {
return;
}
filtering = true; Filter filter = null;
if (text.getText().length() > 0) {
filter = new StartsWithFilter(text.getText());
} ( (FilterableComboBoxModel) getModel()).setFilter(filter);
// A bit nasty but it seems to get the popup validated properly
setPopupVisible(false);
setPopupVisible(true);
filtering = false;
}
}
}