简单写了一个只能输入数字的JTextField

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); } } }

经验分享 程序员 微信小程序 职场和发展