public class NumberText
extends TextField{
public NumberText() throws HeadlessException {
this.enableEvents(AWTEvent.KEY_EVENT_MASK);
} public void processKeyEvent(KeyEvent e) {
if (e.getKeyCode() < KeyEvent.VK_0 || e.getKeyCode() > KeyEvent.VK_9)
{
//??如何在这里实现代码,使符合条件的字符(非数字)不在输入框中显示出来?
}
}
}
问题如上,就是通过一个继承TextField的类来实现只输入数字,如何在processKeyEvent(KeyEvent e)编写相应的处理代码?
extends TextField{
public NumberText() throws HeadlessException {
this.enableEvents(AWTEvent.KEY_EVENT_MASK);
} public void processKeyEvent(KeyEvent e) {
if (e.getKeyCode() < KeyEvent.VK_0 || e.getKeyCode() > KeyEvent.VK_9)
{
//??如何在这里实现代码,使符合条件的字符(非数字)不在输入框中显示出来?
}
}
}
问题如上,就是通过一个继承TextField的类来实现只输入数字,如何在processKeyEvent(KeyEvent e)编写相应的处理代码?
public NumberField(){
setDocument(new IntegerDocument());
}
//通过Document实现,判断输入的字符都是不是数字
class IntegerDocument extends PlainDocument {
public void insertString(int offset, String s, AttributeSet attributeSet)
throws BadLocationException {
try {
Integer.parseInt(s);
} catch (Exception ex) {
return;
}
super.insertString(offset, s, attributeSet);
}
}
}
public static class FloatJTextField extends JTextField {//可以输入 + - * / 的对话框 public FloatJTextField(int cols) {
super(cols);
this.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) {
selectAll();
} public void focusLost(FocusEvent e) {
}
});
} @Override
protected Document createDefaultModel() {
return new FloatTextDocument();
} private static class FloatTextDocument extends PlainDocument { @Override
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null || str.length() == 0) {
return;
}
boolean point = true;//默认可以加小数点 int oldLength = getText(0, getLength()).length();
str = getText(0, getLength()).substring(0, offs) + str + getText(0, getLength()).substring(offs);
String resultStr = "";
for (int i = 0; i < str.length(); i++) {
if ((str.charAt(i) >= 48 && str.charAt(i) <= 57) || str.charAt(i) == '+' || str.charAt(i) == '-' || str.charAt(i) == '*' || str.charAt(i) == '/' || str.charAt(i) == '.') {
if (i == 0 && (str.charAt(i) == '-' || (str.charAt(i) >= 48 && str.charAt(i) <= 57))) {//第一位是 - 或 数字 resultStr += str.substring(i, i + 1);
}
if (i != 0) {
if (str.charAt(i - 1) < 48 || str.charAt(i - 1) > 57) {
if (str.charAt(i - 1) != '.') {
point = true;
}
if (str.charAt(i) >= 48 && str.charAt(i) <= 57) {
resultStr += str.substring(i, i + 1);
}
}
if (str.charAt(i - 1) >= 48 && str.charAt(i - 1) <= 57) {
if (str.charAt(i) == '.') {
if (point) {
resultStr += str.substring(i, i + 1);
point = false;
}
} else {
resultStr += str.substring(i, i + 1);
}
}
}
}
}
if (resultStr.length() - oldLength > 0) {
resultStr = resultStr.substring(offs, resultStr.length() - oldLength + offs);
// System.out.println(resultStr);
super.insertString(offs, resultStr, a);
}
}
}
}除了数字,还可以输入 + - * / . 你要是不需要你可以去掉,懒得给你去了,你自己可以搞定的!
经过测试我根本就不能调用PalinDocument的insertString(int offs, String str, AttributeSet a)函数,在Java的帮助中说 Serialized objects of this class will not be compatible with future Swing releases. 不知道是不知这个问题引起的又改如何解决呢?
protected void verifyTextHandler(VerifyEvent e){
// 几种情况,输入控制键,输入中文,输入字符,输入数字
// 正整数验证
Pattern pattern = Pattern.compile("[0-9]\\d*");
Matcher matcher = pattern.matcher(e.text);
if (matcher.matches()) // 处理数字
e.doit = true;
else if (e.text.length() > 0) // 有字符情况,包含中文、空格
e.doit = false;
else
// 控制键
e.doit = true;
}
用正则吧!
import java.awt.AWTEvent;
import java.awt.HeadlessException;
import java.awt.TextField;
import java.awt.event.KeyEvent;public class NumberText extends TextField {
public NumberText() throws HeadlessException {
this.enableEvents(AWTEvent.KEY_EVENT_MASK);
} public void processKeyEvent(KeyEvent e) {
if (e.getKeyCode() < KeyEvent.VK_0 || e.getKeyCode() > KeyEvent.VK_9) {
//如果为非数字,把文本框的最后一个字去掉后重新设置文本框不就OK了
this.setText(this.getText().substring(0, this.getText().length()));
}
}
}
public class UpperCaseTextField extends JTextField {
public UpperCaseTextField() {
super();
}
protected Document createDefaultModel() {
return new PlainDocument() {
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
if (str == null || str == "")
return;
String oldString = getText(0, getLength());
String newString = oldString.substring(0, offs) + str + oldString.substring(offs);
//if (newString.length() < 12) {
//super.insertString(offs, str.toUpperCase(), a);
//}
try{
Integer.parseInt(newString);
}catch{
return;
}
super.insertString(offs, str.toUpperCase(), a);
}
};
}
}
与2楼大同小异 你试试
我的super.insertString(offs, str, a); 不能调用!
我建了一个PalinDocument的实例,也不能调用insertString(int offs, String str, AttributeSet a)函数。
不知道我为什么用不了PlainDocument!!!