问:1、定义一个JComboBox(可输入内容),其数据为abc,bcd,cde,dea,
    2、输入a时,JComboBox下拉菜单自动筛选出abc,dea;输入ab时,JComboBox下拉菜单自动筛选出abc后,输入框内返回abc
求高手解答

解决方案 »

  1.   

    有本书叫Swing Hacks,上面专门有例子讲解的。
      

  2.   

    监听ComboBox的Editor的Document事件
    其Editor就是一个TextField.
      

  3.   

    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);

    }
    }}
      

  4.   

    上面是WING HACKS 上的,,再改点就ok了
      

  5.   

    To jxliangby
    但是我系统设计要求是用combobox 而不是list啊,wing hacks这本书我有啊,但我没有combobox的自动完成代码啊
      

  6.   

    老兄,你也太懒了,我帮了搞了几天,头都搞痛了,不过终于还是解决了哈.http://mydev.com.cn/t/20040609/19/3078189.html这个网址上有解决办法,很简单的,一看就明白了,你真该给我补上点分的...
      

  7.   

    为了方便人民群众,把解决问题的部分发出来算了将这行:   
      jComboBox1.addKeyListener(new   Frame1_jComboBox1_keyAdapter(this));   
      改为:   
      jComboBox1.getEditor().getEditorComponent().addKeyListener(new   Frame1_jComboBox1_keyAdapter(this));