菜鸟提问,请指教!

lytyphoon1010 2010-01-15 04:03:18
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class form extends JFrame{
JButton b[];
JButton dot;
JTextField txf;
JPanel jp,jp1;
boolean start;
double first,second;
form(){
start=true;
super.setTitle("test");
jp=new JPanel(new BorderLayout());
jp1=new JPanel(new GridLayout(3,3));
this.setContentPane(jp);
txf=new JTextField(10);
txf.setText("0");


jp.add(txf,"North");
jp.add(jp1,"Center");
dot=new JButton(".");
jp1.add(dot);
ActionListener ac=new click();
b=new JButton[10];
for(int i=0;i<10;i++){
b[i]=new JButton(Integer.toString(i));
b[i].addActionListener(ac);
jp1.add(b[i]);

}

dot.addActionListener(ac);
KeyListener kl=new keyenter();
txf.addKeyListener(kl);
this.pack();
}
public static void main(String[] args){
form my=new form();
my.setVisible(true);
my.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}


class click extends KeyAdapter implements ActionListener{
public void actionPerformed(ActionEvent e){
Object event=e.getSource();
String str=txf.getText();
//判断开始
if(start){
//如果输入为"."
if(event==dot){
txf.setText(str+".");
}
else
for(int i=0;i<10;i++){
if(event==b[i])
txf.setText(Integer.toString(i));
first=i;
}
start=false;
}
//判断不为开始
else {
//如果第一位不为0
if(str.charAt(0)!=0){
//当输入为数字
for(int i=0;i<10;i++){
if(event==b[i]){
txf.setText(str+Integer.toString(i));
}
}
//如果输入为"."且str中不包含"." 则str中追加.
if(event==dot && str.indexOf(".")==-1){
txf.setText(str+".");
}
//如果输入为"."且str中包含"."则str不变
else if(event==dot && str.indexOf(".")!=-1){
txf.setText(str);
}
}
//如果第一位为0
else{
//当输入为"."且str中不包含"."则str中追加.
if(event==dot && str.indexOf(".")==-1){
txf.setText(str+".");
}
//当输入为"."且str中包含"."则str不变
else if(event==dot && str.indexOf(".")!=-1){
txf.setText(str);
}
for(int i=0;i<10;i++){
//如果输入为数字,且str不包含"."则str变为输入数字
if(event==b[i] && str.indexOf(".")==-1){
txf.setText(Integer.toString(i));
}
//如果输入为数字,切str不包含"."则str追加输入数字
else if(event==b[i] && str.indexOf(".")!=-1){
txf.setText(str+Integer.toString(i));
}
}
}

}

}
}

class keyenter extends KeyAdapter{
public void KeyPressed(KeyEvent e){
if(e.getKeyChar()=='H')
txf.setText("H");
System.out.println(e.getKeyChar());
}
}
}


在上面的代码里,最后的keyenter类似乎没有工作?,我希望在JTextField中当按下按键H的时候可以把里面的内容置为H,但没有成功,问题出在什么地方了?请各位高手赐教!
...全文
120 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
duchq044 2010-01-15
  • 打赏
  • 举报
回复
手一抖能拌出一个class来,楼上才是真正的高手
Tassdars 2010-01-15
  • 打赏
  • 举报
回复
呃,手一抖,多整了一个class,汗,楼主见谅……
Tassdars 2010-01-15
  • 打赏
  • 举报
回复

class HDocument extends PlainDocument {
class HDocument extends PlainDocument {
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
if (!str.equalsIgnoreCase("H")) {
super.insertString(offs, str, a);
}
}
}
}


然后调用文本框的setDocument方法设置进去就行了,不过这个写得比较简略。
Tassdars 2010-01-15
  • 打赏
  • 举报
回复
首先提醒楼主的是不应该用if(e.getKeyCode()=='H')来判断是否按下'H',而应该用if(e.getKeyCode()==KeyEvent.VK_H)来判断。

另外,出现Hh是因为你在按下'H'键以后,触发了keyPressed事件,此时将文本框设为'H',然后再响应你键盘的按键,在文本框中输入了'h',因为你没有阻止这个事件的发生,如果要阻止的话,比较简单的方法是写一个类继承PlainDocument,重写里面的insertString方法,然后调用文本框的setDocument方法设置进去。
lytyphoon1010 2010-01-15
  • 打赏
  • 举报
回复
还有,一个问题,就是当我按下H键后,txf内容被置为H后为什么在后面还会带有一个h,输出在txf的内容是:Hh
lytyphoon1010 2010-01-15
  • 打赏
  • 举报
回复
刚刚变更内容为
class keyenter extends KeyAdapter{
public void keyPressed(KeyEvent e){
if(e.getKeyCode()=='H')
txf.setText("H");
System.out.println(e.getKeyChar());
}

就可以。我看到提示里写的getKeyCode这个方法是int型啊。。。难道是等号右端‘H’字符做了转换?
为什么getKeyChar不成功呢?
lytyphoon1010 2010-01-15
  • 打赏
  • 举报
回复
爆汗。。。
但是我更正后,发现,
class keyenter extends KeyAdapter{
public void keyPressed(KeyEvent e){
if(e.getKeyChar()=='H')
txf.setText("H");
System.out.println(e.getKeyChar());
}

其中仍然不能设置txf中的内容,但是命令行输出e.getKeyChar()倒是有的。
zhuyouyong 2010-01-15
  • 打赏
  • 举报
回复
一楼正确
Tassdars 2010-01-15
  • 打赏
  • 举报
回复
public void KeyPressed(KeyEvent e)

兄台,你尴尬了,把KeyPressed写成keyPressed就行了……

如果JDK1.5以上,建议方法上加一个@Override的注记,写了以后如果不是重写的话,通不过编译的,可以把逻辑问题转到编译阶段发现。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧