java Swing中 JCombobox实现可检索的下拉列表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zp357252539/article/details/89375790

这个要自己去实现.这里给你一个演示代码. 
你自己修改一下就可以了.

/* 
在许多Windows应用程序里面,最常见的是IE的地址栏,当我们在ComboBox的文本框内容时, 
它的下拉列表中自动列出最匹配的项目,并且将最匹配的项目显示在输入框中。

在Java中有个JComboBox类,它可以实现下拉选择或者输入选择。 
但是它本身没有提供自动查找和完成功能。我们现在就来 “改装”这个类,使它具有自动查找和完成功能。

改装思路如下:

1.先继承一个JComboBox类,将其setEditable为true. 这样的话,用户才可以在combobox上输入文字。

2.我们知道combobox的输入框是一个JTextField, 可以通过comboBox.getEditor().getEditorComponent()取得这个文本框。

3.为这个文本框加上一个KeyListener.

4.当用户在文本框中按键时,会解发keyReleased事件,我们在这个事件里写主要的实现自动查找和完成的代码。

思想就是这么简单,而自动查找的算法,任何一个对编程不陌生的人都可以写出。以下我列出完整的程序代码:
 

/*******************************************************************************
 * @project: JAutoCompleteComboBox
 * @package: test
 * @file: JAutoCompleteComboBox.java
 * @author: zhangpei
 * @created: 2019-4-18
 * @purpose:
 * 
 * @version: 1.0
 * 
 * Revision History at the end of file.
 * 
 * Copyright 2019 esoon-tech All rights reserved.
 ******************************************************************************/

/**   
 * @Title: JAutoCompleteComboBox.java 
 * @Package test 
 * @Description: TODO(用一句话描述该文件做什么) 
 * @author Burns[张沛]   
 * @date 2019-4-18 上午11:45:57 
 * @version V1.0   
 */
package test;

/** 
 * @ClassName: JAutoCompleteComboBox 
 * @Description: TODO(这里用一句话描述这个类的作用) 
 * @author Burns[张沛] 
 * @date 2019-4-18 上午11:45:57 
 *  
 */

import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.util.List;

import java.util.Vector;

import javax.swing.ComboBoxModel;

import javax.swing.DefaultComboBoxModel;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JTextField;

public class JAutoCompleteComboBox extends JComboBox {

	private AutoCompleter completer;

	public JAutoCompleteComboBox() {
		super();
		addCompleter();
	}

	public JAutoCompleteComboBox(ComboBoxModel cm) {
		super(cm);
		addCompleter();
	}

	public JAutoCompleteComboBox(Object[] items) {
		super(items);
		addCompleter();
	}

	public JAutoCompleteComboBox(List v) {
		super((Vector) v);
		addCompleter();
	}

	private void addCompleter() {
		setEditable(true);
		completer = new AutoCompleter(this);
	}

	public void autoComplete(String str) {
		this.completer.autoComplete(str, str.length());
	}

	public String getText() {
		return ((JTextField) getEditor().getEditorComponent()).getText();
	}

	public void setText(String text) {
		((JTextField) getEditor().getEditorComponent()).setText(text);
	}

	public boolean containsItem(String itemString) {
		for (int i = 0; i < this.getModel().getSize(); i++) {
			String _item = " " + this.getModel().getElementAt(i);
			if (_item.equals(itemString))
				return true;
		}
		return false;
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		Object[] items = new Object[] { "", "abc ", "aab ", "aba ", "hpp ",
				"pp ", "hlp " };
		DefaultComboBoxModel model = new DefaultComboBoxModel();
		JComboBox cmb = new JAutoCompleteComboBox(model);
		model.addElement("");
		model.addElement("abc ");
		model.addElement("aab ");
		model.addElement("aba ");
		model.addElement("hpp ");
		model.addElement("pp ");
		model.addElement("hlp ");
		frame.getContentPane().add(cmb);
		frame.setSize(400, 80);
		frame.setVisible(true);
	}
}

/**
 * /****************************************************************************
 * *** <B>Revision History</B><BR>
 * [type 'revision' and press Alt + / to insert revision block]<BR>
 * 
 * 
 * 
 * Copyright 2019 esoon-tech All rights reserved.
 ******************************************************************************/
/*******************************************************************************
 * @project: JAutoCompleteComboBox
 * @package: test
 * @file: AutoCompleter.java
 * @author: zhangpei
 * @created: 2019-4-18
 * @purpose:
 * 
 * @version: 1.0
 * 
 * Revision History at the end of file.
 * 
 * Copyright 2019 esoon-tech All rights reserved.
 ******************************************************************************/

/**   
 * @Title: AutoCompleter.java 
 * @Package test 
 * @Description: TODO(用一句话描述该文件做什么) 
 * @author Burns[张沛]   
 * @date 2019-4-18 上午11:47:00 
 * @version V1.0   
 */
package test;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;
import java.util.Vector;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JTextField;

/** 
 * @ClassName: AutoCompleter 
 * @Description: TODO(这里用一句话描述这个类的作用) 
 * @author Burns[张沛] 
 * @date 2019-4-18 上午11:47:00 
 *  
 */
/**
 * 自动完成器。自动找到最匹配的项目,并排在列表的最前面。
 * 
 * @author Turbo Chen
 */
class AutoCompleter implements KeyListener, ItemListener {

	private JComboBox owner = null;
	private JTextField editor = null;
	private ComboBoxModel model = null;

	public AutoCompleter(JComboBox comboBox) {
		owner = comboBox;
		editor = (JTextField) comboBox.getEditor().getEditorComponent();
		editor.addKeyListener(this);
		model = comboBox.getModel();

		owner.addItemListener(this);
	}

	public void keyTyped(KeyEvent e) {
	}

	public void keyPressed(KeyEvent e) {
	}

	public void keyReleased(KeyEvent e) {
		char ch = e.getKeyChar();
		if (ch == KeyEvent.CHAR_UNDEFINED || Character.isISOControl(ch)
				|| ch == KeyEvent.VK_DELETE)
			return;

		int caretPosition = editor.getCaretPosition();
		String str = editor.getText();
		if (str.length() == 0)
			return;
		autoComplete(str, caretPosition);
	}

	/**
	 * 自动完成。根据输入的内容,在列表中找到相似的项目.
	 */
	protected void autoComplete(String strf, int caretPosition) {
		Object[] opts;
		opts = getMatchingOptions(strf.substring(0, caretPosition));
		if (owner != null) {
			model = new DefaultComboBoxModel(opts);
			owner.setModel(model);
		}
		if (opts.length > 0) {
			String str = opts[0].toString();
			editor.setCaretPosition(caretPosition);
			if (owner != null) {
				try {
					owner.showPopup();
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
		}
	}

	/**
	 * 
	 * 找到相似的项目, 并且将之排列到数组的最前面。
	 * 
	 * @param str
	 * @return 返回所有项目的列表。
	 */
	protected Object[] getMatchingOptions(String str) {
		List v = new Vector();
		List v1 = new Vector();

		for (int k = 0; k < model.getSize(); k++) {
			Object itemObj = model.getElementAt(k);
			if (itemObj != null) {
				String item = itemObj.toString().toLowerCase();
				if (item.startsWith(str.toLowerCase()))
					v.add(model.getElementAt(k));
				else
					v1.add(model.getElementAt(k));
			} else
				v1.add(model.getElementAt(k));
		}
		for (int i = 0; i < v1.size(); i++) {
			v.add(v1.get(i));
		}
		if (v.isEmpty())
			v.add(str);
		return v.toArray();
	}

	public void itemStateChanged(ItemEvent event) {
		if (event.getStateChange() == ItemEvent.SELECTED) {
			int caretPosition = editor.getCaretPosition();
			if (caretPosition != -1) {
				try {
					editor.moveCaretPosition(caretPosition);
				} catch (IllegalArgumentException ex) {
					ex.printStackTrace();
				}
			}
		}
	}
}

/*******************************************************************************
 * <B>Revision History</B><BR>
 * [type 'revision' and press Alt + / to insert revision block]<BR>
 * 
 * 
 * 
 * Copyright 2019 esoon-tech All rights reserved.
 ******************************************************************************/

祝成功~~

猜你喜欢

转载自blog.csdn.net/zp357252539/article/details/89375790