`
pufan53
  • 浏览: 44814 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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可运行。
分享到:
评论
1 楼 sdchristmas 2014-06-22  

import com.borland.jbcl.layout.XYConstraints;
import com.borland.jbcl.layout.XYLayout;
这俩没有啊

相关推荐

    java swing 文本框自动补全示例

    java swing 文本框自动补全示例,数据源默认当前系统字体,便于测试,单文件一看就懂...........

    java文本框自动提示

    在设计交互式应用时,我们经常需要实现一个功能,即当用户在文本框中输入时,系统能根据输入内容自动给出提示或建议,这通常被称为自动补全或自动提示功能。这种功能在很多地方都能见到,如搜索引擎的搜索框、编程...

    eclipse开发自动补全功能

    类文件自动补全是指在编写 Java 代码时,Eclipse 可以自动提示类的成员变量和方法。这可以帮助开发者快速编写代码,避免编写错误。要启用类文件自动补全,需要在 Eclipse 中进行如下设置: 1. 打开 Eclipse 菜单栏...

    [项目实战] SSI实现产品自动补全功能

    在本项目实战中,我们将探讨如何使用SSI(Server-Side Includes)技术,结合流行的Java Web框架如iBatis、Spring和Struts2,以及前端库jQuery UI的autocomplete组件,来实现一个高效的产品自动补全功能。这个功能...

    自动补全联系人

    这个控件通常用于实现自动补全或下拉提示的功能。当用户在文本框中输入字符时,`AutoCompleteTextView`会显示与已输入内容匹配的建议项。这不仅帮助用户快速找到他们想要输入的内容,还能减少输入错误。 在实现自动...

    JavaSwing下拉框列表框补全提示的类

    总之,`Java Swing 下拉框列表框补全提示的类` 提供了一种高效的方法来处理组件内内容超出显示范围的问题,通过 `ViewTooltip` 实现了自定义的提示功能,提高了用户体验。理解并熟练运用此类可以帮助开发者创建更...

    java 类似于google搜索提示的功能,文本框输入提示

    在Java编程中,实现类似于Google搜索提示的功能,主要涉及到关键词自动补全(Autocomplete)或称为建议(Suggestion)功能。这种功能广泛应用于各种输入框,例如搜索引擎、文本编辑器和命令行工具等,能够提高用户的...

    Android 自动完成文本框

    1. **动态提示**:当用户在文本框中输入文字时,会根据输入的内容动态显示匹配的建议列表。 2. **数据源**:建议列表的数据可以来自多种来源,如数组、列表或者网络请求等。 3. **自定义适配器**:通过设置自定义的`...

    自动文本框的使用

    本篇文章将深入探讨`AutoCompleteTextView`的使用,包括其基本功能、设置与自定义,以及如何与数据源结合实现自动补全效果。 ### 基本概念 `AutoCompleteTextView` 是 `EditText` 的一个扩展,它具有自动提示功能...

    安卓文本框自动提示

    AutoCompleteTextView是Android SDK中的一个视图类,属于EditText的扩展,它通过自动补全功能来帮助用户快速输入数据。 **自动完成的工作原理:** 自动完成的核心机制是通过监听用户的输入事件,当用户在文本框中...

    Android 自动补全提示输入AutoCompleteTextView、 MultiAutoCompleteTextView

    以在搜索框搜索时,自动补全为例: 其中还涉及到一个词,Tokenizer:分词器,分解器。 上效果图: MainActivity.java: package com.joan.testautocomletetextview; import android.R.array; import android.os....

    文本框下拉自动选择功能例子autocomplete

    - 代码补全:在开发环境中,代码编辑器的自动补全功能也是Autocomplete的一种应用。 总之,文本框下拉自动选择功能是提升用户体验的重要工具,其背后的实现技术和设计考虑都值得开发者关注和研究。在实际应用中,...

    安卓开发入门之自动补全文本(翻译)

    在本文中,我们将深入探讨如何在安卓应用中实现自动补全功能,以帮助初学者快速入门。 自动补全文本组件是安卓SDK中的一个视图类,继承自EditText,它允许开发者在用户输入时提供一个可选的建议列表。这个功能通常...

    Android自动编辑文本框(AutoCompleteTextView)使用方法详解

    通过合理的配置属性和适配器,开发者可以创建出功能强大、易于使用的自动补全输入框。无论是在简单的应用内搜索,还是在复杂的数据录入场景,AutoCompleteTextView都能发挥其作用,提高应用的易用性和效率。在实际...

    android文本框的模糊检索

    模糊检索在Android中主要通过`AutoCompleteTextView`类实现,这是一个可扩展的`TextView`,能够提供自动补全功能。当用户在文本框中输入字符时,系统会自动匹配预定义的数据集,并以下拉列表的形式展示匹配结果。...

    支持自动完成的富文本框 ScintillaNet Binaries 2.2

    ScintillaNet不仅仅是一个简单的文本框,它提供了许多高级功能,包括语法高亮、代码折叠、行号显示、多选编辑、搜索替换、Unicode支持以及自定义的样式和标记。语法高亮允许用户以不同的颜色和样式显示不同类型的...

    swing suggest

    1. Java Swing的自动补全功能实现:讲解如何使用Swing组件和事件监听器来创建一个自定义的建议功能。 2. Swing组件源码分析:深入研究Swing组件的源代码,了解自动补全功能的底层机制。 3. Ant构建流程:介绍如何...

    myeclipse6.5中自动提示的修改

    在MyEclipse 6.5中,默认情况下`Alt+/`被分配给了单词补全(Word Completion)功能,而内容协助(Content Assist)即自动提示功能的默认快捷键是`Ctrl+Space`,这一快捷键与Windows系统中切换输入法的快捷键相同,...

Global site tag (gtag.js) - Google Analytics