使用自定义的文本框控件,从数据库中读取值对输入内容自动提示。
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可运行。
分享到:
相关推荐
java swing 文本框自动补全示例,数据源默认当前系统字体,便于测试,单文件一看就懂...........
在设计交互式应用时,我们经常需要实现一个功能,即当用户在文本框中输入时,系统能根据输入内容自动给出提示或建议,这通常被称为自动补全或自动提示功能。这种功能在很多地方都能见到,如搜索引擎的搜索框、编程...
类文件自动补全是指在编写 Java 代码时,Eclipse 可以自动提示类的成员变量和方法。这可以帮助开发者快速编写代码,避免编写错误。要启用类文件自动补全,需要在 Eclipse 中进行如下设置: 1. 打开 Eclipse 菜单栏...
在本项目实战中,我们将探讨如何使用SSI(Server-Side Includes)技术,结合流行的Java Web框架如iBatis、Spring和Struts2,以及前端库jQuery UI的autocomplete组件,来实现一个高效的产品自动补全功能。这个功能...
这个控件通常用于实现自动补全或下拉提示的功能。当用户在文本框中输入字符时,`AutoCompleteTextView`会显示与已输入内容匹配的建议项。这不仅帮助用户快速找到他们想要输入的内容,还能减少输入错误。 在实现自动...
总之,`Java Swing 下拉框列表框补全提示的类` 提供了一种高效的方法来处理组件内内容超出显示范围的问题,通过 `ViewTooltip` 实现了自定义的提示功能,提高了用户体验。理解并熟练运用此类可以帮助开发者创建更...
在Java编程中,实现类似于Google搜索提示的功能,主要涉及到关键词自动补全(Autocomplete)或称为建议(Suggestion)功能。这种功能广泛应用于各种输入框,例如搜索引擎、文本编辑器和命令行工具等,能够提高用户的...
1. **动态提示**:当用户在文本框中输入文字时,会根据输入的内容动态显示匹配的建议列表。 2. **数据源**:建议列表的数据可以来自多种来源,如数组、列表或者网络请求等。 3. **自定义适配器**:通过设置自定义的`...
本篇文章将深入探讨`AutoCompleteTextView`的使用,包括其基本功能、设置与自定义,以及如何与数据源结合实现自动补全效果。 ### 基本概念 `AutoCompleteTextView` 是 `EditText` 的一个扩展,它具有自动提示功能...
AutoCompleteTextView是Android SDK中的一个视图类,属于EditText的扩展,它通过自动补全功能来帮助用户快速输入数据。 **自动完成的工作原理:** 自动完成的核心机制是通过监听用户的输入事件,当用户在文本框中...
以在搜索框搜索时,自动补全为例: 其中还涉及到一个词,Tokenizer:分词器,分解器。 上效果图: MainActivity.java: package com.joan.testautocomletetextview; import android.R.array; import android.os....
- 代码补全:在开发环境中,代码编辑器的自动补全功能也是Autocomplete的一种应用。 总之,文本框下拉自动选择功能是提升用户体验的重要工具,其背后的实现技术和设计考虑都值得开发者关注和研究。在实际应用中,...
在本文中,我们将深入探讨如何在安卓应用中实现自动补全功能,以帮助初学者快速入门。 自动补全文本组件是安卓SDK中的一个视图类,继承自EditText,它允许开发者在用户输入时提供一个可选的建议列表。这个功能通常...
通过合理的配置属性和适配器,开发者可以创建出功能强大、易于使用的自动补全输入框。无论是在简单的应用内搜索,还是在复杂的数据录入场景,AutoCompleteTextView都能发挥其作用,提高应用的易用性和效率。在实际...
模糊检索在Android中主要通过`AutoCompleteTextView`类实现,这是一个可扩展的`TextView`,能够提供自动补全功能。当用户在文本框中输入字符时,系统会自动匹配预定义的数据集,并以下拉列表的形式展示匹配结果。...
ScintillaNet不仅仅是一个简单的文本框,它提供了许多高级功能,包括语法高亮、代码折叠、行号显示、多选编辑、搜索替换、Unicode支持以及自定义的样式和标记。语法高亮允许用户以不同的颜色和样式显示不同类型的...
1. Java Swing的自动补全功能实现:讲解如何使用Swing组件和事件监听器来创建一个自定义的建议功能。 2. Swing组件源码分析:深入研究Swing组件的源代码,了解自动补全功能的底层机制。 3. Ant构建流程:介绍如何...
在MyEclipse 6.5中,默认情况下`Alt+/`被分配给了单词补全(Word Completion)功能,而内容协助(Content Assist)即自动提示功能的默认快捷键是`Ctrl+Space`,这一快捷键与Windows系统中切换输入法的快捷键相同,...