我需要一个只接受正整数作为输入的 JTextField。我的实现大部分都有效。当您在字段中键入文本时,会出现数字,而不会出现非数字。
但是构造函数的“文本”参数存在问题。如果我传递一个包含正整数的字符串表示形式的字符串,我希望文本字段开始时包含该字段,但文本字段开始时为空白。例如,这样做会导致它出现我所描述的症状: new NumericTextField("1", 5);
在初始化期间不调用重写的 insertString 方法。
我做错了什么,我该如何解决?这是代码...
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
/**
* A JTextField that only accepts characters that are digits. Also, the first character can't be "0".
*/
public class NumericTextField extends JTextField {
public class CustomFilterDocument extends PlainDocument {
public void insertString(int offset, String text, AttributeSet aset) throws BadLocationException {
if (isLegalValue(text)) {
super.insertString(offset, text, aset);
}
}
}
private static boolean isLegalValue(String text) {
if (text == null) {
return false;
}
int len = text.length();
for (int i = 0; i < len; i++) {
char c = text.charAt(i);
if (!Character.isDigit(c) || (i ==0 && c == '0')) {
return false;
}
}
return true;
}
public NumericTextField() {
super();
setDocument(new CustomFilterDocument());
}
public NumericTextField(int columns) {
super(columns);
setDocument(new CustomFilterDocument());
}
public NumericTextField(String text) {
super(text);
setDocument(new CustomFilterDocument());
}
public NumericTextField(String text, int columns) {
super(text, columns);
setDocument(new CustomFilterDocument());
}
}
固定版本(使用我从回复中学到的)如下所示:
public NumericTextField(String text) {
super(text);
initText(text);
}
public NumericTextField(String text, int columns) {
super(text, columns);
initText(text);
}
private void initText(String text) {
Document doc = new CustomFilterDocument();
try {
doc.insertString(0, text, null);
} catch (BadLocationException ble) {
}
setDocument(doc);
}