JTextField を使用して PlainDocument を使用します。JTextArea
例
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
@SuppressWarnings("serial")
public class UserPlainDocument extends PlainDocument {
private final int LIMIT_OF_CHARS;
private final int DATA_TYPE;
private final char[] SKIPPING_CHARS;
public final static int ALL_DATA_TYPES = 1;
public final static int DATA_TYPE_OF_INTEGER = 2;
public final static int DATA_TYPE_OF_DOUBLE = 3;
public UserPlainDocument(int limitOfChars, int dataType) {
if(4 < dataType || 0 > dataType) throw new IllegalArgumentException(
"This dataType value not available " +
"please check the value.");
this.LIMIT_OF_CHARS = limitOfChars;
this.DATA_TYPE = dataType;
this.SKIPPING_CHARS = null;
}
public UserPlainDocument(int limitOfChars, char[] skippingChars) {
this.LIMIT_OF_CHARS = limitOfChars;
this.SKIPPING_CHARS = skippingChars;
this.DATA_TYPE = 0;
}
@Override
public void insertString(int offs, String charAt, AttributeSet set)
throws BadLocationException {
if(offs + charAt.length() <= LIMIT_OF_CHARS)
try {
switch (DATA_TYPE) {
case DATA_TYPE_OF_INTEGER:
Integer.parseInt(charAt);
super.insertString(offs, charAt, set);
break;
case DATA_TYPE_OF_DOUBLE:
if(charAt.equals(".") && getText(0, offs).
indexOf(".") == -1) {
super.insertString(offs, charAt, set);
break;
}
Double.parseDouble(charAt);
super.insertString(offs, charAt, set);
break;
case ALL_DATA_TYPES:
super.insertString(offs, charAt, set);
break;
default:
for (int i = 0; i < SKIPPING_CHARS.length; i++)
if(charAt.equals(String.valueOf(SKIPPING_CHARS[i])))
throw new BadLocationException("", offs);
super.insertString(offs, charAt, set);
break;
}
} catch (NumberFormatException e) {
throw new BadLocationException(e.getMessage(), offs);
}
else
throw new BadLocationException("", offs);
}
}