2012-08-07 52 views
3

\下面是JTextField的創作:DocumentFilter只允許將數字和句點(。)轉換爲JTextField?

hourlyWageInput = new JTextField("7.25"); 
DocumentFilter filter = new UppercaseDocumentFilter(); 
((AbstractDocument) hourlyWageInput.getDocument()).setDocumentFilter(filter); 
hourlyWageInput.setHorizontalAlignment(JTextField.CENTER); 
add(hourlyWageInput); 

這裏是我的DocumentFilter:

import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class UppercaseDocumentFilter extends DocumentFilter { 

public void replace(DocumentFilter.FilterBypass fb, int offset, int length, 
     String text, javax.swing.text.AttributeSet attr) 

     throws BadLocationException { 
      fb.insertString(offset, text.replaceAll("\\D", ""), attr); 
} 
} 

這種自動刪除JTextField中的所有字母和字符。

但是,我想知道是否有人知道一個地方的所有命令類似於「\ D」。我花了一段時間才找到正確的信息。

此外,我現在的代碼也可以防止。從我在與雙打工作時需要的類型中選擇。有任何想法嗎?

謝謝!今天我學到了多少東西,真是太神奇了。我一直在編碼13個小時。

+2

關於正則表達式的Google教程。一個出發點:[Oracle正則表達式教程](http://docs.oracle.com/javase/tutorial/essential/regex/)。我的最愛:[正則表達式教程](http://www.regular-expressions.info/tutorial.html)。從一開始就開始,因爲它是非常強烈的東西。 – 2012-08-07 03:09:07

+0

這是你在那裏的一些時髦的代碼。通常你應該調用'FilterBypass'中的匹配方法,並且你可能也想重載'insertString'。 – 2012-08-07 04:52:10

+0

@David Tunnell非常感謝這個話題 – Abdul 2014-03-17 22:23:25

回答

7

replaceAll函數採用正則表達式。您可以在線學習一些關於正則表達式的許多教程(請參閱@Hovercraft Full Of Eels評論)或直接從Java api學習:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

基本上,您可以將任何正則表達式結構(列在上述鏈接中)一起形成一個正則表達式。如果你想確保只有0-9和。是可以的,你可以使用:

text.replaceAll("[^0-9.]", "") 
+0

也許帶着負面的唱歌 – mKorbel 2012-08-07 06:41:07

+0

我會閱讀教程。感謝程序正在運行的所有信息。 – 2012-08-07 13:12:04

+0

對於類似問題,我無法實現可靠的'DocumentFilter'解決方案。我需要輸入來跟隨一個正則表達式,但使用'replaceAll()'或類似的(使用'Matcher'來累積匹配並移除不匹配)是痛苦不可靠的。 ---例如,只要用戶在「TextComponent」中輸入第二個「。」,該答案的解決方案就會非常糟糕,因爲它會破壞小數點一致性。 – XenoRo 2012-11-29 15:26:31

相關問題