java计算器不能计算出结果

1吗 2017-06-11 12:21:38
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Calculator extends JFrame implements ActionListener{ //建一个Calculator类继承JFrame实现ActionListener
public static void main (String args[]){
Calculator calculator=new Calculator(); //创建对象calculator
calculator.setVisible(true); //窗口可见
calculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭图标后结束程序
}
String keys []={"7","8","9","/","sqrt","4","5","6","*","-","1","2","3","+","0","=",".","八进制","十六进制"};//表示计算器的键的名字
String command []={"backspace","C"};//功能键
JButton KEYS []=new JButton[keys.length];//创建键对象
JButton COMMAND[]=new JButton[command.length];//功能键对象
static JTextField resultSet=new JTextField();//建一个文本框
double resultNum; //结果
String operator;//运算符
Double i;
boolean start;
public Calculator() {// 构造函数
super();
init();//初始化计算器
this.setBackground(Color.WHITE);//this代表用当前构造方法创建的对象
this.setTitle("简单计算器"); //窗口标题
this.setLocation(500, 300); //窗口大小
this.pack();//使组件大小合适
operator="=";
resultNum=0;
start=true;
}
void init() { //初始化计算器
resultSet.setHorizontalAlignment(JTextField.RIGHT); //设置文本框内容向右对齐
resultSet.setBackground(Color.WHITE); //设置文本框背景颜色
JPanel keysPanel=new JPanel();//创建一个面板
keysPanel.setLayout(new GridLayout(4,5,3,3)); //设置面板的布局为网格型
for (int i=0;i<keys.length;i++) { //把数字键和符号键设为按钮
KEYS[i]=new JButton(keys[i]);
keysPanel.add(KEYS[i]); //把按钮加到面板中
KEYS[i].setBackground(Color.BLACK);//设置背景颜色
}
JPanel comPanel=new JPanel(); //创建命令键面板
comPanel.setLayout(new GridLayout(1,2,3,3));//设置面板布局为网格型
for(int i=0;i<command.length;i++) { //把命令键设置为按钮
COMMAND[i]=new JButton(command[i]);
comPanel.add(COMMAND[i]); //把按钮放到面板上
COMMAND[i].setBackground(Color.BLACK); //设置背景颜色
}
JPanel pane=new JPanel(); //创建面板
pane.setLayout(new BorderLayout()); //面板布局为区域型
pane.add(comPanel,BorderLayout.NORTH); //把命令面板加入到大面板上
pane.add(keysPanel,BorderLayout.CENTER);//把数字键面板加到大面板
getContentPane().setLayout(new BorderLayout()); //设置底层容器的布局为区域型
getContentPane().add(resultSet,BorderLayout.NORTH); //把文本框放到北面
getContentPane().add(pane,BorderLayout.CENTER); //把大面板放到中央
for(int i=0;i<keys.length;i++){
KEYS[i].addActionListener(this);//为按钮添加监听器
}
for(int i=0;i<command.length;i++){
COMMAND[i].addActionListener(this);
}
}
//处理事件
public void actionPerformed(ActionEvent e){
String lable=e.getActionCommand();
if(lable.equals("backspace")){ //如果命令为backspace
backspace();
}
if (lable.equals("C")){ //如果命令为C
Clear();
}
if (Character.isDigit(lable.charAt(0)));
{ //如果命令为数字键,则输入数字
handleNumber(lable);
}
if (lable.equals(".")&&resultSet.getText().indexOf(".")<0) { //如果命令为小数点,则输入小数
point();
}

if (lable.equals("="))
{ //如果命令为=
operator=lable;
equal();
}
if(lable.equals("+")){
addtion();
}
if (lable.equals("-")){
sub();

}
if (lable.equals("*")){
multiple();
}
if (lable.equals("/")){
divid();
}
if(lable.equals("sqrt")){
sqrt();
}
if(lable.equals("八进制")){
int n=Integer.parseInt(resultSet.getText());
resultSet.setText(Integer.toOctalString(n));
}
if(lable.equals("十六进制")){
int n=Integer.parseInt(resultSet.getText());
resultSet.setText(Integer.toHexString(n));
}
}
//方法
private void sqrt() { //开方
// TODO Auto-generated method stub
i=new Double(Calculator.resultSet.getText());
resultNum=i.doubleValue();
Calculator.resultSet.setText(""+Math.sqrt(resultNum));

}

private void divid() { //除法
// TODO Auto-generated method stub
i=new Double(Calculator.resultSet.getText());
if (i.doubleValue()==0){
Calculator.resultSet.setText("除数不能为零");
}
else{
Calculator.resultSet.setText("");
resultNum=resultNum/i.doubleValue();

}
operator="/";
}
private void multiple() { //乘法
// TODO Auto-generated method stub
i=new Double(resultSet.getText());
resultNum=resultNum*i.doubleValue();
operator="*";
}
private void sub() { //减法
// TODO Auto-generated method stub
i=new Double(Calculator.resultSet.getText());
resultNum=resultNum-i.doubleValue();
operator="-";
}
private void addtion() { //加法
// TODO Auto-generated method stub
i=new Double(resultSet.getText());
resultNum=resultNum+i.doubleValue();
operator="+";
}
private void point() { //处理小数点
// TODO Auto-generated method stub
resultSet.setText(resultSet.getText()+".");
}

private void handleNumber(String key) { //处理数字键
// TODO Auto-generated method stub
resultSet.setText(resultSet.getText()+key);
}
void equal() { //执行等号操作
if (operator=="+"){
i=new Double(resultSet.getText());

resultNum=resultNum+i.doubleValue();
resultSet.setText(""+resultNum);
}
else if(operator=="-"){
sub();
resultSet.setText(""+resultNum);
}
else if(operator=="*"){
multiple();
resultSet.setText(""+resultNum);
}
else if(operator=="/") {
divid();
resultSet.setText(""+resultNum);
}

}



void Clear() { //清零

resultSet.setText("0");

}

void backspace() { //退格
String text =resultSet.getText();
if (text.length()>0){
resultSet.setText(text.substring(0, text.length()-1));//将文本最后一个字符删除
}
else if (text.length()==0){
resultSet.setText("0");
}
}
}
...全文
198 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhan_sun_tao2010 2017-06-12
  • 打赏
  • 举报
回复
81行有问题,equal这个方法并没有处理operator为=号的情况,而且也不必处理。 160行也有问题,此处会抛出类型转换异常。

51,412

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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