Java实现自动补全提示的文本框

使用自定义的文本框控件,从数据库中读取值对输入内容自动提示。
1.ListPopup类:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.MouseInputListener;

/**
*
* @author William Chen
*/
public class ListPopup extends JPopupMenu implements MouseInputListener {

private JList list;
private JScrollPane pane;
private ArrayList<ListSelectionListener> listeners=new ArrayList<ListSelectionListener>();
public void addListSelectionListener(ListSelectionListener l){
if(!listeners.contains(l))
listeners.add(l);
}
public void setSelectedIndex(int index){
if(index>=list.getModel().getSize())
index=0;
if(index<0)
index=list.getModel().getSize()-1;
list.ensureIndexIsVisible(index);
list.setSelectedIndex(index);
}
public Object getSelectedValue(){
return list.getSelectedValue();
}
public int getSelectedIndex(){
return list.getSelectedIndex();
}
public boolean isSelected(){
return list.getSelectedIndex()!=-1;
}
public void setLastOneSelected(){
int count=list.getModel().getSize();
if(count>0){
list.ensureIndexIsVisible(count-1);
list.setSelectedIndex(count-1);
}
}
public void removeListSelectionListener(ListSelectionListener l){
if(listeners.contains(l))
listeners.remove(l);
}
private void fireValueChanged(ListSelectionEvent e){
for(ListSelectionListener l:listeners){
l.valueChanged(e);
}
}
public ListPopup() {
setLayout(new BorderLayout());
list = new JList();
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.addMouseListener(this);
list.addMouseMotionListener(this);
list.setModel(new DefaultListModel());
pane = new JScrollPane(list);
pane.setBorder(null);
add(pane, BorderLayout.CENTER);
}

public int getItemCount() {
DefaultListModel model = (DefaultListModel) list.getModel();
return model.getSize();
}

public Object getItem(int index) {
DefaultListModel model = (DefaultListModel) list.getModel();
return model.get(index);
}

public void addItem(Object o) {
DefaultListModel model = (DefaultListModel) list.getModel();
model.addElement(o);
list.repaint();
}

public void removeItem(Object o) {
DefaultListModel model = (DefaultListModel) list.getModel();
model.removeElement(o);
list.repaint();
}

public void setList(Iterable iterable) {
DefaultListModel model = new DefaultListModel();
for (Object o : iterable) {
model.addElement(o);
}
list.setModel(model);
list.repaint();
}

public void setList(Enumeration e) {
DefaultListModel model = new DefaultListModel();
while (e.hasMoreElements()) {
model.addElement(e.nextElement());
}
list.setModel(model);
list.repaint();
}

public void setList(Object... objects) {
DefaultListModel model = new DefaultListModel();
for (Object o : objects) {
model.addElement(o);
}
list.setModel(model);
list.repaint();
}


public void mouseClicked(MouseEvent e) {
}

public void mousePressed(MouseEvent e) {
if(list.getSelectedIndex()!=-1)
fireValueChanged(new ListSelectionEvent(list, list.getSelectedIndex(), list.getSelectedIndex(), true));
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseMoved(MouseEvent anEvent) {
if (anEvent.getSource() == list) {
Point location = anEvent.getPoint();
Rectangle r = new Rectangle();
list.computeVisibleRect(r);
if (r.contains(location)) {
updateListBoxSelectionForEvent(anEvent, false);
}
}
}

protected void updateListBoxSelectionForEvent(MouseEvent anEvent, boolean shouldScroll) {

Point location = anEvent.getPoint();
if (list == null) {
return;
}
int index = list.locationToIndex(location);
if (index == -1) {
if (location.y < 0) {
index = 0;
} else {
index = list.getModel().getSize() - 1;
}
}
if (list.getSelectedIndex() != index) {
list.setSelectedIndex(index);
if (shouldScroll) {
list.ensureIndexIsVisible(index);
}
}
}

public void mouseDragged(MouseEvent e) {
}
}


2.AutoCompletionField类:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class AutoCompletionField extends JTextField implements DocumentListener, MouseListener, ListSelectionListener, ActionListener, KeyListener {

private static int DEFAULT_PREFERRED_HEIGHT = 100;
private ListPopup popup;
private int preferredHeight = DEFAULT_PREFERRED_HEIGHT;
private CompletionFilter filter;

public void setFilter(CompletionFilter f) {
filter = f;
}

public AutoCompletionField() {
popup = new ListPopup();
getDocument().addDocumentListener(this);
addMouseListener(this);
popup.addListSelectionListener(this);
addActionListener(this);
addKeyListener(this);
}

public void setPopupPreferredHeight(int h) {
preferredHeight = h;
}

private boolean isListChange(ArrayList array) {
if (array.size() != popup.getItemCount()) {
return true;
}
for (int i = 0; i < array.size(); i++) {
if (!array.get(i).equals(popup.getItem(i))) {
return true;
}
}
return false;
}

private void textChanged() {
if ("".equals(this.getText()))
popup.setVisible(false);
else {
if (!popup.isVisible()) {
showPopup();
requestFocus();
}
if (filter != null) {
ArrayList array = filter.filter(getText());
changeList(array);
}

}

}

private void showPopup() {
popup.setPopupSize(getWidth(), preferredHeight);
popup.show(this, 0, getHeight()-1);
}

private void changeList(ArrayList array) {
if (array.size() == 0) {
if (popup.isVisible()) {
popup.setVisible(false);
}
} else {
if (!popup.isVisible()) {
showPopup();
}
}
if (isListChange(array)&&array.size()!=0) {
popup.setList(array);
}
}

public void insertUpdate(DocumentEvent e) {
textChanged();
}

public void removeUpdate(DocumentEvent e) {
textChanged();
}

public void changedUpdate(DocumentEvent e) {
textChanged();
}

public void mouseClicked(MouseEvent e) {
if(e.getClickCount()>1 && !popup.isVisible())
textChanged();
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void valueChanged(ListSelectionEvent e) {
JList list=(JList)e.getSource();
String text=list.getSelectedValue().toString();
setText(text);
popup.setVisible(false);
}

public void actionPerformed(ActionEvent e) {
if(popup.isVisible()){
Object o=popup.getSelectedValue();
if(o!=null)
setText(o.toString());
popup.setVisible(false);
}
this.selectAll();
this.requestFocus();
}

public void keyTyped(KeyEvent e) {
}

public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_DOWN){
if(popup.isVisible()){
if(!popup.isSelected())
popup.setSelectedIndex(0);
else
popup.setSelectedIndex(popup.getSelectedIndex()+1);
}
}else if(e.getKeyCode()==KeyEvent.VK_UP){
if(popup.isVisible()){
if(!popup.isSelected())
popup.setLastOneSelected();
else
popup.setSelectedIndex(popup.getSelectedIndex()-1);
}
}else if(e.getKeyCode()==KeyEvent.VK_PAGE_DOWN){
if(popup.isVisible()){
if(!popup.isSelected())
popup.setSelectedIndex(0);
else
popup.setSelectedIndex(popup.getSelectedIndex()+5);
}
}else if(e.getKeyCode()==KeyEvent.VK_PAGE_UP){
if(popup.isVisible()){
if(!popup.isSelected())
popup.setLastOneSelected();
else
popup.setSelectedIndex(popup.getSelectedIndex()-5);
}
}
}

public void keyReleased(KeyEvent e) {
}
}


3.CompletionFilter类:

import java.util.ArrayList;

public interface CompletionFilter {
ArrayList filter(String text);
}


4.DefaultCompletionFilter类:

import java.util.ArrayList;
import java.util.Vector;

public class DefaultCompletionFilter implements CompletionFilter {

private Vector vector;

public DefaultCompletionFilter() {
vector = new Vector();
}

public DefaultCompletionFilter(Vector v) {
vector = v;
}
public ArrayList filter(String text) {
ArrayList list=new ArrayList();
String txt=text.trim();
int length=txt.length();
for(int i=0;i<vector.size();i++){
Object o=vector.get(i);
String str=o.toString();
if(length==0||str.startsWith(txt)) //输入内容与记录前端比较
list.add(o);
}
return list;
}
}


5.使用的控件MyAutoField,使用时指定查询条件和自动提示的字段:

import java.awt.im.InputMethodRequests;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import com.borland.jbcl.layout.XYConstraints;
import com.borland.jbcl.layout.XYLayout;
import yz.jlsys.connect.connector;

public class MyAutoField extends AutoCompletionField {

/** Creates new form AutoCompletionFrame */
public MyAutoField(String sql,String field) {
super();
Vector tempvector = new Vector();
connector connec = new connector(); // 数据库操作对象
ResultSet rs = connec.getResult(sql);
try{
//若结果集不为空,则显示每条记录
boolean isexist = false;
isexist = rs.first();

if(isexist)
{
//移动光标到零的位置
rs.beforeFirst();
while(rs.next() )
{
if(tempvector.contains(rs.getString(field)))
continue;
tempvector.add(rs.getString(field));
}
}
}
catch(SQLException e){

}
this.setFilter(new DefaultCompletionFilter(tempvector));
}

public InputMethodRequests getInputMethodRequests() {
return null;
}

public static void main(String args[]) {

try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame j = new JFrame();
j.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel();
j.setContentPane(contentPane);
contentPane.setLayout(new XYLayout());
j.setSize(800,720);
j.getContentPane().add(new MyAutoField("select * from clienttable where CLIENTNAME like '%'", "CLIENTNAME"), new XYConstraints(40, 95, 200, 25));
j.setVisible(true);

}
}


以上5个文件放到同一个包中,从MyAutoField的main可运行。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值