新手请教如何实现这个计算器的键盘响应,急啊!
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.*;
public class Counter extends Frame implements KeyListener
{
GridLayout gl1,gl2,gl3; //声明三个面板的布局
Panel p0,p1,p2,p3;
Result result =new Result(); // 定义text 面板
JTextField tf1;
TextField tf2;
Button b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26;
StringBuffer str; //显示屏所显示的字符串
String s;
double x=0.0,y=0.0;//resule=0.0; //x和y都是运算数,result为运算结果
int z; //Z表示单击了的运算符,0表示 "+ ",1表示 "- ",2表示 "* ",3表示 "/ "
static double m; //记忆的数字
public void keyPressed(KeyEvent e){} //键盘响应
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e)
{
char c=e.getKeyChar();
switch(c)
{
case '0 ' : ;
case '1 ' : ;
case '2 ' : ;
case '3 ' : ;
case '4 ' : ;
case '5 ' : ;
case '6 ' : ;
case '7 ' : ;
case '8 ' : ;
case '9 ' :{
if(tf1.getText().trim().equals( "0 "))//如果显示屏显示的为零不做操作
{
tf1.setText( " ");
}
y=Double.parseDouble(tf1.getText().trim());
};;break;
case '+ ' :{
//y=Double.parseDouble(tf1.getText().trim());
//tf1.setText(str.delete(str.length()-1,str.length()).toString());
tf1.setText( " ");
str.setLength(0); //清空缓冲区以便接收新的另一个运算数
y=0d;
z=0;
tf1.setText(str.delete(str.length()-1,str.length()).toString());
} break;
case '- ' :{
//x=Double.parseDouble(tf1.getText().trim());
//tf1.setText(str.delete(str.length()-1,str.length()).toString());
str.setLength(0);
y=0d;
z=1;
} ; break;
case '* ' :{
//x=Double.parseDouble(tf1.getText().trim());
//tf1.setText(str.delete(str.length()-1,str.length()).toString());
str.setLength(0);
y=0d;
z=2;
} ;break;
case '/ ' :{
//x=Double.parseDouble(tf1.getText().trim());
//tf1.setText(str.delete(str.length()-1,str.length()).toString());
str.setLength(0);
y=0d;
z=3;
} ;break;
case '= ' :{
// tf1.setText(str.delete(str.length()-1,str.length()).toString());
x=Double.parseDouble(tf1.getText().trim());
str.setLength(0);
switch(z)
{
case 0 : tf1.setText( " "+(x+y));break;
case 1 : tf1.setText( " "+(x-y));break;
case 2 : tf1.setText( " "+(x*y));break;
case 3 : tf1.setText( " "+(x/y));break;
}
tf1.setText(str.delete(str.length()-1,str.length()).toString());
} ;break;
}
}
[解决办法]
前几天有人问过类似的问题
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class T
{
public static void main(String[] args)
{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
}
final JTextField tf = new JTextField();
tf.setEnabled(false);
JPanel p = new JPanel(new GridLayout(0, 3, 5, 5));
for (int i = 0; i <= 9; i++) {
final JButton btn = new JButton(String.valueOf(i));
p.add(btn);
btn.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke((char)(i + '0 ')), "PressKeyAction ");
btn.getActionMap().put( "PressKeyAction ", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
btn.doClick();
}
});
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf.setText(tf.getText() + btn.getText());
}
});
}
JFrame f = new JFrame();
JComponent contentPane = (JComponent) f.getContentPane();
contentPane.setLayout(new BorderLayout(0, 5));
contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
f.getContentPane().add(p, BorderLayout.CENTER);
f.getContentPane().add(tf, BorderLayout.NORTH);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}