java.awt.TextField创建的文本框不够理想,想创建一个新的类。
想要实现的功能:
1、使用该类时,能够自动新建一个TextField。
2、TextField添加键盘事件,随时监听键盘的输入,并对输入进行限制。
代码如下:
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class TextBox extends TextField {
char b, e;
int l;
// 调用该类时,创建一个TextField对象
TextField textbox = new TextField();
// 不带参数的构造方法
TextBox() {
super();
}
// 带参数的构造方法,用于限制输入字符,以及输入长度。
/**
* begin:起始字符, end:结束字符 ,limit:字符串长度
**/
public TextBox(char begin, char end, int limit) {
this.b = begin;
this.e = end;
this.l = limit;
System.out.println("已经进入限制方法!");
textbox.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
// ====限制动作star======================================
char keyLimit = e.getKeyChar();
System.out.println("已经进入键盘事件内部");
// 限制输入
if (keyLimit < begin || keyLimit > end) {
if (keyLimit != '\n')
e.setKeyChar('\0');
}
// 限制字符串长度
String s = textbox.getText();
if (s.length() > limit)
e.consume();
// ====限制动作end=======================================
}
});
}
}
但是,这个方法并不起作用。
控制台显示键盘事件都没有进去过。
什么原因,求解。
------解决思路----------------------
你的思路有问题。要清楚,你应该自定义一个类,这个类继承自TextField,有一些你需要的限制,也就是说,这个类自身就是一个TextField。而不是你调用这个类去生成了一个TextField。
你要的限制功能是什么我不知道,不过,基本思路就是,如果输入不符合要求,就调用KeyEvent的consume()方法。
下面是我写的一个基本的框架。
import java.awt.TextField;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class MyTextField extends TextField implements KeyListener {
private int maxlength;
public MyTextField(int maxlength) {
this.maxlength = maxlength;
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
//这里根据限制要求做判断
if(this.getText().length() == this.maxlength){
//这里应该停止KeyEvent事件的分发,TextField中的内容不再变化
e.consume();
}
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
下面是测试类。
import javax.swing.JFrame;
public class Main extends JFrame {
public static void main(String[] args) {
new Main().setVisible(true);
}
private MyTextField field;
public Main(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400,300);
this.setLayout(null);
//生成一个自定义的TextField
field = new MyTextField(3);
field.setLocation(10, 10);
field.setEditable(true);
field.setSize(100, 30);
this.add(field);
}
}