JComboBox实现自动完成 问:1、定义一个JComboBox(可输入内容),其数据为abc,bcd,cde,dea, 2、输入a时,JComboBox下拉菜单自动筛选出abc,dea;输入ab时,JComboBox下拉菜单自动筛选出abc后,输入框内返回abc求高手解答 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有本书叫Swing Hacks,上面专门有例子讲解的。 监听ComboBox的Editor的Document事件其Editor就是一个TextField. package kissJava.JList;import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import javax.swing.AbstractAction;import javax.swing.AbstractListModel;import javax.swing.Action;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JComponent;import javax.swing.JFrame;import javax.swing.JList;import javax.swing.JPopupMenu;import javax.swing.JScrollPane;import javax.swing.JTextField;import javax.swing.ListModel;import javax.swing.ScrollPaneConstants;import javax.swing.event.DocumentEvent;import javax.swing.event.DocumentListener;public class FilteredJList extends JList { //private FilterField filterField; private FilterButtonField filterField;//筛选记录按钮 private int DEFAULT_FIELD_WIDTH = 20; public FilteredJList(){ super(); setModel(new FilterModel()); //filterField = new FilterField(DEFAULT_FIELD_WIDTH); filterField = new FilterButtonField(DEFAULT_FIELD_WIDTH); } public void setModel(ListModel m){ if(! (m instanceof FilterModel)) throw new IllegalArgumentException(); super.setModel(m); } public void addItem(Object o){ ((FilterModel)getModel()).addElement(o); } /*public JTextField getFilterField(){ return filterField; }*/ public FilterButtonField getFilterField(){ return filterField; } public static void main(String[] args){ String[] listItems = {"Chirs", "Joshua", "Daniel", "Michael", "Don", "Kimi", "Kelly", "Keagan"}; JFrame frame = new JFrame("可搜索的JLIST+筛选历史记录"); frame.getContentPane().setLayout(new BorderLayout()); FilteredJList list = new FilteredJList(); for(int i=0; i<listItems.length; i++){ list.addItem(listItems[i]); } JScrollPane pane = new JScrollPane(list, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); frame.getContentPane().add(pane, BorderLayout.CENTER); frame.getContentPane().add(list.getFilterField(), BorderLayout.NORTH); frame.pack(); frame.setVisible(true); } class FilterModel extends AbstractListModel{ ArrayList items; ArrayList filterItems; public FilterModel() { super(); items = new ArrayList(); filterItems = new ArrayList(); } public Object getElementAt(int index) { if(index < filterItems.size()) return filterItems.get(index); else return null; } public int getSize() { return filterItems.size(); } public void addElement(Object o){ items.add(o); refilter(); } private void refilter(){ filterItems.clear(); //String terms = getFilterField().getText(); String terms = getFilterField().textField.getText(); for(int i=0; i<items.size(); i++){ if(items.get(i).toString().indexOf(terms,0) != -1) filterItems.add(items.get(i)); fireContentsChanged(this, 0, getSize()); } } } /*class FilterField extends JTextField implements DocumentListener { public FilterField(int width) { super(width); getDocument().addDocumentListener(this); } public void changedUpdate(DocumentEvent e) { ((FilterModel)getModel()).refilter(); } public void insertUpdate(DocumentEvent e) { ((FilterModel)getModel()).refilter(); } public void removeUpdate(DocumentEvent e) { ((FilterModel)getModel()).refilter(); } } */ class FilterButtonField extends JComponent implements DocumentListener{ LinkedList preSearches; JTextField textField; JButton prevSearchButton; JPopupMenu prevSearchMenu; public FilterButtonField(int width) { super(); setLayout(new BorderLayout()); textField = new JTextField(width); textField.getDocument().addDocumentListener(this); preSearches = new LinkedList(); textField.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { System.out.println("test action"); if(e.getSource() == textField){ preSearches.addFirst(textField.getText()); if(preSearches.size() > 10) preSearches.removeLast(); } } }); //prevSearchButton = new JButton(new ImageIcon("E:\\组成原理\\背景\\back17.gif")); prevSearchButton = new JButton("why"); prevSearchButton.setBorder(null); prevSearchButton.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent me){ popuMenu(me.getX(), me.getY()); } }); add(prevSearchButton, BorderLayout.WEST); add(textField, BorderLayout.CENTER); } public void popuMenu(int x, int y){ prevSearchMenu = new JPopupMenu(); Iterator it = preSearches.iterator(); while(it.hasNext()){ prevSearchMenu.add(new PrevSearchAction(it.next().toString())); prevSearchMenu.show(prevSearchButton, x, y); y += 10; } System.out.println("test menu"); } public void changedUpdate(DocumentEvent e) { ((FilterModel)getModel()).refilter(); } public void insertUpdate(DocumentEvent e) { ((FilterModel)getModel()).refilter(); } public void removeUpdate(DocumentEvent e) { ((FilterModel)getModel()).refilter(); } } class PrevSearchAction extends AbstractAction{ String term; public PrevSearchAction(String term) { this.term = term; putValue(Action.NAME, term); } public String toString(){ return term; } public void actionPerformed(ActionEvent arg0) { getFilterField().textField.setText(term); } }} 上面是WING HACKS 上的,,再改点就ok了 To jxliangby但是我系统设计要求是用combobox 而不是list啊,wing hacks这本书我有啊,但我没有combobox的自动完成代码啊 老兄,你也太懒了,我帮了搞了几天,头都搞痛了,不过终于还是解决了哈.http://mydev.com.cn/t/20040609/19/3078189.html这个网址上有解决办法,很简单的,一看就明白了,你真该给我补上点分的... 为了方便人民群众,把解决问题的部分发出来算了将这行: jComboBox1.addKeyListener(new Frame1_jComboBox1_keyAdapter(this)); 改为: jComboBox1.getEditor().getEditorComponent().addKeyListener(new Frame1_jComboBox1_keyAdapter(this)); 面试题 Oracle Publisher 使用 xml 文件 和 xsl 文件 生成 pdf文件 时,报错。 如何将ArrayList 写入 txt文件 问个和反射有关的问题 请问:Java中的抽象类有没有对象?(一道大唐移动面试题) 用jarsigner给sqljdbc.jar签名时候出错 问个弱弱的问题 linux下运行applet的 问题! 菜鸟问题,怎样在Applet中做一个多列,可插图片的列表框 帮忙修改一下代码,怎么运行起来排版很乱,不对整呀?哪里有问题呢 rmi是如何生成请求的? java核心技术竟然这么说
其Editor就是一个TextField.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;import javax.swing.AbstractAction;
import javax.swing.AbstractListModel;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;public class FilteredJList extends JList {
//private FilterField filterField;
private FilterButtonField filterField;//筛选记录按钮
private int DEFAULT_FIELD_WIDTH = 20;
public FilteredJList(){
super();
setModel(new FilterModel());
//filterField = new FilterField(DEFAULT_FIELD_WIDTH);
filterField = new FilterButtonField(DEFAULT_FIELD_WIDTH);
}
public void setModel(ListModel m){
if(! (m instanceof FilterModel))
throw new IllegalArgumentException();
super.setModel(m);
}
public void addItem(Object o){
((FilterModel)getModel()).addElement(o);
}
/*public JTextField getFilterField(){
return filterField;
}*/
public FilterButtonField getFilterField(){
return filterField;
}
public static void main(String[] args){
String[] listItems = {"Chirs", "Joshua", "Daniel", "Michael", "Don", "Kimi", "Kelly", "Keagan"};
JFrame frame = new JFrame("可搜索的JLIST+筛选历史记录");
frame.getContentPane().setLayout(new BorderLayout());
FilteredJList list = new FilteredJList();
for(int i=0; i<listItems.length; i++){
list.addItem(listItems[i]);
}
JScrollPane pane = new JScrollPane(list,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
frame.getContentPane().add(pane, BorderLayout.CENTER);
frame.getContentPane().add(list.getFilterField(), BorderLayout.NORTH);
frame.pack();
frame.setVisible(true);
}
class FilterModel extends AbstractListModel{
ArrayList items;
ArrayList filterItems;
public FilterModel() {
super();
items = new ArrayList();
filterItems = new ArrayList();
} public Object getElementAt(int index) {
if(index < filterItems.size())
return filterItems.get(index);
else
return null;
}
public int getSize() {
return filterItems.size();
}
public void addElement(Object o){
items.add(o);
refilter();
}
private void refilter(){
filterItems.clear();
//String terms = getFilterField().getText();
String terms = getFilterField().textField.getText();
for(int i=0; i<items.size(); i++){
if(items.get(i).toString().indexOf(terms,0) != -1)
filterItems.add(items.get(i));
fireContentsChanged(this, 0, getSize());
}
}
}
/*class FilterField extends JTextField implements DocumentListener {
public FilterField(int width) {
super(width);
getDocument().addDocumentListener(this);
}
public void changedUpdate(DocumentEvent e) {
((FilterModel)getModel()).refilter();
}
public void insertUpdate(DocumentEvent e) {
((FilterModel)getModel()).refilter();
}
public void removeUpdate(DocumentEvent e) {
((FilterModel)getModel()).refilter();
}
}
*/
class FilterButtonField extends JComponent implements DocumentListener{
LinkedList preSearches;
JTextField textField;
JButton prevSearchButton;
JPopupMenu prevSearchMenu;
public FilterButtonField(int width) {
super();
setLayout(new BorderLayout());
textField = new JTextField(width);
textField.getDocument().addDocumentListener(this);
preSearches = new LinkedList();
textField.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("test action");
if(e.getSource() == textField){
preSearches.addFirst(textField.getText());
if(preSearches.size() > 10)
preSearches.removeLast();
}
}
});
//prevSearchButton = new JButton(new ImageIcon("E:\\组成原理\\背景\\back17.gif"));
prevSearchButton = new JButton("why");
prevSearchButton.setBorder(null);
prevSearchButton.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent me){
popuMenu(me.getX(), me.getY());
}
});
add(prevSearchButton, BorderLayout.WEST);
add(textField, BorderLayout.CENTER);
}
public void popuMenu(int x, int y){
prevSearchMenu = new JPopupMenu();
Iterator it = preSearches.iterator();
while(it.hasNext()){
prevSearchMenu.add(new PrevSearchAction(it.next().toString()));
prevSearchMenu.show(prevSearchButton, x, y);
y += 10;
}
System.out.println("test menu");
}
public void changedUpdate(DocumentEvent e) {
((FilterModel)getModel()).refilter();
} public void insertUpdate(DocumentEvent e) { ((FilterModel)getModel()).refilter();
} public void removeUpdate(DocumentEvent e) {
((FilterModel)getModel()).refilter();
}
}
class PrevSearchAction extends AbstractAction{
String term;
public PrevSearchAction(String term) { this.term = term;
putValue(Action.NAME, term);
}
public String toString(){
return term;
}
public void actionPerformed(ActionEvent arg0) {
getFilterField().textField.setText(term);
}
}}
但是我系统设计要求是用combobox 而不是list啊,wing hacks这本书我有啊,但我没有combobox的自动完成代码啊
jComboBox1.addKeyListener(new Frame1_jComboBox1_keyAdapter(this));
改为:
jComboBox1.getEditor().getEditorComponent().addKeyListener(new Frame1_jComboBox1_keyAdapter(this));