JFormattedTextField组件和格式化输入

原创 2002年07月03日 10:13:00

学习用最少的工作量达到格式化文本输入目的
作者:John Zukowski  翻译:Sean
2002.6.

利用输入验证和焦点监听接收格式化输入不会很困难。在这篇文章里,John向大家展示了如何用JFormattedTextField 组件提示输入数字,日期以及格式化的输入信息。

J2SE 1.4版本里面,加入了两个新的Swing组件:JSpinner和JFormattedTextField。我们在Merlin的魔术专栏的开始已经介绍了JSpinner组件,现在我们来了解一下JFormattedTextField。

尽管JFormattedTextField组件的外表跟JTextField看上去是一样的,但它们的行为却是完全不同。最简单的情况下,你可以给出一个电话号码的输入掩码"(###) ###-####",JFormattedTextField不会接受任何不符合这样格式的输入。复杂点的情况是有一个显示格式和一个输入格式。举个例子来说,默认的日期输入格式允许有效的月份或者日期编辑情况下在光标的位置滚动。

JFormattedTextField可以接收的输入一是被mask显式定义好了,二则是被组件的某一个值所指定了。基于后一种情况下,组件用了Factory设计模式来为这个指定的值找到默认的formatter。DefaultFormatterFactory组件产生提前内置了的日期格式,数字格式,java.text.Format的子类,以及任何包罗万象的格式化器。

下面让我们来看看如何让这个组件工作起来。

配置可接收的输入
最经常地,我们用一个MaskFormatter实例来实现掩码输入。MaskFormatter类在javax.swing.text包中,用一系列字母来指定可输入的范围。这一系列八个字符每一个都代表了输入的一个字符,正如下面的列表:

# 一个数字                                                                                 
? 一个字母
A 一个数字或者字母
* 任何字符
U 一个字母,小写字母被转换到相应的大写字母
L 一个字母,大写字母被转换到相应的小子字母
H 一个十六进制数字(A-F, a-f, 0-9)
' 转义字符

除了MaskFormatter以外,你也可以使用DateFormat和NumberFormat类来指定输入格式。下表显示了一些可能的格式。

// 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("(###) ###-####");


一旦你确定了输入格式,就可以传递formatter到JFormattedTextField类的构造器,如下示例:
JFormattedTextField ftf1 = new JFormattedTextField(df);
除了依赖于所使用的formatter,还有其他一些配置可选。例如,使用了MaskFormatter,你可以用setPlaceholderCharacter(char)方法设置placeholder字符。同样,日期输入框的话,它可以为你输入框初始化一个值,使得用户知道输入的格式。

总结
所有一切只是创建一个掩码的输入框。下面程序为你给出了一个完全的例子,该例子通过结合前面的代码片断检验了这个新的格式化输入能力。下面的图片则显示了外观。任意调整formatter来检测一下其他输入掩码。
代码:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
import java.util.*;
import java.text.*;

public class FormattedSample {
  public static void main (String args[]) throws ParseException {
    JFrame f = new JFrame("JFormattedTextField Sample");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container content = f.getContentPane();
    content.setLayout(new BoxLayout(content, BoxLayout.PAGE_AXIS));
    // 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);
    JFormattedTextField ftf1 = new
      JFormattedTextField(df);
    ftf1.setValue(new Date());
    content.add(ftf1);
    // US Social Security number
    MaskFormatter mf1 =
      new MaskFormatter("###-##-####");
    mf1.setPlaceholderCharacter('_');
    JFormattedTextField ftf2 = new
      JFormattedTextField(mf1);
    content.add(ftf2);
    // US telephone number
    MaskFormatter mf2 =
      new MaskFormatter("(###) ###-####");
    JFormattedTextField ftf3 = new
      JFormattedTextField(mf2);
    content.add(ftf3);
    f.setSize(300, 100);
    f.show();
  }
}

(转)JFormattedTextField和格式化输入

利用输入验证和焦点监听接收格式化输入不会很困难。在这篇文章里,John向大家展示了如何用JFormattedTextField 组件提示输入数字,日期以及格式化的输入信息。        J2SE 1...
  • Trace_2011
  • Trace_2011
  • 2014年10月31日 19:47
  • 351

字符数据的非格式化输入及输出

 1. 字符数据的非格式化输入 (1) getchar函数 int getchar() // stdio.h 功能:读取用户的按键信息,返回值是用户所键入的ASCII码。 该函数没有参数...
  • gerryzhu
  • gerryzhu
  • 2014年12月05日 17:14
  • 1008

sscanf()--字符串格式化输入

sscanf() 的作用:从一个字符串中读进与指定格式相符的数据. 原型: int sscanf (const char str,const char format,……..); 说明: ssc...
  • gao1440156051
  • gao1440156051
  • 2015年09月06日 21:56
  • 1234

C和C++格式化输入输出

转自:http://blog.163.com/xuanmingzhiyou@yeah/blog/static/14247767620119291152255/ 一、printf()函数 print...
  • qq_30490125
  • qq_30490125
  • 2015年08月13日 18:35
  • 1953

格式化输入与输出

在c语言的学习中,永远少不了两个函数,那就是scanf 和 printf 函数。 scanf 其功能是按指定的格式从键盘读入数据,存入地址表指定存储单元中,并按回车键结束。 其格式为:scanf(“格...
  • Mormont
  • Mormont
  • 2016年11月07日 15:08
  • 552

Python 关于输入输出及格式化数据

有几种方式来呈现程序的输出,数据可以以人类可读的形式打印,或者写到文件里面将来使用。本章我们将讨论这些可能性。 7.1 输出格式 到目前为止,我们遇到了两种方式来写值,表达式语句和print()函...
  • sjiammm
  • sjiammm
  • 2014年10月21日 11:22
  • 2390

一些 Java 格式化输入输出笔记

Java 中常用格式化字符串输出的一些心得
  • shiyuan0
  • shiyuan0
  • 2016年03月17日 17:14
  • 1779

C语言格式化输入输出

来源地址:http://blog.csdn.net/zhangmh93425/article/details/44496559   printf: 格式字符串的一般形式:[标志][输出最小宽度]...
  • llwwlql
  • llwwlql
  • 2015年11月12日 20:12
  • 2607

C++输入输出流之格式化I/O

ios类成员主要通过对状态标志、输出宽度,填充字符,输出精度的操作来完成对I/O的格式化。 ios状态标志: skipws跳过输入中的空白符, left输出左对齐,right,internal符号左对...
  • u010396104
  • u010396104
  • 2015年04月10日 08:42
  • 674

字符串和格式化输入/输出

字符串就是一个或多个字符的序列。双引号不是字符串的一部分,它们只是通知编译器其中包含了一个字符串。 C没有为字符串定义专门的变量类型,而是把它存储在char数组中。 字符串中的字符存放在相邻的存储单元...
  • Burgdan
  • Burgdan
  • 2016年08月27日 01:33
  • 727
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JFormattedTextField组件和格式化输入
举报原因:
原因补充:

(最多只允许输入30个字)