學習用最少的工作量達到格式化文本輸入目的
作者:John Zukowski 翻譯:Sean 利用輸入驗證和焦點監(jiān)聽接收格式化輸入不會很困難,。在這篇文章里,John向大家展示了如何用JFormattedTextField 組件提示輸入數(shù)字,,日期以及格式化的輸入信 J2SE 1.4版本里面,,加入了兩個新的Swing組件:JSpinner和JFormattedTextField,。我們在Merlin的魔術(shù)專欄的開始已經(jīng)介紹了JSpinner組件,現(xiàn)在我們來了解一下JFormattedTextField,。 盡管JFormattedTextField組件的外表跟JTextField看上去是一樣的,,但它們的行為卻是完全不同。最簡單的情況下,,你可以給出一個電話號碼的掩碼輸入\"(###) ###-####\",,JFormattedTextField不會接受任何不符合這樣格式的輸入。復雜點的情況是有一個顯示格式和一個輸入格式,。舉個例子來說,,默認的日期輸入格式允許有效的月份或者日期編輯情況下在光標的位置滾動。 JFormattedTextField可以接收的輸入一是被mask顯式定義好了,,二則是被組件的某一個值所指定了,。基于后一種情況下,,組件用了Factory設計模式來為這個指定的值找到默認的formatter,。DefaultFormatterFactory組件產(chǎn)生提前內(nèi)置了的日期格式,數(shù)字格式,,java.text.Format的子類,,以及任何包羅萬象的格式化器。 下面讓我們來看看如何讓這個組件工作起來,。 配置可接收的輸入 最經(jīng)常地,,我們用一個MaskFormatter實例來掩碼輸入。MaskFormatter類在javax.swing.text包中,,用一系列字母來指定可輸入的范圍,。這一系列八個字符每一個都代表了輸入的一個字符,正如下面的列表:# 一個數(shù)字 一個字母 A 一個數(shù)字或者字母 * 任何字符 U 一個字母,,小寫字母被轉(zhuǎn)換到相等的大寫字母 L 一個字母,,大寫字母被轉(zhuǎn)換到相等的小子字母 H 一個十六進制數(shù)字(A-F, a-f, 0-9) \' 轉(zhuǎn)義字符 除了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類的構(gòu)造器,,如下示例: JFormattedTextField ftf1 = new JFormattedTextField(df); 除了依賴于所使用的formatter,,還有其他一些配置可選。例如,,使用了MaskFormatter,,你可以用setPlaceholderCharacter(char)方法設置placeholder字符。同樣,日期輸入框的話,,它可以為你輸入框初始化一個值,,使得用戶知道輸入的格式。 總結(jié) 所有一切只是創(chuàng)建一個掩碼的輸入框,。下面程序為你給出了一個完全的例子,,該例子通過結(jié)合前面的代碼片斷檢驗了這個新的格式化輸入能力。下面的圖片則顯示了外觀,。任意調(diào)整mask來檢測一下其他掩碼輸入,。 代碼: 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(); } } 章轉(zhuǎn)載自網(wǎng)管之家:http://www./plus/view.php?aid=23972 |
|