JAVA核心技术第一卷 9-1 计算器的问题

散人的纪念 2014-01-15 03:33:54
代码基本上看明白了,就是在 CommandAction 这个事件处理中,有一行代码不理解

代码:
Main.java


public class Main
{

public static void main(String[] args)
{
// TODO Auto-generated method stub
CalculatorFrame test = new CalculatorFrame();


}

}


CalculatorFrame.java
/**
* 计算器界面
* @author Administrator
*
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CalculatorFrame extends JFrame
{
public CalculatorFrame()
{
setTitle("书上的计算器");
CalulatorPanel panel = new CalulatorPanel();
add( panel );
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible( true );
pack();
}
}



CalulatorPanel.java//大致在这个文件的第111行左右,我用注释标注了

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class CalulatorPanel extends JPanel
{

public CalulatorPanel()
{
this.setLayout(new BorderLayout() );

result = 0;
lastCommand = "=";
start = true;

//添加显示
display = new JButton("0");
display.setEnabled(false);
add( display, BorderLayout.NORTH);

InsertAction insert = new InsertAction();
CommandAction command = new CommandAction();

//添加按钮
panel = new JPanel();
panel.setLayout(new GridLayout( 4,4));

addButton( "7", insert );
addButton( "8", insert );
addButton( "9", insert );
addButton( "/", command );

addButton( "4", insert );
addButton( "5", insert );
addButton( "6", insert );
addButton( "*", command );

addButton( "1", insert );
addButton( "2", insert );
addButton( "3", insert );
addButton( "-", command );

addButton( "0", insert );
addButton( ".", insert );
addButton( "=", command );
addButton( "+", command );

add( panel, BorderLayout.CENTER );
}

//添加按钮
private void addButton( String label, ActionListener listrner )
{
JButton button = new JButton( label );
button.addActionListener(listrner);
panel.add( button );
}



private class InsertAction implements ActionListener
{

@Override
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
String input = e.getActionCommand();

if( start )
{
display.setText("");
start = false;
}

display.setText(display.getText() + input );
//System.out.println( start );
}
}



private class CommandAction implements ActionListener
{

@Override
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
String command = e.getActionCommand();

if( start )
{
if( command.equals("-"))
{
display.setText( command );
start = false;
}
else
{
lastCommand = command;
}

System.out.println( start );

}
else
{

calcucate( Double.parseDouble(display.getText()));//这里有问题
lastCommand = command;
start = true;

//System.out.println( start );
}

}

}


//计算
public void calcucate( double x )
{
if( lastCommand.equals("+")) result += x;
else if( lastCommand.equals("-")) result -= x;
else if( lastCommand.equals("*")) result *= x;
else if( lastCommand.equals("/")) result /= x;
else if( lastCommand.equals("=")) result = x;

display.setText( "" + result );

//System.out.println(result + " " + x );
}

private JButton display;//显示结果
private JPanel panel;//数字和符号
private double result;//计算结果
private String lastCommand;
private boolean start;


}


下层楼写我的问题





...全文
229 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
散人的纪念 2014-01-17
  • 打赏
  • 举报
回复
引用 3 楼 huxiweng 的回复:
还有start在哪定义,和result在哪定义没看出来
start定义在最后 这个代码的逻辑我已经全部清除了 在5楼有我的解释
散人的纪念 2014-01-17
  • 打赏
  • 举报
回复
我已经看明白了 关键在于 lastCommand 在按了 123 之后,再按一个符号,比如 + 此时调用calculate 此时lastCommand还是 "=" 于是result被赋值为 calculate 的参数x,也就是按下的数字 calculate函数执行完毕 下一句是lastCommand = command 这行的作用就是把你按下的符号赋值给lastCommand, 再按下数字,123,再 按 = 则在 calculate 中,lastCommand不是 "=" 此时,已经可以计算了,并且返回结果 lastCommand = command执行 此时lastCommand又被赋值为 "=" 如此循环
u012867888 2014-01-15
  • 打赏
  • 举报
回复
start在你按1之后就变成false了!
teemai 2014-01-15
  • 打赏
  • 举报
回复
还有start在哪定义,和result在哪定义没看出来
teemai 2014-01-15
  • 打赏
  • 举报
回复
单纯从你给出的代码你说的是对的。
散人的纪念 2014-01-15
  • 打赏
  • 举报
回复
比如我按了 123,那么是在调用 InsertAction 这个事件 然后我按一个运算符号,比如 * 那么调用 CommandAction,此时 start为false, 那么调用calcucate函数, 这个时候不是应该执行 result *=123 么? 这就是0了 可是这个程序可以运行,这是怎么回事?
看到很多人都分卷打包的,下载很是不方便,还浪费积分,我就整合压缩打包到一个包里面,里面包含全部源码 源码目录如下: 第1部分(2个程序包) HelloWorld.zip 01.Java入门样例HelloWorld demo.zip 03.Eclipse入门样例demo 第2部分(3个程序包) javasyntax.zip 05.Java核心语法详解 javaoop.zip 06.Java面向对象编程(计算器javaexception.zip 07.Java面向对象编程扩展(计算器异常捕捉实例) 第3部分(5个程序包) javaio.zip 09.Java输入/输出流 javavi.zip 09.Java输入/输出流上机作业参考(文本编辑器) javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16.AWT图形界面开发——Java文本编辑器 javamedia.zip 17.AWT多媒体编程——录音机、MP3播放器、视频拍照、视频播放器 javaswing.zip 18.Swing图形界面开发——Java文本编辑器 javaswt.zip 19.SWT图形界面开发——Java文本编辑器 javajface.zip 20.SWT增强组件库JFace 第5部分(5个程序包) javaapplet.zip 21.Applet网络组件——电子相册 javanet.zip 22.Java网络编程详解(Socket/UDP实例、简单聊天系统) javanio.zip 23.NIO非阻塞通信(Socket/UDP实例、简单聊天系统) javarmi.zip 24.RMI编程(HelloWorld例、计算器实例) javacorba.zip 25.Corba编程(HelloWorld例、计算器实例) 第6部分(4个程序包) javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性

62,614

社区成员

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

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