我要做一个计算器的图形界面程序,用鼠标点击按钮、显示、计算等一系列功能都实现了,我想实现从键盘按按键来控制程序的功能,但是按键相应部分出现了问题,好像我按什么建都不响应,这是为什么? 还望指点
程序如下:
package exercise;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class Calculator extends JFrame implements KeyListener,ActionListener
{
JLabel label;
String line=""; //存储计算器显示区域的字符串
double left,right; //存放左右操作数
Container contentPane;
JPanel panel;
JButton button[];
char operate; //标记是何种运算符号 public Calculator(String title) //构造器
{
super(title);
setDefaultCloseOperation(EXIT_ON_CLOSE);
contentPane=getContentPane(); //获取内容格
contentPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
label=new JLabel("0.");
label.setBackground(Color.white);
label.setForeground(Color.blue);
contentPane.add(label); button=new JButton[20];
button[0]=new JButton("Backspace"); //定义一系列按钮
button[1]=new JButton("CE");
button[2]=new JButton("C");
button[3]=new JButton("=");
button[4]=new JButton("7");
button[5]=new JButton("8");
button[6]=new JButton("9");
button[7]=new JButton("/");
button[8]=new JButton("4");
button[9]=new JButton("5");
button[10]=new JButton("6");
button[11]=new JButton("*");
button[12]=new JButton("1");
button[13]=new JButton("2");
button[14]=new JButton("3");
button[15]=new JButton("-");
button[16]=new JButton("0");
button[17]=new JButton("+/-");
button[18]=new JButton(".");
button[19]=new JButton("+");
panel=new JPanel();
panel.setLayout(new GridLayout(5,4,5,5));
for(int i=0;i<button.length;i++) //加三个控制按钮
panel.add(button[i]);
contentPane.add(panel); //将第一个面板加入到内容格
for(int i=0;i<button.length;i++) //将当前对象作为所有按钮的监听者
{
button[i].addActionListener(this);
}
addKeyListener(this);
setSize(425,230);
setVisible(true);
} public void actionPerformed(ActionEvent e)
{
//数字0~9的相应方式
if(e.getSource()==button[16]) {line+=0; label.setText(line);}
if(e.getSource()==button[12]) {line+=1; label.setText(line);}
if(e.getSource()==button[13]) {line+=2; label.setText(line);}
if(e.getSource()==button[14]) {line+=3; label.setText(line);}
if(e.getSource()==button[8]) {line+=4; label.setText(line);}
if(e.getSource()==button[9]) {line+=5; label.setText(line);}
if(e.getSource()==button[10]) {line+=6; label.setText(line);}
if(e.getSource()==button[4]) {line+=7; label.setText(line);}
if(e.getSource()==button[5]) {line+=8; label.setText(line);}
if(e.getSource()==button[6]) {line+=9; label.setText(line);} if(e.getSource()==button[0]) //"Backspace"
{
int num=line.length(); //获取当前显示的字符串的长度
if(num>1)
{
line=line.substring(0,line.length()-1); label.setText(line);
}
if(num==1)
{ line=""; label.setText("0.");}
}
if(e.getSource()==button[1]) //"CE" 清屏,把当前显示区的内容清空
{ line=""; label.setText("0.");}
if(e.getSource()==button[2]) //"C" 复位
{
line=""; operate='\0'; left=right=0; label.setText("0.");
}
if(e.getSource()==button[3]) //"="
{
right=Double.parseDouble(line); line="";
String result="";
if(operate=='+') result=String.valueOf(left+right);
if(operate=='-') result=String.valueOf(left-right);
if(operate=='*') result=String.valueOf(left*right);
if(operate=='/') result=String.valueOf(left/right);
label.setText(result);
}
if(e.getSource()==button[7]) //"/"
{
left = Double.parseDouble(line); line=""; operate='/';
}
if(e.getSource()==button[11]) //"*"
{
left = Double.parseDouble(line); line=""; operate='*';
}
if(e.getSource()==button[15]) //"-"
{
left = Double.parseDouble(line); line=""; operate='-';
}
if(e.getSource()==button[17]) //"+/-" 翻转符号
{
double num=Double.parseDouble(line);
num=-num; line=String.valueOf(num); label.setText(line);
}
if(e.getSource()==button[18]) //"."小数点
{if(line.indexOf('.')==-1) //如果字符串中没有小数点,则加上小数点,否则无效
{ line += "."; label.setText(line); }
}
if(e.getSource()==button[19]) //"+"
{
left = Double.parseDouble(line); line=""; operate='+';
}
}
public void keyPressed(KeyEvent e)
{
String keyText="";
if(e.isShiftDown())
{
keyText = e.getKeyText(e.getKeyCode());
if(keyText.equals("8")) keyText="*";
if(keyText.equals("-")) keyText="-";
if(keyText.equals("=")) keyText="+";
}
else
{
keyText = e.getKeyText(e.getKeyCode());
if(keyText.equals("0") || keyText.equals("1") || keyText.equals("2") || keyText.equals("3") || keyText.equals("4") ||
keyText.equals("5") || keyText.equals("6") || keyText.equals("7") || keyText.equals("8") || keyText.equals("9") ||
keyText.equals("."));
else
keyText="";
} //数字0~9的相应方式
if(keyText.equals("0")) {line+=0; label.setText(line);}
if(keyText.equals("1")) {line+=1; label.setText(line);}
if(keyText.equals("2")) {line+=2; label.setText(line);}
if(keyText.equals("3")) {line+=3; label.setText(line);}
if(keyText.equals("4")) {line+=4; label.setText(line);}
if(keyText.equals("5")) {line+=5; label.setText(line);}
if(keyText.equals("6")) {line+=6; label.setText(line);}
if(keyText.equals("7")) {line+=7; label.setText(line);}
if(keyText.equals("8")) {line+=8; label.setText(line);}
if(keyText.equals("9")) {line+=9; label.setText(line);} if(keyText.equals("Backspace")) //"Backspace"
{
int num=line.length(); //获取当前显示的字符串的长度
if(num>1)
{
line=line.substring(0,line.length()-1); label.setText(line);
}
if(num==1)
{ line=""; label.setText("0.");}
}
if(keyText.equals("=")) //"="
{
right=Double.parseDouble(line); line="";
String result="";
if(operate=='+') result=String.valueOf(left+right);
if(operate=='-') result=String.valueOf(left-right);
if(operate=='*') result=String.valueOf(left*right);
if(operate=='/') result=String.valueOf(left/right);
label.setText(result);
}
if(keyText.equals("/")) //"/"
{
left = Double.parseDouble(line); line=""; operate='/';
}
if(keyText.equals("*")) //"*"
{
left = Double.parseDouble(line); line=""; operate='*';
}
if(keyText.equals("-")) //"-"
{
left = Double.parseDouble(line); line=""; operate='-';
}
if(keyText.equals(".")) //"."小数点
{if(line.indexOf('.')==-1) //如果字符串中没有小数点,则加上小数点,否则无效
{ line += "."; label.setText(line); }
}
if(keyText.equals("+")) //"+"
{
left = Double.parseDouble(line); line=""; operate='+';
} } public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {} public static void main(String[] args)
{
Calculator obj=new Calculator("计算器");
}
}
程序如下:
package exercise;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class Calculator extends JFrame implements KeyListener,ActionListener
{
JLabel label;
String line=""; //存储计算器显示区域的字符串
double left,right; //存放左右操作数
Container contentPane;
JPanel panel;
JButton button[];
char operate; //标记是何种运算符号 public Calculator(String title) //构造器
{
super(title);
setDefaultCloseOperation(EXIT_ON_CLOSE);
contentPane=getContentPane(); //获取内容格
contentPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
label=new JLabel("0.");
label.setBackground(Color.white);
label.setForeground(Color.blue);
contentPane.add(label); button=new JButton[20];
button[0]=new JButton("Backspace"); //定义一系列按钮
button[1]=new JButton("CE");
button[2]=new JButton("C");
button[3]=new JButton("=");
button[4]=new JButton("7");
button[5]=new JButton("8");
button[6]=new JButton("9");
button[7]=new JButton("/");
button[8]=new JButton("4");
button[9]=new JButton("5");
button[10]=new JButton("6");
button[11]=new JButton("*");
button[12]=new JButton("1");
button[13]=new JButton("2");
button[14]=new JButton("3");
button[15]=new JButton("-");
button[16]=new JButton("0");
button[17]=new JButton("+/-");
button[18]=new JButton(".");
button[19]=new JButton("+");
panel=new JPanel();
panel.setLayout(new GridLayout(5,4,5,5));
for(int i=0;i<button.length;i++) //加三个控制按钮
panel.add(button[i]);
contentPane.add(panel); //将第一个面板加入到内容格
for(int i=0;i<button.length;i++) //将当前对象作为所有按钮的监听者
{
button[i].addActionListener(this);
}
addKeyListener(this);
setSize(425,230);
setVisible(true);
} public void actionPerformed(ActionEvent e)
{
//数字0~9的相应方式
if(e.getSource()==button[16]) {line+=0; label.setText(line);}
if(e.getSource()==button[12]) {line+=1; label.setText(line);}
if(e.getSource()==button[13]) {line+=2; label.setText(line);}
if(e.getSource()==button[14]) {line+=3; label.setText(line);}
if(e.getSource()==button[8]) {line+=4; label.setText(line);}
if(e.getSource()==button[9]) {line+=5; label.setText(line);}
if(e.getSource()==button[10]) {line+=6; label.setText(line);}
if(e.getSource()==button[4]) {line+=7; label.setText(line);}
if(e.getSource()==button[5]) {line+=8; label.setText(line);}
if(e.getSource()==button[6]) {line+=9; label.setText(line);} if(e.getSource()==button[0]) //"Backspace"
{
int num=line.length(); //获取当前显示的字符串的长度
if(num>1)
{
line=line.substring(0,line.length()-1); label.setText(line);
}
if(num==1)
{ line=""; label.setText("0.");}
}
if(e.getSource()==button[1]) //"CE" 清屏,把当前显示区的内容清空
{ line=""; label.setText("0.");}
if(e.getSource()==button[2]) //"C" 复位
{
line=""; operate='\0'; left=right=0; label.setText("0.");
}
if(e.getSource()==button[3]) //"="
{
right=Double.parseDouble(line); line="";
String result="";
if(operate=='+') result=String.valueOf(left+right);
if(operate=='-') result=String.valueOf(left-right);
if(operate=='*') result=String.valueOf(left*right);
if(operate=='/') result=String.valueOf(left/right);
label.setText(result);
}
if(e.getSource()==button[7]) //"/"
{
left = Double.parseDouble(line); line=""; operate='/';
}
if(e.getSource()==button[11]) //"*"
{
left = Double.parseDouble(line); line=""; operate='*';
}
if(e.getSource()==button[15]) //"-"
{
left = Double.parseDouble(line); line=""; operate='-';
}
if(e.getSource()==button[17]) //"+/-" 翻转符号
{
double num=Double.parseDouble(line);
num=-num; line=String.valueOf(num); label.setText(line);
}
if(e.getSource()==button[18]) //"."小数点
{if(line.indexOf('.')==-1) //如果字符串中没有小数点,则加上小数点,否则无效
{ line += "."; label.setText(line); }
}
if(e.getSource()==button[19]) //"+"
{
left = Double.parseDouble(line); line=""; operate='+';
}
}
public void keyPressed(KeyEvent e)
{
String keyText="";
if(e.isShiftDown())
{
keyText = e.getKeyText(e.getKeyCode());
if(keyText.equals("8")) keyText="*";
if(keyText.equals("-")) keyText="-";
if(keyText.equals("=")) keyText="+";
}
else
{
keyText = e.getKeyText(e.getKeyCode());
if(keyText.equals("0") || keyText.equals("1") || keyText.equals("2") || keyText.equals("3") || keyText.equals("4") ||
keyText.equals("5") || keyText.equals("6") || keyText.equals("7") || keyText.equals("8") || keyText.equals("9") ||
keyText.equals("."));
else
keyText="";
} //数字0~9的相应方式
if(keyText.equals("0")) {line+=0; label.setText(line);}
if(keyText.equals("1")) {line+=1; label.setText(line);}
if(keyText.equals("2")) {line+=2; label.setText(line);}
if(keyText.equals("3")) {line+=3; label.setText(line);}
if(keyText.equals("4")) {line+=4; label.setText(line);}
if(keyText.equals("5")) {line+=5; label.setText(line);}
if(keyText.equals("6")) {line+=6; label.setText(line);}
if(keyText.equals("7")) {line+=7; label.setText(line);}
if(keyText.equals("8")) {line+=8; label.setText(line);}
if(keyText.equals("9")) {line+=9; label.setText(line);} if(keyText.equals("Backspace")) //"Backspace"
{
int num=line.length(); //获取当前显示的字符串的长度
if(num>1)
{
line=line.substring(0,line.length()-1); label.setText(line);
}
if(num==1)
{ line=""; label.setText("0.");}
}
if(keyText.equals("=")) //"="
{
right=Double.parseDouble(line); line="";
String result="";
if(operate=='+') result=String.valueOf(left+right);
if(operate=='-') result=String.valueOf(left-right);
if(operate=='*') result=String.valueOf(left*right);
if(operate=='/') result=String.valueOf(left/right);
label.setText(result);
}
if(keyText.equals("/")) //"/"
{
left = Double.parseDouble(line); line=""; operate='/';
}
if(keyText.equals("*")) //"*"
{
left = Double.parseDouble(line); line=""; operate='*';
}
if(keyText.equals("-")) //"-"
{
left = Double.parseDouble(line); line=""; operate='-';
}
if(keyText.equals(".")) //"."小数点
{if(line.indexOf('.')==-1) //如果字符串中没有小数点,则加上小数点,否则无效
{ line += "."; label.setText(line); }
}
if(keyText.equals("+")) //"+"
{
left = Double.parseDouble(line); line=""; operate='+';
} } public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {} public static void main(String[] args)
{
Calculator obj=new Calculator("计算器");
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货