应用软件常见的一个功能是输入框选项自动提示功能。比如Google的查询条件输入框。Google记录下用户经常查询的关键字。当用户输入时,它能根据 当前已经输入的字符过滤出相近的选项,放在弹出的下拉框中供选择。如果碰巧有用户想要查询的关键字,就可以从中直接选择,而不用继续输入。
还有个常见的应用场景是文件选择框的文件名自动补齐提示功能。当选择文件时,如果文件夹中文件太多,可在文件名输入框中输入该文件名称头几个字符,文件对话框会自动过滤出符合条件的几个文件供选择。
这是个相当贴心的功能,能极大提高软件的易用性和友好程度。不幸的是Swing JTextField并不支持这个功能。幸运的是Swing提供了实现所需的灵活框架,而且实现并不复杂。只要结合前面文章介绍的popup相关知识和对Swing事件的稍许了解,就可以实现这个功能。
实现这一功能的基本思想是侦听JTextField的Document事件,当输入框内的文字发生变化时,调用过滤器过滤出选项,将这些选项放在一个JList,将该JList添加到JPopupMenu显示出来。
这个实现要注意一下几点:
1.显示选项下拉框时JTextField会失去焦点,因此必须在弹出选项框后,调用JTextField.requestFocus使其重新获得焦点,以便继续后面的键盘输入。
2.为实现类似鼠标在菜单上的效果,要为JList添加鼠标处理器,动态检测鼠标位置,并设置当前选项。
3.为使其支持键盘操作,包括上下箭头和Page Up/Down,要为JTextField添加KeyListener。注意虽然JList本身就支持键盘操作,但由于输入时焦点是在JTextField上,因此键盘操作不对JList起作用,所以需要为JTextField添加该处理器。
4.为方便以后扩展,过滤器要使用接口的形式,以便应用程序编写自己的过滤器实现,并注册到该组件上。
5.要提供显式激活选项下拉框的方法。本文演示的实现是用鼠标双击JTextField的方式,它根据当前JTextField的内容过滤选项并显示选项下拉框。
本文演示程序实现该功能的组件是一个继承了JTextField的类dyno.swing.beans.AutoCompletionField。主要接口有两个:
public void setFilter(CompletionFilter f) |
设置该输入框的过滤器。用户可以像编写Swing事件处理器一样编写实现CompletionFilter接口的过滤器。接口CompletionFilter的定义如下:
public interface CompletionFilter { ArrayList filter(String text); } |
每次输入框内容发生变化,AutoCompletionField会调用filter方法,过滤出下拉框选项。返回的选项列表类型可以为任何引用类型。然后AutoCompletionField将这些选项添加到下拉框显示给用户。
演示实现了一个缺省的过滤处理器,dyno.swing.beans.DefaultCompletionFilter,它使用字符串首匹配算法从一个Vector提供的选项列表中过滤所有的选项。
public void setPopupPreferredHeight(int h) |
设置下拉框窗口的最佳高度。选项下拉框的宽度总是和输入框的宽度一致。
使用该组件的样例代码如下:
AutoCompletionField auto = new AutoCompletionField();
Vector v=new Vector(); File file=new File(System.getProperty("user.home")); String[]files=file.list(); for(String filename:files) v.add(filename); auto.setFilter(new DefaultCompletionFilter(v));
panel.add(auto);
|
本文的演示使用类似上面代码模拟文件对话框的文件名过滤功能。当用户输入时,它根据输入过滤用户目录下相近文件名的列表,弹出下拉框供用户选择:
本文的演示源码下载。
相关推荐
在Java Swing应用中,为了提升用户体验,经常需要为`JTextField`添加“自动完成”(Auto-Completion)功能。这个功能允许用户在输入文本时,系统能够自动匹配并显示可能的建议,类似于搜索引擎或邮件客户端的地址...
通过以上分析,我们可以看到如何通过自定义`Document`类来实现对`JTextField`的输入限制,以及如何通过扩展`JTextField`来添加额外的功能,如鼠标滚轮控制。这种方法不仅可以应用于限制数字输入的情况,还可以根据...
标题中的“带水印(背景)的JTextField”指的是在Java Swing编程中,为JTextField组件添加水印或背景图像的功能。在Java图形用户界面设计中,JTextField是用于接收单行文本输入的基本组件。而水印效果通常是指在...
代码片段中实现了一个名为 `color()` 的方法,其主要功能是将 `jTextField1` 中输入的关键字在 `jTextArea1` 中进行搜索,并标记匹配到的关键字。具体步骤如下: 1. **初始化变量**: - `i`:记录 `jTextField1` ...
在标准的`JTextField`中,虽然没有内置的自动联想或提示功能,但开发者可以通过自定义和扩展`JTextField`的功能来实现类似Google输入框的效果。 这篇原创文章描述的是如何在Java中封装`JTextField`,以实现输入时的...
JTextField_Example.java
实现圆角矩形边框,hint文字,主要代码: ... JTextField textField = (JTextField) c; if ("".equals(textField.getText())) { g2d.setColor(Color.BLACK); g2d.drawString("请输入文字...", 10, 18); }
`JTextFieldDemo.java`可能是一个简单的示例程序,演示了如何创建并显示一个JTextField,以及可能添加的事件监听和处理。 总结,Java JTextField组件是Java GUI编程中不可或缺的一部分,提供了基础的文本输入功能...
这篇博客“控制JTextField的输入”主要探讨了如何实现这些功能。 首先,我们可以使用`DocumentFilter`来过滤`JTextField`中的输入。`DocumentFilter`是`javax.swing.text.Document`接口的一个子类,它可以拦截并...
在上述代码中,我们创建了一个`JTextField`实例,并设置了它的最大输入长度为10。然后,我们创建了一个`JTextFieldCustomDocumentListener`实例,并将其添加到`JTextField`的`Document`中。当用户尝试输入超过最大...
本知识点将深入探讨如何扩展JTextField实现这样的弹窗辅助输入功能,并结合JTable进行使用。 首先,`PopWindowTextFiled.java`是关键类,它扩展了JTextField,增加了弹窗显示功能。这个类需要实现一个监听机制,...
该计算器模仿Windows自带的计算器,只实现标准型计算器功能。 在完成Swing的学习后,练习使用Swing包中JFrame、JButton、JLabel、JTextField、JMenu、JMenuItem等组件完成图形界面绘制。 前期能够独立思考并完成...
Text_JTextField.class
以下是一个简单的实例代码,演示了如何创建一个 JTextField 并添加到 JFrame 中: ```java package com.xiets.swing; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java....
但在实际应用中,我们可能需要定制它的功能,比如添加鼠标事件处理,改变其外观等。通过继承JLabel并覆盖其方法,我们可以实现自定义的行为。例如,可以重写`paintComponent(Graphics g)`方法来绘制自定义的背景或...
本项目实现了一个简单的通讯录系统,具备添加联系人、删除联系人和查找联系人等功能,下面将详细阐述这些知识点。 1. **面向对象编程**:Java是面向对象的语言,通讯录可以被看作是一个对象,其中每个联系人都是一...
JTextField jurl=new JTextField(60); JEditorPane jEditorPanel=new JEditorPane(); JScrollPane scrollPane=new JScrollPane(jEditorPanel); // JWindow window=new JWindow(WebBrowser.this); // Toolkit ...
在给定的资源“AutoText”中,我们关注的是如何为Java Swing的文本组件添加自动完成功能。这个库特别适用于JTextComponent的子类,如JTextField和JFormattedTextField,这些组件通常用于接收用户的单行文本输入。 ...
3. **设置事件监听器**:为`JTextField`或`JPasswordField`添加`FocusListener`。当文本框获得焦点时,如果当前文本为空,则移除占位符标签;反之,失去焦点且内容为空时,重新显示占位符标签。 4. **处理键盘事件*...
JTextField是Java Swing库中的一个组件类,用于接收用户的文本输入。