使 JTextField 接受混合字符串,而 documentFIlter 只允许数字
Making JTextField accept mixed String , whet documentFIlter alow only digits
我有一个不寻常的问题,有些东西运行得不太好。我写了一个 DocumentFilter
只允许用户输入数字,DocumentFilter
在写作过程中在适当的地方自己添加破折号。这样 JTextField
中的可见日期如下:“2016-05-01”。问题是 JTextField
并不总是由用户填写,有时必须由程序设置。但是当我使用代码 setText("2016-05-01") 时,它显示不正确,所有破折号都消失了。如何让它发挥作用?
我试图更改 DocumentFilter
以允许破折号,但这为什么会在许多其他地方引起问题。我可能最终会为此写另一个 DocumentFilter
但也许还有其他方法?是否可以通过 char 附加 JTextField
char ?有没有办法让 s 关闭 DocumentFilter
,或者它可以巧妙地改变 DocumentFilter
,这样它就不会在其他地方崩溃并在这里工作?下面是 DocumentFilter
的部分代码
public void replace(FilterBypass fb, int offs, int length, String str,
AttributeSet a) throws BadLocationException {
if (str == null || str.equals(""))
{
super.replace(fb, offs, length, str, a);
}
else
{
StringBuffer buffer = new StringBuffer(str);
for (int i = buffer.length() - 1; i >= 0; i--)
{
char ch = buffer.charAt(i);
if (!Character.isDigit(ch))
{
buffer.deleteCharAt(i);
}
}
str = buffer.toString();
//sign and sign2 is char number were separator(sep) is written
if (fb.getDocument().getLength() + str.length() == sign)
{
str = str + sep;
}
if (fb.getDocument().getLength() + str.length() == sign2)
{
str = str + sep;
}
if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters)
super.replace(fb, offs, length, str, a);
else
Toolkit.getDefaultToolkit().beep();
}
你可以这样做:
@Override
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {
if (str == null || str.equals("")) {
super.replace(fb, offs, length, str, a);
} else {
// check if 'str' contains 8 digits
if (str.matches("^\d{8}$")) {
// add the dashes
super.replace(fb, offs, length, str.replaceAll("(\d{4})(\d{2})(\d{2})", "--"), a);
} else {
StringBuffer buffer = new StringBuffer(str);
for (int i = buffer.length() - 1; i >= 0; i--) {
char ch = buffer.charAt(i);
if (!Character.isDigit(ch)) {
buffer.deleteCharAt(i);
}
}
str = buffer.toString();
// sign and sign2 is char number were separator(sep) is written
if (fb.getDocument().getLength() + str.length() == sign) {
str = str + sep;
}
if (fb.getDocument().getLength() + str.length() == sign2) {
str = str + sep;
}
if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters)
super.replace(fb, offs, length, str, a);
else
Toolkit.getDefaultToolkit().beep();
}
}
}
并使用此设置文本:
textField.setText("20160420");
我有一个不寻常的问题,有些东西运行得不太好。我写了一个 DocumentFilter
只允许用户输入数字,DocumentFilter
在写作过程中在适当的地方自己添加破折号。这样 JTextField
中的可见日期如下:“2016-05-01”。问题是 JTextField
并不总是由用户填写,有时必须由程序设置。但是当我使用代码 setText("2016-05-01") 时,它显示不正确,所有破折号都消失了。如何让它发挥作用?
我试图更改 DocumentFilter
以允许破折号,但这为什么会在许多其他地方引起问题。我可能最终会为此写另一个 DocumentFilter
但也许还有其他方法?是否可以通过 char 附加 JTextField
char ?有没有办法让 s 关闭 DocumentFilter
,或者它可以巧妙地改变 DocumentFilter
,这样它就不会在其他地方崩溃并在这里工作?下面是 DocumentFilter
public void replace(FilterBypass fb, int offs, int length, String str,
AttributeSet a) throws BadLocationException {
if (str == null || str.equals(""))
{
super.replace(fb, offs, length, str, a);
}
else
{
StringBuffer buffer = new StringBuffer(str);
for (int i = buffer.length() - 1; i >= 0; i--)
{
char ch = buffer.charAt(i);
if (!Character.isDigit(ch))
{
buffer.deleteCharAt(i);
}
}
str = buffer.toString();
//sign and sign2 is char number were separator(sep) is written
if (fb.getDocument().getLength() + str.length() == sign)
{
str = str + sep;
}
if (fb.getDocument().getLength() + str.length() == sign2)
{
str = str + sep;
}
if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters)
super.replace(fb, offs, length, str, a);
else
Toolkit.getDefaultToolkit().beep();
}
你可以这样做:
@Override
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {
if (str == null || str.equals("")) {
super.replace(fb, offs, length, str, a);
} else {
// check if 'str' contains 8 digits
if (str.matches("^\d{8}$")) {
// add the dashes
super.replace(fb, offs, length, str.replaceAll("(\d{4})(\d{2})(\d{2})", "--"), a);
} else {
StringBuffer buffer = new StringBuffer(str);
for (int i = buffer.length() - 1; i >= 0; i--) {
char ch = buffer.charAt(i);
if (!Character.isDigit(ch)) {
buffer.deleteCharAt(i);
}
}
str = buffer.toString();
// sign and sign2 is char number were separator(sep) is written
if (fb.getDocument().getLength() + str.length() == sign) {
str = str + sep;
}
if (fb.getDocument().getLength() + str.length() == sign2) {
str = str + sep;
}
if ((fb.getDocument().getLength() + str.length() - length) <= maxCharacters)
super.replace(fb, offs, length, str, a);
else
Toolkit.getDefaultToolkit().beep();
}
}
}
并使用此设置文本:
textField.setText("20160420");