我尝试将其他人制作的自定义PlainDocument组合成我需要的,但由于我不了解PlainDocument的机制,我失败了,但它没有工作。我需要一些东西,以确保我的文本字段只允许2个字母,所以任何a-zA-Z只发生两次。我先试了一下:
public class LetterDocument extends PlainDocument {
private String text = "";
@Override
public void insertString(int offset, String txt, AttributeSet a) {
try {
text = getText(0, getLength());
if ((text + txt).matches("^[a-zA-Z]{2}$")) {
super.insertString(offset, txt, a);
}
} catch (Exception ex) {
Logger.getLogger(LetterDocument.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
这甚至不让我输入任何东西。然后我尝试了这个,我尝试将其他两个线程放在一起,其中一个只允许输入字母,另一个限制字符:
public class LetterDocument extends PlainDocument {
private int limit;
private String text = "";
LetterDocument(int limit) {
super();
this.limit = limit;
}
@Override
public void insertString(int offset, String txt, AttributeSet a)
throws BadLocationException {
if (txt == null)
return;
try {
text = getText(0, getLength());
if (((text + txt).matches("[a-zA-Z]"))
&& (txt.length()) <= limit) {
super.insertString(offset, txt, a);
}
} catch (Exception ex) {
Logger.getLogger(LetterDocument.class.getName()).log(Level.SEVERE,
null, ex);
}
}
}
我不知道出了什么问题。
答案 0 :(得分:2)
不要使用自定义文档。
而是使用DocumentFilter
。阅读Implementing a Document Filter上Swing教程中的部分,了解限制可在文档中输入的字符数的工作示例。
然后添加一些额外的逻辑以确保只添加字母。
或者更简单的选择是使用带有字符掩码的JFormatttedTextField。再次参阅Using a Formatted Text Field上的教程。