问:1、定义一个JComboBox(可输入内容),其数据为abc,bcd,cde,dea,
2、输入a时,JComboBox下拉菜单自动筛选出abc,dea;输入ab时,JComboBox下拉菜单自动筛选出abc后,输入框内返回abc
求高手解答
2、输入a时,JComboBox下拉菜单自动筛选出abc,dea;输入ab时,JComboBox下拉菜单自动筛选出abc后,输入框内返回abc
求高手解答
调试欢乐多
其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));