大概是用的最多的组件的, 限制最大字符数.
不多说了, 一段代码解决他, :)
public
class
MaxLengthField
extends
JTextField
...
{
private int maxLength = -1;
class MaxLengthDocument extends PlainDocument ...{
/** *//**
* (非 Javadoc)
*
* @see javax.swing.text.PlainDocument#insertString(int, java.lang.String,
* javax.swing.text.AttributeSet)
*/
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException ...{
if (str == null || str.length() == 0)
return;
if (maxLength < 0)
super.insertString(offs, str, a);
else ...{
String oldStr = getText(0, getLength());
if (oldStr.getBytes().length + str.getBytes().length > maxLength)
return;
else
super.insertString(offs, str, a);
}
}
}
/** *//**
* (非 Javadoc)
*
* @see javax.swing.JTextArea#createDefaultModel()
*/
@Override
protected Document createDefaultModel() ...{
return new MaxLengthDocument();
}
public MaxLengthField(int maxLength) ...{
setMaxLength(maxLength);
}
public MaxLengthField() ...{
super();
}
/** *//**
* @return Returns the maxLength.
*/
public int getMaxLength() ...{
return this.maxLength;
}
/** *//**
* @param maxLength 要设置的 maxLength。
*/
public void setMaxLength(int maxLength) ...{
this.maxLength = maxLength;
}
}
private int maxLength = -1;
class MaxLengthDocument extends PlainDocument ...{
/** *//**
* (非 Javadoc)
*
* @see javax.swing.text.PlainDocument#insertString(int, java.lang.String,
* javax.swing.text.AttributeSet)
*/
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException ...{
if (str == null || str.length() == 0)
return;
if (maxLength < 0)
super.insertString(offs, str, a);
else ...{
String oldStr = getText(0, getLength());
if (oldStr.getBytes().length + str.getBytes().length > maxLength)
return;
else
super.insertString(offs, str, a);
}
}
}
/** *//**
* (非 Javadoc)
*
* @see javax.swing.JTextArea#createDefaultModel()
*/
@Override
protected Document createDefaultModel() ...{
return new MaxLengthDocument();
}
public MaxLengthField(int maxLength) ...{
setMaxLength(maxLength);
}
public MaxLengthField() ...{
super();
}
/** *//**
* @return Returns the maxLength.
*/
public int getMaxLength() ...{
return this.maxLength;
}
/** *//**
* @param maxLength 要设置的 maxLength。
*/
public void setMaxLength(int maxLength) ...{
this.maxLength = maxLength;
}
}
说白了没什么花头, 就是重写JTextField的Document, 也就是JTextField之MVC的Model部分. 至于蓝色代码部分, 是因为有中文字存在, 中文字是算2个长度的. 当然这和你数据库有关(大多数数据最后是要存放到数据库中, 数据库中中文字算几个字符还很难说, 我这里对应的是GB的数据库, 算2个字符. 如果你是U8的数据库, 我也不知道算几个, 据猜测:有时3位, 有时4位, -_-;;;)
就此打住, 今天先发一个easy的, 改天再发.