一。 只能输入数字
二。 控制输入的长度
二。 控制输入的长度
解决方案 »
- x=(y<x++)?1:0
- 我是java新手,在看thinking in java, 有问题请教
- 请问哪位大虾知道这个程序有什么错误,谢谢!
- java集合反射问题(100分)
- java中怎么获取choice中的字符串
- Character类中isUnicodeIdentifierStart()方法有个疑问
- 请教如何实现动态添加组件?
- 如何装设一个timer对象每隔秒变换一个图形依此为空心矩行,实心矩行
- 100分求Together Control Center 6.2的注册机!!Help!!
- 15分翻译解释一句话
- 我想清空jsplitpane右邊的組件,然後加上另外一個,但要保持分割區域不變怎麽做啊
- interface中的方法是如何实现的
<input type = "text" size = "20" maxlength = "20">
其中maxlength属性 是控制输入的最大长度.
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;public class LimitedDocument extends PlainDocument { private int _maxLength = -1; private String _allowCharAsString = null;
public LimitedDocument(){
super();
} public LimitedDocument( int maxLength ){
super();
this._maxLength = maxLength;
} public void insertString( int offset, String str, AttributeSet attrSet)
throws BadLocationException{ if(str == null) {
return;
} if(_allowCharAsString != null && str.length() == 1) {
if(_allowCharAsString.indexOf(str) == -1){
return;
}
} char[] charVal = str.toCharArray();
String strOldValue = getText(0, getLength());
byte[] tmp = strOldValue.getBytes(); if(_maxLength != -1 && (tmp.length + charVal.length > _maxLength)){
return;
} super.insertString(offset, str, attrSet);
} public void setAllowChar(String str) {
_allowCharAsString = str;
}
}使用时: LimitedDocument ld = new LimitedDocument(8);//参数为能输入的最大长度
ld.setAllowChar("0123456789");//只能输入的字符 jTextField.setDocument(ld);//运用到文本框中
import javax.swing.text.*;JTextField jtf=new JTextField();
jtf.setDocument(new NumberDocument(jtf));public class NumberDocument extends PlainDocument {
JTextField jtf=null;
public NumberDocument(JTextField jtf) {
this.jtf=jtf;
}
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
char[] source = str.toCharArray();
char[] result = new char[source.length];
int j = 0;
for (int i = 0; i < result.length; i++) {
if (Character.isDigit(source[i]))//只能输入数字
result[j++] = source[i];
}
if(this.jtf.getText().length()>=20)//限制长度
super.insertString(offs, new String(result, 0, j), a);
}
}
不就行了吗?
newman0708(nch)、 nodreamer(无梦) :
两位,beyond_xiruo(乱谈情) 写得好???
我们来讨论一下,我认为beyond_xiruo(乱谈情) 写得一点都不通用!理由如下:
1。假设我们有两个TextField的,一个限制只能输入8个字符,另一个限制为10个字符,用我的只需再new一个实例,传入相应限制的长度值就可以了。
2。同上,如果一个限制只能输入数字,另一个限制只能输入字母呢?我的同样只需要调用方法setAllowChar("....");把充许输入的值填入即可。
以上两个假设用beyond_xiruo(乱谈情) 写得就不能实现了。PS:我是讨论一下技术问题,没别的意思。:)
//只要重新相应KeyTyped事件就可以了么(sorry,小弟忘了函数名,手头又没有书,用keyTyped代替吧),我觉得这和vc的机制有些相似,可以采用底层的事件解决一些类似的问题
public void keyTyped(KeyEvent e)
{
char ch=getKeyCode();
if(ch<'0' || ch>'9')
e.consume();//该函数会中止该次键盘输入事件
//e.setKeyCode('0');该函数会把非数字输入转换为键入'0' //要限制长度,就要先得到该文本组件
JTextField jtf=(JTextField)e.getSource();
String text=jtf.getText();
if(text.length()>=10) //10就是你想要的长度限制了
e.consume();
}
});
getKeyCode()只能在响应键盘press和release的时候使用,它返回的是虚拟键码,可以得到键盘上的几乎所有键信息,有几个除外,可以参看文档。getKeyChar()函数返回的是键的ascii码,和vc的OnChar(),OnKeyPress(),OnKeyRelease()差不多。
小弟用的同事的机器,没有java编译器,很不方便。
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;/**
*
* @author KUSER
*/
public class Main extends JFrame implements KeyListener { /**
* @param args the command line arguments
*/
private JTextField jtfRull = new JTextField(4); public Main() {
super();
this.setLayout(new BorderLayout());
this.add(jtfRull);
jtfRull.addKeyListener(this);
} public static void main(String[] args) {
// TODO code application logic here
Main frame = new Main(); frame.setVisible(true);
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void keyTyped(KeyEvent e) {
char ch = (char) e.getKeyChar(); if (ch >= '0' && ch <= '9') {
String text = jtfRull.getText();
if (text.length() >= 4) {
e.consume();
}
} else {
e.consume();
}
} public void keyPressed(KeyEvent e) {
} public void keyReleased(KeyEvent e) {
}
}
这是我用上面那位朋友方法写的代码,经测试成功,今天我用了一天的时间找解决这个问题的最后方法。
发现上楼的方法最简单 ,清楚,特此写了测试的代码。