我对 Java 和 stackoverflow 还很陌生。 如果我犯了错误或者我提供的信息不足,请提醒我。
我正在开发一个 Java Swing 项目,并尝试使用自定义 DocumentFilter 类来监视和过滤 JTextField 中的输入。具体来说,我想确保只能输入三位数字和某些特殊字符(-、逗号)。
这是我写的课程:
import javax.swing.*;
import javax.swing.text.*;
public class NumberOnlyField extends JTextField {
public NumberOnlyField() {
PlainDocument doc = (PlainDocument) getDocument();
doc.setDocumentFilter(new NumberOnlyFilter());
}
private class NumberOnlyFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
throws BadLocationException {
if (string == null) {
return;
}
super.insertString(fb, offset, onlynumbers(string), attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
throws BadLocationException {
if (text == null) {
return;
}
super.replace(fb, offset, length, onlynumbers(text), attrs);
}
}
private String onlynumbers(String string) {
StringBuilder builder = new StringBuilder(string);
for (int i = builder.length() - 1; i >= 0; i--) {
char ch = builder.charAt(i);
if ((!Character.isDigit(ch) && ch != '-' && ch != ',') || i > 3) {
builder.deleteCharAt(i);
}
}
return string;
}
}
这里使用TextField:
JTextField minRain = new NumberOnlyField();
minRain.setBounds(155, 130, 35, 20);
add(minRain);
minRain.setColumns(10);
过滤器根本不起作用。文本字段正常显示,没有发生错误,我可以在其中写入任何内容。鉴于其简单的性质,我正在努力找出我可能做错了什么。
A
DocumentFilter
当然是一种方法,但如果您擅长切换装置,那么仅使用 DocumentListener
可能会更容易。这样工作量就少了。
这是一个快速、简单的示例。
final JTextField textField = new JTextField();
final DocumentListener listener =
new DocumentListener()
{
public void insertUpdate(final DocumentEvent event)
{
yourValidationMethod(event);
}
public void changedUpdate(final DocumentEvent event) {}
public void removeUpdate(final DocumentEvent event)
{
yourValidationMethod(event);
}
private void yourValidationMethod(final DocumentEvent event)
{
final String string = event.getDocument().getText(0, event.getDocument().getLength());
//do validations on this string
}
};
textField.getDocument().addDocumentListener(listener);
我还看到您正在尝试编辑文本。通常情况下,人们只是提出一些警告,指出文本不好,但这没关系。在这里也很容易做到。只需使用
Document#remove(int offset, int length)
。因此,如果有人输入 1
,然后输入 2
,然后输入 f
,您只需得到偏移量,即文档中最后一个字符的索引,然后得到长度,即1,既然你只想删除最后一个字符,那么将这 2 个插入到方法中,就可以了。