关于如何实现JAVA计算器的键盘事件,请教高手,高分!

这是我编得一个计算器,各键功能都正常,可用鼠标进行操作,但键盘事件没有响应!希望有高手能在我的代码的基础修改一下,使键盘事件起作用,高分求救!好的话还会有加分!粘贴党请自觉!!代码分两个部分:
calculator:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;

public class calculator {
private String result="0";
private int op=0,add=1,sub = 2,mul = 3,div = 4,sqrt=5,ce=6,zf=7,back=8;
;
JTextField text;
private double stringToDouble(String x){
double y=Double.parseDouble(x);
return y;
}
public void operate(String x){
double x1=stringToDouble(x);
double y=stringToDouble(result);
switch(op){
case 0:
result=x;
break;
case 1:
result=String.valueOf(y+x1);
break;
case 2:
result=String.valueOf(y-x1);
break;
case 3:
result=String.valueOf(y*x1);
break;
case 4:
if(x1!=0){
result=String.valueOf(y/x1);
}else{result="Can't be Divided by zero!";}
break;
case 5:
if(y<0){
result="负数不能开根号";
}else{result=String.valueOf(Math.sqrt(y
));
}
break;
case 6:
result=String.valueOf(0/y);
break;
case 7:
result=String.valueOf(-y);
break;
case 8:

result=String.valueOf(backspace((String)x));
}
}
public String backspace(String y){
String reResult="0";
try
{
reResult=y.substring(0,y.length()-1); //从第一个开始取前n-1个
Double.parseDouble(reResult); //将其转化为Double型
}
catch(NumberFormatException e)
{
reResult="0";}
return reResult ;
}
public String opAdd(String x){
operate(x);
op=add;
return result;
}
public String opSub(String x){
operate(x);
op=sub;
return result;
}
public String opmul(String x){
operate(x);
op=mul;
return result;
}
public String opdiv(String x){
operate(x);
op=div;
return result;
}
public String opce(String x){
operate(x);
op=ce;
return opEquals(result);

}
public String opsqrt(String x){
operate(x);
op=sqrt;
return opEquals(result);
}
public String opzf(String x){
operate(x);
op=7;
return opEquals(result);
}
public String opbac(String x){
operate(x);
op=8;
return opEquals(result);
}
public String opEquals(String x){
operate(x);
op=0;
return result;
}

public void opClean(){
op=0;
result="0";
}

}
键盘主要是可以把数字和运算符输进去,但按回车或“=”无法计算出答案啊
具体怎么改啊,能详细的改一下嘛,谢谢

额,一直更新不了,很奇怪.待会再发过...
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;

public class CalculatorGUI {
private Frame f;

private Panel p1, p2;

private JButton b0, b1, b2, b3, b4, b5, b6, b7, b8, b9;

private JButton bPoint, bAdd, bDec, bMul, bDiv, bCal, Bbac, Bce, Bsqr, BZF;

private TextField tf;

private String s, op;

private Calculator cal = new Calculator();

private boolean ifOp;

private float Num, Num1, Num2;

public CalculatorGUI() {
f = new Frame("A Calculator");
p1 = new Panel();
p2 = new Panel();

b0 = new JButton("0");
b1 = new JButton("1");
b2 = new JButton("2");
b3 = new JButton("3");
b4 = new JButton("4");
b5 = new JButton("5");
b6 = new JButton("6");
b7 = new JButton("7");
b8 = new JButton("8");
b9 = new JButton("9");
bPoint = new JButton(".");
bAdd = new JButton("+");
bDec = new JButton("-");
bMul = new JButton("*");
bDiv = new JButton("/");
bCal = new JButton("=");
Bbac = new JButton("backspace");
Bce = new JButton("CE");
Bsqr = new JButton("sqrt");
BZF = new JButton("+/-");
tf = new TextField(50);

}

public void launchFrame() {
f.setSize(400, 210);
f.setResizable(false);
f.addWindowListener(new myWindowListener());
f.setLayout(new FlowLayout(FlowLayout.CENTER));
p1.add(tf);
f.add(p1, BorderLayout.NORTH);
p2.setLayout(new GridLayout(5, 4));
b0.addActionListener(new setlabeltext_actionlistener());
b1.addActionListener(new setlabeltext_actionlistener());
b2.addActionListener(new setlabeltext_actionlistener());
b3.addActionListener(new setlabeltext_actionlistener());
b4.addActionListener(new setlabeltext_actionlistener());
b5.addActionListener(new setlabeltext_actionlistener());
b6.addActionListener(new setlabeltext_actionlistener());
b7.addActionListener(new setlabeltext_actionlistener());
b8.addActionListener(new setlabeltext_actionlistener());
b9.addActionListener(new setlabeltext_actionlistener());
b0.addKeyListener(new KeyBoard());
b1.addKeyListener(new KeyBoard());
b2.addKeyListener(new KeyBoard());
b3.addKeyListener(new KeyBoard());
b4.addKeyListener(new KeyBoard());
b5.addKeyListener(new KeyBoard());
b6.addKeyListener(new KeyBoard());
b7.addKeyListener(new KeyBoard());
b8.addKeyListener(new KeyBoard());
b9.addKeyListener(new KeyBoard());

Bbac.addActionListener(new setoperator_actionlistener());
bPoint.addActionListener(new setlabeltext_actionlistener());
bAdd.addActionListener(new setoperator_actionlistener());
bDec.addActionListener(new setoperator_actionlistener());
bMul.addActionListener(new setoperator_actionlistener());
bDiv.addActionListener(new setoperator_actionlistener());
bCal.addActionListener(new setoperator_actionlistener());
Bce.addActionListener(new setoperator_actionlistener());
Bsqr.addActionListener(new setoperator_actionlistener());
BZF.addActionListener(new setoperator_actionlistener());
Bbac.addKeyListener(new KeyBoard());
bPoint.addKeyListener(new KeyBoard());
bAdd.addKeyListener(new KeyBoard());
bDec.addKeyListener(new KeyBoard());
bMul.addKeyListener(new KeyBoard());
bDiv.addKeyListener(new KeyBoard());
bCal.addKeyListener(new KeyBoard());
Bce.addKeyListener(new KeyBoard());
Bsqr.addKeyListener(new KeyBoard());
BZF.addKeyListener(new KeyBoard());

p2.add(b7);
p2.add(b8);
p2.add(b9);
p2.add(bAdd);
p2.add(b4);
p2.add(b5);
p2.add(b6);
p2.add(bDec);
p2.add(b1);
p2.add(b2);
p2.add(b3);
p2.add(bMul);
p2.add(b0);
p2.add(bPoint);
p2.add(bCal);
p2.add(bDiv);
p2.add(Bbac);
p2.add(Bce);
p2.add(Bsqr);
p2.add(BZF);
//p2.addKeyListener(new KeyBoard());
f.add(p2, BorderLayout.SOUTH);
f.addKeyListener(new KeyBoard());
f.setVisible(true);
f.setFocusable(true);

}

class myWindowListener extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

class setlabeltext_actionlistener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton tempB = (JButton) e.getSource();
s = tempB.getText();
settextfieldtext();
}
}

class setoperator_actionlistener implements ActionListener {
public void actionPerformed(ActionEvent e) {

JButton tempB = (JButton) e.getSource();
op = tempB.getText();
if (op.equals("+")) {
tf.setText(cal.opAdd(tf.getText()));
ifOp = true;
} else if (op.equals("-")) {
tf.setText(cal.opSub(tf.getText()));
ifOp = true;
} else if (op.equals("*")) {
tf.setText(cal.opmul(tf.getText()));
ifOp = true;
} else if (op.equals("/")) {
tf.setText(cal.opdiv(tf.getText()));
ifOp = true;
} else if (op.equals("CE")) {
tf.setText(cal.opce(tf.getText()));
} else if (op.equals("=")) {
tf.setText(cal.opEquals(tf.getText()));
ifOp = true;
} else if (op.equals("sqrt")) {
tf.setText(cal.opsqrt(tf.getText()));
ifOp = true;
} else if (op.equals("+/-")) {
tf.setText(cal.opzf(tf.getText()));
ifOp = true;
} else if (op.equals("backspace")) {
tf.setText(cal.opbac(tf.getText()));
ifOp = false;
}
}
}

public void settextfieldtext_temp() {
if (tf.getText().length() < 15
&& (tf.getText().indexOf(".") == -1 || !s.equals("."))) {
tf.setText(tf.getText() + s);
} else {
tf.setText((tf.getText() + s).substring(0, 15));
}
}

public void settextfieldtext() {
if (ifOp) {
ifOp = false;
tf.setText("");
settextfieldtext_temp();
} else {
settextfieldtext_temp();
}
}

class KeyBoard implements KeyListener {
char ysf2 = ' ';// 存储运算符
public void keyPressed(KeyEvent ke) {

}

// 弹起事件
public void keyReleased(KeyEvent ke) {
System.out.println(ke.getKeyChar());
// 从键盘读入数字
if (ke.getKeyChar() == '0') {
b0.doClick();

}
if (ke.getKeyChar() == '1') {
b1.doClick();
}
if (ke.getKeyChar() == '2') {
b2.doClick();
}
if (ke.getKeyChar() == '3') {
b3.doClick();
}
if (ke.getKeyChar() == '4') {
b4.doClick();
}
if (ke.getKeyChar() == '5') {
b5.doClick();
}
if (ke.getKeyChar() == '6') {
b6.doClick();
}
if (ke.getKeyChar() == '7') {
b7.doClick();
}
if (ke.getKeyChar() == '8') {
b8.doClick();
}
if (ke.getKeyChar() == '9') {
b9.doClick();
}

// 从键盘输入小数点
if (ke.getKeyChar() == '.')
bPoint.doClick();

// 加法
if (ke.getKeyChar() == '+') {
bAdd.doClick();
}

// 减法
if (ke.getKeyChar() == '-') {
bDec.doClick();
}

// 乘法
if (ke.getKeyChar() == '*') {
bMul.doClick();
}

// 除法
if (ke.getKeyChar() == '/') {
bDiv.doClick();
}
if (ke.getKeyChar() == '=') {
bCal.doClick();
}
if (ke.getKeyChar() == KeyEvent.VK_BACK_SPACE) {
Bbac.doClick();
}
if (ke.getKeyChar() == KeyEvent.VK_ENTER) {
bCal.doClick();
}
}

public void keyTyped(KeyEvent ke) {

}
}

// 按下事件

public static void main(String[] args) {
CalculatorGUI calculator = new CalculatorGUI();
calculator.launchFrame();
}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-08-12
换号~
下面是
calculatorGUI:
calculatorGUI:
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class calculatorGUI {
private Frame f;
private Panel p1,p2;
private Button b0,b1,b2,b3,b4,b5,b6,b7,b8,b9;
private Button bPoint,bAdd,bDec,bMul,bDiv,bCal,Bbac,Bce,Bsqr,BZF;
private TextField tf;
private String s,op;
private calculator cal = new calculator();
private boolean ifOp;
private float Num,Num1,Num2;
public calculatorGUI(){
f = new Frame("A Calculator");
p1 = new Panel();
p2 = new Panel();

b0 = new Button("0");
b1 = new Button("1");
b2 = new Button("2");
b3 = new Button("3");
b4 = new Button("4");
b5 = new Button("5");
b6 = new Button("6");
b7 = new Button("7");
b8 = new Button("8");
b9 = new Button("9");
bPoint = new Button(".");
bAdd = new Button("+");
bDec = new Button("-");
bMul = new Button("*");
bDiv = new Button("/");
bCal = new Button("=");
Bbac=new Button("backspace");
Bce=new Button("CE");
Bsqr=new Button("sqrt");
BZF=new Button("+/-");
tf = new TextField(39);

}

public void launchFrame(){
f.setSize(304,184);
f.setResizable(false);
f.addWindowListener(new myWindowListener());
f.setLayout(new FlowLayout(FlowLayout.CENTER));
p1.add(tf);
f.add(p1,BorderLayout.NORTH);
p2.setLayout(new GridLayout(5,4));
b0.addActionListener(new setlabeltext_actionlistener() );
b1.addActionListener(new setlabeltext_actionlistener());
b2.addActionListener(new setlabeltext_actionlistener());
b3.addActionListener(new setlabeltext_actionlistener());
b4.addActionListener(new setlabeltext_actionlistener());
b5.addActionListener(new setlabeltext_actionlistener());
b6.addActionListener(new setlabeltext_actionlistener());
b7.addActionListener(new setlabeltext_actionlistener());
b8.addActionListener(new setlabeltext_actionlistener());
b9.addActionListener(new setlabeltext_actionlistener());
b0.addKeyListener(new KeyBoard());
b1.addKeyListener(new KeyBoard());
b2.addKeyListener(new KeyBoard());
b3.addKeyListener(new KeyBoard());
b4.addKeyListener(new KeyBoard());
b5.addKeyListener(new KeyBoard());
b6.addKeyListener(new KeyBoard());
b7.addKeyListener(new KeyBoard());
b8.addKeyListener(new KeyBoard());
b9.addKeyListener(new KeyBoard());

Bbac.addActionListener(new setoperator_actionlistener());
bPoint.addActionListener(new setlabeltext_actionlistener());
bAdd.addActionListener(new setoperator_actionlistener());
bDec.addActionListener(new setoperator_actionlistener());
bMul.addActionListener(new setoperator_actionlistener());
bDiv.addActionListener(new setoperator_actionlistener());
bCal.addActionListener(new setoperator_actionlistener());
Bce.addActionListener(new setoperator_actionlistener());
Bsqr.addActionListener(new setoperator_actionlistener());
BZF.addActionListener(new setoperator_actionlistener());
Bbac.addKeyListener(new KeyBoard());
bPoint.addKeyListener(new KeyBoard());
bAdd.addKeyListener(new KeyBoard());
bDec.addKeyListener(new KeyBoard());
bMul.addKeyListener(new KeyBoard());
bDiv.addKeyListener(new KeyBoard());
bCal.addKeyListener(new KeyBoard());
Bce.addKeyListener(new KeyBoard());
Bsqr.addKeyListener(new KeyBoard());
BZF.addKeyListener(new KeyBoard());

p2.add(b7);
p2.add(b8);
p2.add(b9);
p2.add(bAdd);
p2.add(b4);
p2.add(b5);
p2.add(b6);
p2.add(bDec);
p2.add(b1);
p2.add(b2);
p2.add(b3);
p2.add(bMul);
p2.add(b0);
p2.add(bPoint);
p2.add(bCal);
p2.add(bDiv);
p2.add(Bbac);
p2.add(Bce);
p2.add(Bsqr);
p2.add(BZF);
f.add(p2,BorderLayout.SOUTH);
f.setVisible(true);

}
class myWindowListener extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}

class setlabeltext_actionlistener implements ActionListener{
public void actionPerformed(ActionEvent e){
Button tempB = (Button)e.getSource();
s = tempB.getLabel();
settextfieldtext();
}
}

class setoperator_actionlistener implements ActionListener{
public void actionPerformed(ActionEvent e){

Button tempB = (Button)e.getSource();
op = tempB.getLabel();
if(op.equals("+")){
tf.setText(cal.opAdd(tf.getText()));
ifOp = true;
}else if(op.equals("-")){
tf.setText(cal.opSub(tf.getText()));
ifOp = true;
}else if(op.equals("*")){
tf.setText(cal.opmul(tf.getText()));
ifOp = true;
}else if(op.equals("/")){
tf.setText(cal.opdiv(tf.getText()));
ifOp = true;
}else if(op.equals("CE")){
tf.setText(cal.opce(tf.getText()));
}
else if(op.equals("=")){
tf.setText(cal.opEquals(tf.getText()));
ifOp = true;
}else if(op.equals("sqrt")){
tf.setText(cal.opsqrt(tf.getText()));
ifOp=true;
}else if(op.equals("+/-")){
tf.setText(cal.opzf(tf.getText()));
ifOp=true;
}else if(op.equals("backspace")){
tf.setText(cal.opbac(tf.getText()));
ifOp=true;
}
}
}

public void settextfieldtext_temp(){
if (tf.getText().length()<15 && (tf.getText().indexOf(".")==-1 || !s.equals(".")))
{
tf.setText(tf.getText()+s);
}else{
tf.setText((tf.getText()+s).substring(0,15));
}
}
public void settextfieldtext(){
if(ifOp){
ifOp = false;
tf.setText("");
settextfieldtext_temp();
}else{
settextfieldtext_temp();
}
}

class KeyBoard implements KeyListener{
char ysf2=' ';//存储运算符

//按下事件
public void keyPressed(KeyEvent ke){
if(ke.getKeyCode()==27){//清除(Esc)
Num1=' ';
Num2=' ';
Num=' ';
tf.setText("0");
}

if((ke.getKeyCode()==10)||(ke.getKeyChar()=='=')){//回车或等号
Num2=Float.parseFloat(tf.getText());//Num2存储点击运算符后的数值
switch(ysf2){
case '+':{
Num=Num1+Num2;
tf.setText(""+Num);
break;
}
case '-':{
Num=Num1-Num2;
tf.setText(""+Num);
break;
}
case '*':{
Num=Num1*Num2;
tf.setText(""+Num);
break;
}
case '/':{
if(Num2==0){
tf.setText("除数不能为零");
}
else{
Num=Num1/Num2;
tf.setText(""+Num);
}
break;
}
}
}

}

//弹起事件
public void keyReleased(KeyEvent ke){
//从键盘读入数字
if(ke.getKeyChar()=='0'){
if(tf.getText().equals("0"))
tf.setText("0");
else tf.setText(tf.getText()+"0");
}
if(ke.getKeyChar()=='1'){
if(tf.getText().equals("0"))
tf.setText("1");
else tf.setText(tf.getText()+"1");
}
if(ke.getKeyChar()=='2'){
if(tf.getText().equals("0"))
tf.setText("2");
else tf.setText(tf.getText()+"2");
}
if(ke.getKeyChar()=='3'){
if(tf.getText().equals("0"))
tf.setText("3");
else tf.setText(tf.getText()+"3");
}
if(ke.getKeyChar()=='4'){
if(tf.getText().equals("0"))
tf.setText("4");
else tf.setText(tf.getText()+"4");
}
if(ke.getKeyChar()=='5'){
if(tf.getText().equals("0"))
tf.setText("5");
else tf.setText(tf.getText()+"5");
}
if(ke.getKeyChar()=='6'){
if(tf.getText().equals("0"))
tf.setText("6");
else tf.setText(tf.getText()+"6");
}
if(ke.getKeyChar()=='7'){
if(tf.getText().equals("0"))
tf.setText("7");
else tf.setText(tf.getText()+"7");
}
if(ke.getKeyChar()=='8'){
if(tf.getText().equals("0"))
tf.setText("8");
else tf.setText(tf.getText()+"8");
}
if(ke.getKeyChar()=='9'){
if(tf.getText().equals("0"))
tf.setText("9");
else tf.setText(tf.getText()+"9");
}

//从键盘输入小数点
if(ke.getKeyChar()=='.')
tf.setText(tf.getText()+".");

//加法
if(ke.getKeyChar()=='+'){
Num1=Float.parseFloat(tf.getText());
ysf2='+';
tf.setText("");
}

//减法
if(ke.getKeyChar()=='-'){
Num1=Float.parseFloat(tf.getText());
ysf2='-';
tf.setText("");
}

//乘法
if(ke.getKeyChar()=='*'){
Num1=Float.parseFloat(tf.getText());
ysf2='*';
tf.setText("");
}

//除法
if(ke.getKeyChar()=='/'){
Num1=Float.parseFloat(tf.getText());
ysf2='/';
tf.setText("");
}
}
public void keyTyped(KeyEvent ke){

}
}

//按下事件

public static void main(String[] args){
calculatorGUI calculator = new calculatorGUI();
calculator.launchFrame();
}

}
大家帮帮忙啊!!!!!!!!!!!!!!
第2个回答  2008-08-12
程序思路对了,只有一个小错误。

你所设置的KeyListener都在p2上,而程序开始的时候,焦点在p1上,自然无法响应键盘事件。

解决方法: 在f显示前,禁止tf获得焦点,p2获得焦点后,程序运行正常。

f.add(p2, BorderLayout.SOUTH);

tf.setFocusable(false);//加入的语句

f.setVisible(true);
第3个回答  2008-08-12
我测试了可以用键盘输入计算啊。。具体哪部分不行??

一个小建议:
public void keyReleased(KeyEvent ke)下面,

tf.getText().equals("0")
改成
Double.parseDouble(tf.getText())==0.0

因为tf.getText().equals("0")不包括"0.0"

==============
我先用鼠标再用键盘测试,难怪找不到问题
照cliff77给的办法作吧~正解~~佩服~~~
第4个回答  2008-08-12
好多的代码
相似回答