我在JTextField
上使用DocumentFilter
,用於輸入員工的工作時間。該過濾器將確保輸入的限制僅爲4個字符並且僅允許數字。小數點可以使用也可以不使用,但應該只允許輸入一次,一旦輸入小數點,應該只允許多一個數字。含義9.5或10.5應該被接受,而8.45不被接受。在DocumentFilter中爲JTextField使用正則表達式時遇到問題
到目前爲止,我能夠獲得大約一半的所需功能。不能輸入超過4個字符,只允許輸入數字。後者是使用replaceAll("[^0-9.]", "")
方法完成的。
我花了很多時間看教程,閱讀文檔和相關問題,如this,this,尤其是this,,但似乎無法得到一個正則表達式完全執行。尤其是有一件事比我想不出就是爲什麼[^0-9]
完全是一個正則表達式將成功只允許數字,但^\\d
不會,除非封裝成一個字符類如[\\d]
我的過濾代碼如下:
import java.awt.Toolkit;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class TimeWorkedFilter extends DocumentFilter {
private int maxCharacters;
public TimeWorkedFilter(int maxChars) {
maxCharacters = maxChars;
}
//"[^0-9.]
public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
throws BadLocationException {
if ((fb.getDocument().getLength() + str.length()) <= maxCharacters)
super.insertString(fb, offs, str.replaceAll("[^0-9.]", ""), a);
else
Toolkit.getDefaultToolkit().beep();
}
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
throws BadLocationException {
if ((fb.getDocument().getLength() + str.length()
- length) <= maxCharacters)
super.replace(fb, offs, length, str.replaceAll("[^0-9.]", ""), a);
else
Toolkit.getDefaultToolkit().beep();
}
}
數字過濾器在這裏經常出現 – mKorbel
回答你最後一個問題:'^'在字符類('[]')定義中有特殊含義。否則,它只是意味着「字符串/行的開始」。 – tenub