import javax.swing.JTextField;
import javax.swing.event.CaretListener;
import javax.swing.event.CaretEvent;
import javax.swing.JOptionPane;
public class NumJTextField extends JTextField
{
static final long serialVersionUID = 1L;
private JTextField objNTF = this;
private int min = 0, max =0;
NumJTextField(int minValue,int maxValue)
{
super();
min = minValue;
max = maxValue;
this.addCaretListener(new CaretListener()
{
public void caretUpdate(CaretEvent e)
{
try
{
int value = Integer.parseInt(objNTF.getText());
if (value > min && value < max)
{
//-----DONOTHING-----
} else
{
System.out
.println("input must between "
+ min
+ " ~ "
+ max);
JOptionPane.showMessageDialog(null, "输入必须在" + min + "~" + max +"之间", "超出范围", JOptionPane.ERROR_MESSAGE);
}
} catch (Throwable ex)
{
System.out.println("need input integer value");
JOptionPane.showMessageDialog(null, "请输入整数!", "输入非法", JOptionPane.ERROR_MESSAGE);
}
}
});
}
}
//以后想用到只能输入数字的JTextField的话,就JTextFiled compName = new NumJTextField(minValue,maxValue),就可以了。
//但还有些问题,需要改进,如果输入非法虽然有提示,但是这时非法的字符已经留在你的NumJTextField部件上了。所以最好改成先保留上次输入结果,如果这次的输入非法,则恢复回去。这个我再改进。
//上面这个方法比较笨,后面又发现一个更好的方法。
public class NumField extends JTextField
{
public NumField(String cols)
{
super(cols);
}
protected Document createDefaultModel()
{
return new NumDocument();
}
static class NumDocument extends PlainDocument
{
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException
{
if (str == null)
{
return;
}
char[] upper = str.toCharArray();
for (int i = 0; i < upper.length; i++)
{
if (!Character.isDigit(upper[i]))
str = str.substring(0, i);
}
super.insertString(offs, str , a);
}
}
}