入力として正の整数のみを受け入れる 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);
}