Merlin的魔力: Swing 的新JFormattedTextField组件

Java 2 标准版(J2SE),版本 1.4 为可用的 GUI 元素调色板添加了 2 个新的 Swing 组件: JSpinner 和 JFormattedTextField 。在 Merlin 的魔力专栏的第一篇我们就介绍了 JSpinner 组件;我们现在将要探讨 JFormattedTextField 。

虽然 JFormattedTextField 组件看起来与 JTextField 相似,但是它的行为与 JSpinner 完全不同。在最简单的情况下,您可以为电话号码提供一个类似“(###)###-####”的输入掩码,它不会接受任何不遵循那个格式的输入。在较为复杂的情况下,既有显示格式化器,也有输入格式化器。例如:编辑时,缺省日期格式化器允许根据光标的位置在可用的月或日之间滚动。

当使用 JFormattedTextField 时,可接受的输入或者是由掩码明确指定,或者是由组件的一个值指定。在后一种情况下,组件用工厂(Factory)设计模式来查找指定值类的缺省格式化器。 DefaultFormatterFactory 组件提供预先安装的日期、数字、 java.text.Format 子类的格式化器以及其他一切包罗万象的格式化器。

让我们看看如何使用组件。

配置可接受的输入

屏蔽输入一般是通过使用 MaskFormatter 类的一个实例配置的。在 javax.swing.text 包中发现, MaskFormatter 通过使用一系列字符指定可接受的输入来工作。该系列 8 个字符中的每一个都代表输入中的一个字符,下面的列表指出了这一点:

# 一个数字
? 一个字母
A 一个字母或数字
* 任意字符
U 一个字母,小写字符映射到与它们等效的大写字符上
L 一个字母,大写字符映射到与它们等效的小写字符上
H 一个十六进制数字(A-F、a-f、0-9)
' 用来转义另外一个掩码字符

除了 MaskFormatter 之外,您还可以用来自 java.text 软件包的 DateFormat 和 NumberFormat 类指定输入格式。清单 1 显示了一些可能的格式。

清单 1. 定义输入掩码

// Four-digit year, followed by month name and day of month,
// each separated by two dashes (--)
DateFormat format =
 new SimpleDateFormat("yyyy--MMMM--dd");
DateFormatter df = new DateFormatter(format);
// US Social Security number
MaskFormatter mf1 =
 new MaskFormatter("###-##-####");
// US telephone number
MaskFormatter mf2 =
 new MaskFormatter("(###) ###-####");

一旦您指定了输入格式,您随后就要将格式化器传入 JFormattedTextField 构造器中,如下所示:

JFormattedTextField ftf1 = new
   JFormattedTextField(df);

还有其它一些可配置的选项,它们取决于您使用的格式化器。例如:用 MaskFormatter ,您能用 setPlaceholderCharacter(char) 设置占位符字符。另外,对于日期域,如果您将域初始化为某个值使一个用户知道什么样的输入格式是可接受的,这样将会有所帮助。

时间: 2024-12-13 17:28:12

Merlin的魔力: Swing 的新JFormattedTextField组件的相关文章

Merlin的魔力: Swing中的声音

J2SE 版本 1.4 中新增了一项有趣的 Swing 功能.Swing 控件现在可以提供听觉反馈来对特定事件作出响应,不过缺省情况下这项功能是禁用的.新增的这项功能有助于 Swing 控件更好地模仿系统本地操作系统的控件的行为. 听觉基本知识 Swing 使用一种可插式外观和感觉(Pluggable Look-and-Feel,PLAF)体系结构.开发者不必针对不同组件为颜色和字体之类的设置进行硬编码:取而代之的是,组件将从用户界面管理器(User Interface(UI)Manager)请

Merlin的魔力: J2SE 1.4.2提供两种新的外观设计

迄今为止,所有Merlin的魔力专栏都是关于Java 1.4版本的新特性,本文主要针对目前正在测试的1.4.2版本.Sun认为Windows的经典外观已经过时,没有人再使用Motif了 -- 至少在用户桌面上.您将在这一标准Java平台的最新版本中找到新款Windows外观以及称为GTK+的全新外观,当用户使用Windows XP操作系统时新款Windows外观看起来象Windows XP,GTK+使用普通Linux桌面的外观. Swing架构提供可插入外观框架.例如,该框架提供一种标准方法使所

Merlin的魔力: 异常和日志记录

为了理解问题的根源并适当地响应,Merlin 发行版添加了几个与异常处理相关的功能.现在,您不必手工分析堆栈转储信息就可以检查堆栈跟踪信息,并且可以把异常连成一条菊花链,这样就能够在重新抛出异常时附加上异常的原因,这会大大促进调试工作.此外,现在还有一个内建的日志记录工具用来记录消息的不同级别.在 Merlin 的魔力系列的这一部分,John Zukowski 演示了这些新的日志记录和异常功能的工作原理并提供了一个示例程序以供查看和下载. 这个 Merlin 发行版中新添加的许多功能(比如异常处

Merlin的魔力: Merlin的新I/O缓冲区的输入和输出

Java 2 平台标准版(Java 2 Platform Standard Edition,J2SE)1.4 对 Java 平台的 I/O 处理能力做了大量更改.它不仅用流到流的链接方式继续支持以前 J2SE 发行版的基于流的 I/O 操作,而且 Merlin 还添加了新的功能 - 称之为新 I/O 类(NIO),现在这些类位于 java.nio 包中. I/O 执行输入和输出操作,将数据从文件或系统控制台等传送至或传送出应用程序.(有关 Java I/O 的其它信息,请参阅 参考资料). 缓冲

Merlin的魔力: 用新的正则表达式库解析字符序列

解析模式的文本字符串 正则表达式是根据文本匹配模式的方法 ― 类似于编译器生成类文件的工作原理.编译器在源代码中查找各种模式以便将源代码表达式转换为字节码.通过识别这些源代码模式,编译器能够只将有效的源代码表示转换为已编译的类文件. 什么是模式? 在正则表达式的上下文中,模式是字符序列的文本表示法.例如,如果您想知道一个字符序列中是否存在 car这个词,您会使用模式 car,因为这是精确地表示该字符串的方法.对于更复杂的模式,您可以使用特殊字符作为占位符.如果您不是要搜索 car,而是想搜索以字

Merlin的魔力: 长期持久性

Merlin 的一种新功能在 Sun 的 Swing Connection 中以各种形式出现已有一段时间了,实际上它首次被讨论是在 1999 年的 JavaOne 展示会上.这个功能可以将 JavaBean 组件状态长期持久地保存在 XML 文档中.序列化工作适合短期编组的需要(对于 CORBA 和 RMI)或适合将状态信息保存在一个执行的 servlet 中.但是序列化会产生许多问题,包括类库版本或 Java 运行时环境方面的问题.新的 XMLEncoder / XMLDecoder 类允许将

Merlin的魔力: 焦点,焦点,还是焦点

基于Swing的GUI还有一些遗留问题,包括如何管理焦点(哪个组件有接收键盘输入的优先权),如何判断哪个组件拥有焦点,以及如何将焦点从一个组件遍历到下一个组件.由于Swing建立在抽象窗口工具包(AWT)之上,对组件焦点的管理便依赖于AWT中的底层焦点管理.Java平台过去的版本依赖于本地的窗口管理器来协助进行焦点管理,所以尽管有些开发者会认为焦点控制是在他们的应用程序内部进行的,而实际情况并非如此.由于对底层的本地焦点系统的依赖性,因而出现了许多平台不相容的现象. 至于Merlin,它为您提供

Merlin的魔力: 动态事件监听器代理

所有 Swing 组件都是 JavaBeans 组件.它们有一系列的 setter 和 getter 方法,这些方法的类似于 void setXXX(类型名) 和 Type getXXX() .关于这些方法没有什么特别之处,并且正如所预期的,它们遵循 JavaBeans 的属性命名规范.我们今天要讨论的是JavaBeans 组件的一个方面,即一对监听器方法 addXXXListener (XXXListener name) 和 removeXXXListener (XXXListener nam

Swing中为文本组件定制统一的菜单

在很多软件中每个文本组件都有自定义的菜单,这个blogjava的编辑器就有这样的菜单如:Cut , Copy,Paste,Delete,Select All,在Swing中若也想在JTextField,JTextArea,JEditorPane,JTextPane等等这些组件中都提供如此自定义菜单的功能,每个都写继承类?或者加鼠标监听事件?但不管怎样弄都会实现效果,只不过这样动静很大,不好维护,今天在网上看到一个很是方便的方法. 大家都知道,Swing中所有的事件都是进入java.awt.Eve