文字数を制限する今のところ、簡単な方法はないようです。一例として、JTextFieldを継承したクラスを使います。
このコンポーネントのmaxLengthプロパティに文字数の最大数を設定すると制限されます。
PlainDocumentを継承するクラスを用意し、それを、setDocumentを使って設定しても良いと思います。
ただし、バインドを使っていると、この方法では制限できません。その場合、バインドのバリデータを利用します。
public class LimitSizeTextField extends JTextField {
@Override
protected Document createDefaultModel() {
return new LimitDocument();
}
protected class LimitDocument extends PlainDocument{
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
if(str == null){
return ;
}
// IMEの変換中の文字列は、そのままinsertする
if((a != null) && (a.isDefined(StyleConstants.ComposedTextAttribute))){
super.insertString(offs, str, a);
return;
}
if(!canInsertString(str)){
return ;
}
super.insertString(offs, str, a);
}
}
private boolean canInsertString(String str){
if(max == null){
return true;
}
if(max < 0){
return true;
}
if((super.getText().length() + str.length()) > max){
return false;
}
return true;
}
public Integer getMaxLength() {
return max;
}
public void setMaxLength(Integer max) {
this.max = max;
}
protected Integer max = null;
}
IMEを無効にする
enableInputMethods(false)