程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Merlin的魔力: Swing 的新JFormattedTextField組件

Merlin的魔力: Swing 的新JFormattedTextField組件

編輯:關於JAVA

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) 設置占位符字符。另外,對於日期域,如果您將域初始化為某個值使一個用戶知道什麼樣的輸入格式是可接受的,這樣將會有所幫助。

全部組合在一起

創建屏蔽輸入域的一切都已就緒。清單 2 通過把以前的代碼片斷組合在一起,為您提供了一個用於檢驗新性能的完整示例。圖 1 展示了這個示例的顯示。隨便調整各個掩碼來檢驗其他的掩碼字符。

圖 1. 活動中的 JFormattedTextField

清單 2. JFormattedTextField 示例

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();
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved