题目:

设计并实现一个类似于windows操作系统附件中自带的计算器的一款简单的计算器,要求界面美观,设计合理;带有常用的菜单并实现其功能;能完成加、减、乘、除等简单的计算,在下面写出其核心代码。

解答:

package Experiment_4;import javax.swing.*;
import java.awt.event.*;
import java.awt.*;public class Clac {static double num1 = 0, num2 = 0;    //定义num1为历史数据,num2为当前数据static char ch = '+'; //定义ch为当前运算符static String s = "";    //定义s为展示的数据static boolean flag = false; //定义flag标志是否刚做完求值运算public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(true);    //设置JFram外观风格JFrame frame = new JFrame("clac");  //创建一个JFrame类顶级容器frame.setSize(400, 600);frame.setLayout(new GridLayout(2,1));//获得顶级容器的内容面板contentPane,只有通过它才能加入其他组件//它属于中间容器JRootPane的一部分Container contentPane = frame.getContentPane();JPanel panel1 = new JPanel();panel1.setSize(400, 120);panel1.setLayout(new GridLayout(1,1));  //设置布局final JLabel label = new JLabel("0",SwingConstants.CENTER);    //创建原子组件Labellabel.setSize(400, 120);//将原子组件添加到中间容器上panel1.add(label);panel1.setBorder(BorderFactory.createLineBorder(Color.black, 2));contentPane.add(panel1, BorderLayout.PAGE_START);//frame.add(panel1, BorderLayout.PAGE_START);JPanel panel2 = new JPanel(); //创建一个JPanel类的中间容器panelpanel2.setBorder(BorderFactory.createLineBorder(Color.black, 3));    //设置边框panel2.setLayout(new GridLayout(6, 4));   //设置布局panel2.setSize(400, 480);//对历史结果进行百分号运算JButton button1 = new JButton("%");button1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num1 *= 0.01; label.setText(Double.toString(num1));}});panel2.add(button1);//清除当前数据JButton button2 = new JButton("CE");button2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s = ""; num2 = 0; label.setText("0");}});panel2.add(button2);//清除当前数据和历史数据JButton button3 = new JButton("C");button3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s = ""; num1 = 0; num2 = 0; ch = '+'; label.setText("0");}});panel2.add(button3);//清除当前数据的末位数字JButton button4 = new JButton("<x");button4.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s = s.substring(0, s.length() - 1); label.setText(s);}});panel2.add(button4);//对历史数据进行求倒数运算JButton button5 = new JButton("1/x");button5.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num1 = 1/num1; label.setText(Double.toString(num1));}});panel2.add(button5);//对历史数据进行求平方运算JButton button6 = new JButton("x^2");button6.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num1 *= num1; label.setText(Double.toString(num1));}});panel2.add(button6);//对历史数据进行求平方运算JButton button7 = new JButton("2√x");button7.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num1 = Math.sqrt(num1); label.setText(Double.toString(num1));}});panel2.add(button7);//将历史数据与当前数据进行除运算JButton button8 = new JButton("/");button8.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); ch = '/'; s = ""; label.setText("/");}});panel2.add(button8);//输入数字7JButton button9 = new JButton("7");button9.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "7"; label.setText(s);}});panel2.add(button9);//输入数字8JButton button10 = new JButton("8");button10.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "8"; label.setText(s);}});panel2.add(button10);//输入数字9JButton button11 = new JButton("9");button11.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "9"; label.setText(s);}});panel2.add(button11);//将历史数据与当前数据进行乘运算JButton button12 = new JButton("*");button12.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); ch = '*'; s = ""; label.setText("*");}});panel2.add(button12);//输入数字4JButton button13 = new JButton("4");button13.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "4"; label.setText(s);}});panel2.add(button13);//输入数字5JButton button14 = new JButton("5");button14.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "5"; label.setText(s);}});panel2.add(button14);//输入数字6JButton button15 = new JButton("6");button15.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "6"; label.setText(s);}});panel2.add(button15);//将历史数据与当前数据进行减运算JButton button16 = new JButton("-");button16.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); ch = '-'; s = ""; label.setText("-");}});panel2.add(button16);//输入数字1JButton button17 = new JButton("1");button17.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "1"; label.setText(s);}});panel2.add(button17);//输入数字2JButton button18 = new JButton("2");button18.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "2"; label.setText(s);}});panel2.add(button18);//输入数字3JButton button19 = new JButton("3");button19.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "3"; label.setText(s);}});panel2.add(button19);//将历史数据与当前数据进行加运算JButton button20 = new JButton("+");button20.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); ch = '+'; s = ""; label.setText("+");}});panel2.add(button20);//对当前数据进行求相反数操作JButton button21 = new JButton("+/-");button21.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {if(s == "") s = "-"; else if(s == "-") s = ""; else {num2 = toNum(s); num2 = -num2; s = Double.toString(num2);} label.setText(s);}});panel2.add(button21);//输入数字0JButton button22 = new JButton("0");button22.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {s += "0"; label.setText(s);}});panel2.add(button22);//输入小数点JButton button23 = new JButton(".");button23.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {if(s == "") s += "0"; s += "."; label.setText(s);}});panel2.add(button23);//求运算结果JButton button24 = new JButton("=");button24.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {num2 = toNum(s); num1 = operation(num1, num2, ch); s = ""; flag = true; label.setText(Double.toString(num1));}});panel2.add(button24);contentPane.add(panel2); //将中间容器通过内容面板添加到顶层容器上//frame.pack();    //对组件进行排列frame.setVisible(true);    //显示frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   //关闭此GUI则关闭程序}//将当前输入框中的String数据s转化为double型的数据numpublic static double toNum(String s) {double num1 = 0;int i = 0;boolean flag = true;if(s == "") s += '0';   //若s为空则将其置零if(s.charAt(0) == '-')   //若首位为符号则做标记,并将下标后移{flag = false;i++;}for(; i < s.length() && s.charAt(i) != '.'; i++)    //转化整数部分{num1 = num1 * 10 + (s.charAt(i) - '0');}if(i == s.length())  //若无小数部分则直接返回{if(flag) return num1;else return -num1;}double num2 = 0; //转化小数部分for(int j = s.length() - 1; j > i; j--){num2 = (num2 + (s.charAt(j) - '0')) / 10;}double num = num1 + num2;   //将整数部分与小数部分相加if(flag) return num;else return -num;}//运算方法,用于计算加减乘除public static double operation(double num1, double num2, char ch) {double num = 0;switch(ch) {case '+':if(flag) {num = num1 + 0; flag = false;}num = num1 + num2;break;case '-':if(flag) {num = num1 - 0; flag = false;}num = num1 - num2;break;case '*':if(flag) {num = num1 * 1; flag = false;}else num = num1 * num2;break;case '/':if(flag) {num = num1 / 1; flag = false;}else num = num1 / num2;break;}return num;}
}/*待改进:1. 加减乘除运算键只能按一次,如果刚按完'+'发现按错了,想修改为'-',不能直接再点一次'-',只能让它先+0,保持它的值不变,再进行减运算2. 部分运算都带有限制,如'%','1/x'等运算,只能针对历史记录进行运算,'+/-'运算只能针对当前数据等3. 使用JLabel只能显示当前输入的一行数据,不能像电脑计算器一样显示所有的历史运算记录4. 界面不够美观5. 由于计算涉及到小数运算,所以必须使用double类型,这也注定了其存在一定的精度亏损问题,可能会出现一个数先开根再平方,前后两个数字理论上相同,但实际有一定误差的情况6. 将顶层容器frame分成两部分似乎是平均分的,尚不清楚在哪里修改使它变成上半部分高为120px,下半部分高为480px
*/

成果展示:

待改进:

1. 加减乘除运算键只能按一次,如果刚按完'+'发现按错了,想修改为'-',不能直接再点一次'-',只能让它先+0,保持它的值不变,再进行减运算
2. 部分运算都带有限制,如'%','1/x'等运算,只能针对历史记录进行运算,'+/-'运算只能针对当前数据等
3. 使用JLabel只能显示当前输入的一行数据,不能像电脑计算器一样显示所有的历史运算记录
4. 界面不够美观
5. 由于计算涉及到小数运算,所以必须使用double类型,这也注定了其存在一定的精度亏损问题,可能会出现一个数先开根再平方,前后两个数字理论上相同,但实际有一定误差的情况
6. 将顶层容器frame分成两部分似乎是平均分的,尚不清楚在哪里修改使它变成上半部分高为120px,下半部分高为480px

欢迎大家探讨

4 设计计算器clac-Java相关推荐

  1. 简单计算器的设计java_(基于java的简易计算器的设计.doc

    (基于java的简易计算器的设计 基于java的简易计算器的设计 摘要 自从java语言诞生以来,java语言就以不可抵挡的趋势很快成为国际上广泛流行的面向对象编程语言,它既具有高级语言的特点,又少了 ...

  2. 计算器小程序java课程设计,java课程设计----计算器小程序报告.doc

    java课程设计----计算器小程序报告.doc #####学院JAVA语言课程设计报告小程序计算器系统管理班级:#######姓名:#####指导老师:###时间:2012年6月25日至6月29日2 ...

  3. java质数和合数的程序_《java项目实训》课程设计计算器.doc

    <java项目实训>课程设计计算器.doc 课程设计报告课程名称JAVA项目实训课程设计设计名称基于JAVA计算器的设计与实现学生学号学生姓名学生学号学生姓名学生学号学生姓名学生学号学生姓 ...

  4. java课程设计 计算器_java课程设计-保存计算过程的计算器

    java课程设计-保存计算过程的计算器 编号: <面向对象程序设计(JAVA) > 课程设计(论文)档案 题 目: 保存计算过程的计算器 学 院: 信息学院 专 业: 姓 名: 学 号: ...

  5. 《多功能计算器》 Java程序设计 课程设计

    <多功能计算器> Java程序设计 课程设计 目 录 1. 需求分析 1.1 问题描述 1.2 设计要求 1.3 设计的目标 2. 总体设计 2.1 设计思路 2.2 算法的流程图 3. ...

  6. Java课程设计——计算器

    目录 简介: 一.基本要求 二.功能实现 三.设计思路 四.具体步骤操作 五.具体代码内容展示 1.设计计算器窗口,提供了基本的界面组件以及按钮的设置和添加. 2.部分按钮的功能实现 3.三角函数计算 ...

  7. 简单计算器(Java实训)

    简单计算器(Java实训) 实训目的: 掌握 Java GUI 开发中的布局管理和事件处理机制. 实训要求: (1)要使用 java 的 GUI 设计出计算器界面.(2)通过界面 按钮,可以实现整数或 ...

  8. 数据库管理系统设计Java源代码_《数据库应用》课程设计人事管理系统(java源代码)...

    <数据库应用>课程设计人事管理系统(java源代码) <数据库应用>课程设计人事管理系统(java源代码) <数据库应用>课程设计--人事管理系统(java源代码) ...

  9. 网络交互式-计算器程序-Java程序设计

    网络交互式-计算器程序: -----兰州大学 Java课程设计 1.要求: 利用GUI编程技术.网络编程技术.输入输出流技术,编写一个基于C/S的计算器软件.前台为类似于图1的图形界面,主要解决输入界 ...

  10. Atitit.导出excel报表的设计与实现java .net php 总

    Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...

最新文章

  1. A and B and Lecture Rooms CodeForces - 519E LCA+dfs序
  2. Unix的轻巧“约取而实得”(上篇)
  3. 排除hotnews主题内容页面上的热点图片推荐里的分类-hotnews主题top_hot.php
  4. 拒绝平庸--浅谈WEB登录页面设计
  5. Java 8默认方法可能会破坏您的(用户)代码
  6. 无符号数和有符号数之间赋值和大小比较
  7. Data Guard Service 相关介绍
  8. 【Office】Microsoft Office下载地址合集(微软官方原版离线安装下载)
  9. 数独游戏——数模处理(MATLAB整数规划)
  10. C语言洛谷P1957口算练习题
  11. css怎么写数字序号,CSS自动加序号-多种有序列表数字序号
  12. 40页PPT详解:京东大数据基础构架与创新应用
  13. 洛夏墨迹测验(Rorschach Inkblot Test)
  14. java 栈的输出顺序,栈在Java类库中的顺序表示及实现——Stack
  15. 使用Java编写欧式期权理论理论计算公式
  16. GDR-Net: Geometry-Guided Direct Regression Network for Monocular 6D Object Pose Estimati
  17. php mysql 聊天室_聊天室phpmysql(二)_php
  18. Iptables DNAT实现broadcast与unicast之间相互映射
  19. 微软黑科技:DNA存储技术催生方糖大小的数据中心
  20. Python学习,元类type 反射 函数与方法 双下方法

热门文章

  1. 通过log中的kill reson来定位应用是被谁杀掉的
  2. NFT梦一场:跌破发行价,陷入流动性危机
  3. 中国纺织业对“一带一路”沿线国家出口数据(含64个国家经纬度数据)
  4. 字典树应用——词频统计 (C++实现)
  5. 2680 争渡(递推)
  6. No.017 <软考>《(高项)备考大全》【第02章】信息系统项目管理基础
  7. 基于NPOI用C#开发的Excel以及表格设置
  8. java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)
  9. python图形界面化编程GUI(一)窗口管理和常用的组件(Label、Button、Entry)
  10. 房屋出租系统(链表实现)