请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 6273|回复: 11

java小计算器代码

[复制链接]
发表于 2008-11-19 20:11:56 | 显示全部楼层 |阅读模式

  1. package CalcApp;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. public class CalcAppDemo extends Frame
  5. {
  6. private TextField t_result;
  7. private Panel p_main;
  8. private Panel p_num;
  9. private Panel p_oper;
  10. private Panel p_show;
  11. private Button b_num[];
  12. private Button b_oper[];

  13. public CalcAppDemo(String title)
  14. {
  15.   setTitle(title);
  16.   setLocation(500,300);
  17.   t_result=new TextField("0.0",21);
  18.   p_main=new Panel();
  19.                 p_num=new Panel();
  20.   p_oper=new Panel();
  21.   p_show=new Panel();
  22.   p_main.setLayout(new BorderLayout());
  23.   p_num.setLayout(new GridLayout(4,3,1,1));
  24.   p_oper.setLayout(new GridLayout(4,2,1,1));
  25.   
  26.   b_num=new Button[12];
  27.   for(int i=0;i<9;i++)
  28.   {
  29.                     b_num[i]=new Button(new Integer(i+1).toString());
  30.   }
  31.   b_num[9]=new Button(" 0");
  32.   b_num[10]=new Button(" cls");
  33.   b_num[11]=new Button(" .");
  34.   for(int i=0;i<12;i++)
  35.   {
  36.                     p_num.add(b_num[i]);
  37.   }
  38.   
  39.   b_oper=new Button[8];
  40.   b_oper[0]=new Button(" +");
  41.   b_oper[1]=new Button(" -");
  42.   b_oper[2]=new Button(" *");
  43.   b_oper[3]=new Button(" /");
  44.   b_oper[4]=new Button(" pow");
  45.   b_oper[5]=new Button(" sqrt");
  46.                 b_oper[6]=new Button(" +/-");
  47.   b_oper[7]=new Button(" =");
  48.   for(int i=0;i<8;i++)
  49.   {
  50.                     p_oper.add(b_oper[i]);
  51.   }
  52.   
  53.   t_result.setEditable(false);
  54.   p_show.add(t_result,BorderLayout.NORTH);
  55.   p_main.add(p_show,BorderLayout.NORTH);
  56.   p_main.add(p_num,BorderLayout.WEST);
  57.   p_main.add(p_oper,BorderLayout.EAST);
  58.   this.add(p_main,BorderLayout.CENTER);
  59.   setSize(400,400);
  60.   setResizable(false);
  61.   pack();
  62.   
  63.   this.addWindowListener(new WindowAdapter()
  64.   {
  65.    public void windowClosing(WindowEvent e)
  66.    {
  67.     System.exit(0);
  68.    }
  69.   });
  70.   ButtonListener bl=new ButtonListener();
  71.   for(int i=0;i<12;i++)
  72.   {
  73.    b_num[i].addActionListener(bl);
  74.   }
  75.   for(int i=0;i<8;i++)
  76.   {
  77.    b_oper[i].addActionListener(bl);
  78.   }
  79. }

  80. class ButtonListener implements ActionListener
  81. {
  82.   private String lastOp;
  83.   private String strVal;
  84.   private double total;
  85.   private double number;
  86.   private boolean firsttime;
  87.   private boolean operatorPressed;
  88.   
  89.   ButtonListener()
  90.   {
  91.    firsttime=true;
  92.    strVal="";
  93.   }
  94.   
  95.   public void actionPerformed(ActionEvent e)
  96.   {
  97.    String s=((Button)e.getSource()).getLabel().trim();
  98.    
  99.    if(Character.isDigit(s.charAt(0)))
  100.    {
  101.     handleNumber(s);
  102.    }
  103.    else
  104.    {
  105.     calculate(s);
  106.    }
  107.   }
  108.   
  109.   void calculate(String op)
  110.   {
  111.    operatorPressed=true;
  112.    
  113.    if(firsttime&&!isUnary(op))
  114.    {
  115.     total=getNumberOnDisplay();
  116.     firsttime=false;
  117.    }
  118.    if(isUnary(op))
  119.    {
  120.     handleUnaryOp(op);
  121.    }
  122.    else if(lastOp!=null)
  123.    {
  124.     handleBinaryOp(lastOp);
  125.    }
  126.    if(!isUnary(op))
  127.    {
  128.     lastOp=op;
  129.    }
  130.   }
  131.   
  132.   boolean isUnary(String s)
  133.   {
  134.    return s.equals("=")||s.equals("cls")||s.equals("sqrt")||s.equals("+/-")||s.equals(".");
  135.   }
  136.   
  137.   void handleUnaryOp(String op)
  138.   {
  139.    if(op.equals("+/-"))
  140.    {
  141.     number=negate(getNumberOnDisplay()+"");
  142.     t_result.setText("");
  143.     t_result.setText(number+"");
  144.     return;
  145.    }
  146.    else if(op.equals("."))
  147.    {
  148.     handleDecPoint();
  149.     return;
  150.    }
  151.    else if(op.equals("sqrt"))
  152.    {
  153.     number=Math.sqrt(getNumberOnDisplay());
  154.     t_result.setText("");
  155.     t_result.setText(number+"");
  156.     return;
  157.    }
  158.    else if(op.equals("="))
  159.    {
  160.     if(lastOp!=null&&!isUnary(lastOp))
  161.     {
  162.      handleBinaryOp(lastOp);
  163.     }
  164.     lastOp=null;
  165.     firsttime=true;
  166.     return;
  167.    }
  168.    else
  169.    {
  170.     clear();
  171.    }
  172.   }
  173.   
  174.   void handleBinaryOp(String op)
  175.   {
  176.    if(op.equals("+"))
  177.    {
  178.     total+=number;
  179.    }
  180.    else if(op.equals("-"))
  181.    {
  182.     total-=number;
  183.    }
  184.    else if(op.equals("*"))
  185.    {
  186.     total*=number;
  187.    }
  188.    else if(op.equals("/"))
  189.    {
  190.     try
  191.     {
  192.      total/=number;
  193.     }
  194.     catch(ArithmeticException ae)
  195.     {
  196.     }
  197.    }
  198.    else if(op.equals("pow"))
  199.    {
  200.     total=Math.pow(total,number);
  201.    }
  202.    t_result.setText("");
  203.    lastOp=null;
  204.    strVal="";
  205.    number=0;
  206.    t_result.setText(total+"");
  207.   }
  208.   
  209.   void handleNumber(String s)
  210.   {
  211.    if(!operatorPressed)
  212.    {
  213.     strVal+=s;
  214.    }
  215.    else
  216.    {
  217.     operatorPressed=false;
  218.     strVal=s;
  219.    }
  220.    number=new Double(strVal).doubleValue();
  221.    t_result.setText("");
  222.    t_result.setText(strVal);
  223.   }
  224.   
  225.   void handleDecPoint()
  226.   {
  227.    operatorPressed=false;
  228.    if(strVal.indexOf(".")<0)
  229.    {
  230.     strVal+=".";
  231.    }
  232.    t_result.setText("");
  233.    t_result.setText(strVal);
  234.   }
  235.   
  236.   double negate(String s)
  237.   {
  238.    operatorPressed=false;
  239.    if(number==(int)number)
  240.    {
  241.     s=s.substring(0,s.indexOf("."));
  242.    }
  243.    if(s.indexOf("-")<0)
  244.    {
  245.     strVal="-"+s;
  246.    }
  247.    else
  248.    {
  249.     strVal=s.substring(1);
  250.    }
  251.    return new Double(strVal).doubleValue();
  252.   }
  253.   
  254.   double getNumberOnDisplay()
  255.   {
  256.    return new Double(t_result.getText()).doubleValue();
  257.   }
  258.   
  259.   void clear()
  260.   {
  261.    firsttime=true;
  262.    lastOp=null;
  263.    strVal="";
  264.    total=0;
  265.    number=0;
  266.    t_result.setText("0");
  267.   }
  268. }

  269. public static void main(String args[])
  270. {
  271.   CalcAppDemo c=new CalcAppDemo("简单计算器");
  272.   c.setVisible(true);
  273. }
  274. }
复制代码

[ 本帖最后由 awp 于 2008-11-20 17:29 编辑 ]
 楼主| 发表于 2008-11-19 20:12:40 | 显示全部楼层

回复 1# awp 的帖子

大家分享一下啊~~
发表于 2008-11-19 20:43:09 | 显示全部楼层
支持一下~
提些建议:
a.楼主可以把这种贴发到“java游戏、桌面应用讨论版”
b.源文件编译无法通过(处理Button的代码缺少数组下标)
c.加些注释
d.发贴内容有代码的时候考虑用<code>标签(我也没有用过,具体用法哪位老大补充一下)

[ 本帖最后由 crim 于 2008-11-19 20:47 编辑 ]
 楼主| 发表于 2008-11-19 20:47:31 | 显示全部楼层

回复 3# crim 的帖子

我的在自己机子上调好后才发的,我用的是JCreator,发前我还运行了一下,还是可以的。
我也不知道最好发在哪个吧里面,今天刚注册了。
谢谢你了。
发表于 2008-11-19 20:50:12 | 显示全部楼层
就是"
  1. content
复制代码
"
  1. content
复制代码
而且最好别用系统弹出的“对话框”,直接把代码copy到编辑框的“[code][/code]”之间,这样不会丢格式
发表于 2008-11-19 21:02:10 | 显示全部楼层
麻省理工学院“开放式课程网页” 上 有java实现计算器的课件,可以参考一下

Lecture24.pdf

293.1 KB, 下载次数: 252

课件

Lecture24Supp.zip

4.07 KB, 下载次数: 0

售价: 1 疯狂金币  [记录]  [购买]

java源码

 楼主| 发表于 2008-11-19 21:34:26 | 显示全部楼层

回复 5# darklace 的帖子

谢谢了,刚看了看新的发贴规则
没准我还会被禁三天ккк ккк ккк
发表于 2008-11-20 00:11:13 | 显示全部楼层
帮你编辑了一下,下次注意了
还有你发帖要看版块,你这个应该发到Java游戏、桌面应用讨论版,如果不是看到6楼有文档就移动你这帖子了
代码放在[code][/code]之间,还要注意缩进

[ 本帖最后由 無銘指 于 2008-11-20 00:21 编辑 ]
 楼主| 发表于 2008-11-20 12:48:34 | 显示全部楼层

回复 8# 無銘指 的帖子

我是在JCreator上编辑好,调试过再发上来的,不过我从这再复制到JCreator上,调试怎么就有错了?
发表于 2008-11-20 14:57:26 | 显示全部楼层
最后那里有处乱码,你再编辑一下帖子
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

视频、代码、电子书下载
请关注"疯狂图书"公众号
QQ交流1群: 545923995  未满
微信群请扫二维码
QQ交流1群:
545923995
(未满)

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2019-1-18 01:02 , Processed in 0.457499 second(s), 10 queries , File On.

快速回复 返回顶部 返回列表