当前位置:   article > 正文

Java简单计算器界面及功能的实现_java实现计算器界面及功能

java实现计算器界面及功能

实验要求

        编写计算器界面并实现其功能。

实验步骤

1.界面基本样式绘制

代码实现

  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class f_frame extends JFrame{
  4. public f_frame()
  5. {
  6. //创建界面,设置其大小为固定值,宽900,高650,使整个界面都可以正常显示
  7. JFrame f=new JFrame("计算器");
  8. f.setSize(900, 650);
  9. Container con=f.getContentPane();
  10. //创建1个底色为白色的JPanel,设置其格式为固定格式(即可以自定义的格式)
  11. JPanel p=new JPanel();
  12. p.setBackground(Color.white);
  13. p.setLayout(null);
  14. //新建名为text的JTextField文本框位置,用于点击是数字的实时变化显示以及最终的结果显示
  15. //并将其可编辑性设置为用户不可编辑,设置其长宽以及背景颜色。
  16. JTextField text=new JTextField("");
  17. text.setEditable(false);
  18. text.setBackground(new Color(221, 221, 221)); //背景色--灰色
  19. text.setBounds(100, 50, 700, 50);
  20. p.add(text); //添加到JPanel中
  21. //创建JButton数组,包含界面从左到右、自上而下的所有按钮
  22. JButton[] buttongroup= {
  23. new JButton("7"), new JButton("8"), new JButton("9"),
  24. new JButton("/"),new JButton("CE"),
  25. new JButton("4"), new JButton("5"), new JButton("6"),
  26. new JButton("*"),new JButton("="),
  27. new JButton("1"), new JButton("2"), new JButton("3"),
  28. new JButton("-"),
  29. new JButton("0"), new JButton("."),
  30. new JButton("+")
  31. };
  32. //遍历JButton数组,设置每个按钮的颜色、字体字号以及具体位置
  33. for(int i=0; i<buttongroup.length; i++){
  34. JButton b1=buttongroup[i];
  35. b1.setBackground(new Color(204, 204, 255));
  36. b1.setFont(new Font("宋体", Font.BOLD, 25));
  37. //位置逻辑,“=”和“0”特判,占据空间略大,其余长宽一致,规律放置
  38. if(i<9){
  39. if(i<5) b1.setBounds(100+150*i, 150, 100, 50);
  40. else b1.setBounds(100+150*(i-5), 250, 100, 50);
  41. }
  42. else if(i==9)
  43. b1.setBounds(100+150*(i-5), 250, 100, 250);
  44. else if(i==14)
  45. b1.setBounds(100, 450, 250, 50);
  46. else {
  47. if(i<14) b1.setBounds(100+150*(i-10), 350, 100, 50);
  48. else b1.setBounds(100+150*(i-13), 450, 100, 50);
  49. }
  50. p.add(b1);
  51. }
  52. //待添加,单击事件
  53. //向界面中添加JPanel变量,并设置界面可见性为true
  54. con.add(p);
  55. f.setVisible(true);
  56. //最后设置界面可见性,否则将会出现加载不到界面内容,必须有鼠标事件才能成功加载的现象发生。
  57. }
  58. //主函数,创建界面
  59. public static void main(String args[])
  60. {
  61. f_frame page=new f_frame();
  62. }
  63. }

结果展示

 2.响应事件的添加以及计算功能的实现

代码实现

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.text.DecimalFormat;
  4. import javax.swing.*;
  5. import javax.xml.soap.Text;
  6. public class f_frame extends JFrame implements ActionListener{
  7. //由于text内容需要改变,下面会用到,因此需要拎出来
  8. //新建名为text的JTextField文本框位置,用于点击是数字的实时变化显示以及最终的结果显示
  9. JTextField text=new JTextField("");
  10. public f_frame()
  11. {
  12. //创建界面,设置其大小为固定值,宽900,高650,使整个界面都可以正常显示
  13. JFrame f=new JFrame("计算器");
  14. f.setSize(900, 650);
  15. Container con=f.getContentPane();
  16. //创建1个底色为白色的JPanel,设置其格式为固定格式(即可以自定义的格式)
  17. JPanel p=new JPanel();
  18. p.setBackground(Color.white);
  19. p.setLayout(null);
  20. //并将text可编辑性设置为用户不可编辑,设置其长宽以及背景颜色。
  21. text.setEditable(false);
  22. text.setBackground(new Color(221, 221, 221)); //背景色--灰色
  23. text.setBounds(100, 50, 700, 50);
  24. text.setFont(new Font("宋体", Font.BOLD, 25));
  25. text.setHorizontalAlignment(JTextField.RIGHT); //右对齐
  26. p.add(text); //添加到JPanel中
  27. //创建JButton数组,包含界面从左到右、自上而下的所有按钮
  28. JButton[] buttongroup= {
  29. new JButton("7"), new JButton("8"), new JButton("9"),
  30. new JButton("/"),new JButton("CE"),
  31. new JButton("4"), new JButton("5"), new JButton("6"),
  32. new JButton("*"),new JButton("="),
  33. new JButton("1"), new JButton("2"), new JButton("3"),
  34. new JButton("-"),
  35. new JButton("0"), new JButton("."),
  36. new JButton("+")
  37. };
  38. //遍历JButton数组,设置每个按钮的颜色、字体字号以及具体位置
  39. for(int i=0; i<buttongroup.length; i++){
  40. JButton b1=buttongroup[i];
  41. b1.setBackground(new Color(204, 204, 255));
  42. b1.setFont(new Font("宋体", Font.BOLD, 25));
  43. b1.addActionListener(this);
  44. //位置逻辑,“=”和“0”特判,占据空间略大,其余长宽一致,规律放置
  45. if(i<9){
  46. if(i<5) b1.setBounds(100+150*i, 150, 100, 50);
  47. else b1.setBounds(100+150*(i-5), 250, 100, 50);
  48. }
  49. else if(i==9)
  50. b1.setBounds(100+150*(i-5), 250, 100, 250);
  51. else if(i==14)
  52. b1.setBounds(100, 450, 250, 50);
  53. else {
  54. if(i<14) b1.setBounds(100+150*(i-10), 350, 100, 50);
  55. else b1.setBounds(100+150*(i-13), 450, 100, 50);
  56. }
  57. p.add(b1);
  58. }
  59. //向界面中添加JPanel变量,并设置界面可见性为true
  60. con.add(p);
  61. f.setVisible(true);
  62. //最后设置界面可见性,否则将会出现加载不到界面内容,
  63. //必须有鼠标事件才能成功加载的现象发生。
  64. }
  65. //由于优先级的不同,算式中最多需要保留3个操作数,
  66. //分别按顺序记作num1, num2, num3,初始值为0
  67. //point变量存储当前按键
  68. double num1=0.0, num2=0.0, num3=0.0, point=1.0;
  69. //操作符用int型数据表1:+, 2:-, 3:*, 4:\
  70. //op存储上一操作符, op_now存储当前读入操作符,
  71. //op_greater存储优先级较高的后面的操作符
  72. int op=0, op_now=0, op_greater=0;
  73. //标志设计
  74. Boolean flag_num=false; //true:num1输入完毕 false:num2尚未输入完毕
  75. Boolean flag_point=false; //true:当前数字有小数点 false:当前数字无小数点
  76. Boolean flag_mistake=false; //true:输入存在错误 false:输入尚不存在错误
  77. Boolean flag_begin=false;
  78. //true:从上一次输入符号(非等号)起,已经按下某(或某些)数字
  79. Boolean flag_greater=false; //true:有较高的优先级计算须先处理
  80. Boolean flag_end=false; //true:上一个按下的按键是"=",结束了一次计算
  81. //响应按钮事件的函数
  82. //采用按键实时计算的方式,考虑算符优先级的影响
  83. public void actionPerformed(ActionEvent e)
  84. {
  85. //捕获事件来源
  86. JButton btn=(JButton) e.getSource();
  87. //上一次按键出错,再次按键需更新错误信息。设置文本为空
  88. if(flag_mistake)
  89. {
  90. flag_mistake=false;
  91. text.setText("");
  92. }
  93. //获取事件来源按键的内容,方便后续操作
  94. String s=btn.getText();
  95. switch(btn.getText())
  96. {
  97. case "CE":
  98. //按下清空键,设置各标志以及各项纪录数据为初始状态,设置文本框内容为空
  99. flag_point=flag_num=flag_mistake=flag_begin=flag_greater=flag_end=false;
  100. num1=num2=num3=0.0; point=1.0; op=0;
  101. text.setText("");
  102. break;
  103. case "0": case "1": case "2": case "3": case "4":
  104. case "5": case "6": case "7": case "8": case "9":
  105. //按下数字键,首先已有数字键入,更新flag_begin标志
  106. flag_begin=true;
  107. //假设上一按下按键为"=",再次按下数字后,更新文本按下数字,恢复flag_end标志为0
  108. //假设不成立,则在文本框内容后附加该数字即可
  109. if(flag_end==true)
  110. {
  111. text.setText(btn.getText());
  112. flag_end=false;
  113. }
  114. else text.setText(text.getText()+btn.getText());
  115. //该数字已经输入小数点后,需要更新小数位数
  116. if(flag_point)
  117. point=0.1*point;
  118. //根据flag_greater、flag_num的信息更新存储的数字
  119. if(flag_greater) num3=num3*10+s.charAt(0)-'0';
  120. else if(!flag_num) num1=num1*10+s.charAt(0)-'0';
  121. else num2=num2*10+s.charAt(0)-'0';
  122. // System.out.print(num1+" "+num2+" "+num3+"\n");
  123. break;
  124. case ".":
  125. //在小数点前没有按下任何数字,则在前面补0
  126. if(flag_begin==false) text.setText("0");
  127. //跟新flag_point并向文本框中添加小数点
  128. if(!flag_point) //条件是为了避免同一数字输入过多小数点
  129. {
  130. flag_point=true;
  131. text.setText(text.getText()+".");
  132. }
  133. break;
  134. default:
  135. //输入符号时,检查操作数是否足够,不够则报错并相应进行标志及存储数据的设置
  136. //然后对个存储数据进行小数化的处理,若有高优先级的运算须先进行,也在这里处理
  137. if(flag_begin==false)
  138. {
  139. text.setText("mistack!need more number!");
  140. flag_mistake=true;
  141. flag_point=flag_num=flag_greater=flag_end=false;
  142. num1=num2=num3=0.0; point=1.0; op=0;
  143. }
  144. else
  145. {
  146. if(flag_greater) num3=point*num3;
  147. else if(!flag_num) num1=point*num1;
  148. else num2=point*num2;
  149. //恢复小数位数标定 设置数据num1以获取以及小数重新开始计的相关标志
  150. point=1.0;
  151. flag_num=true; flag_point=false;
  152. //计算需要先进行的高优先级计算段
  153. if(flag_greater)
  154. {
  155. num2=mul(num2, num3, op_greater);
  156. num3=0.0;
  157. flag_greater=false;
  158. }
  159. }
  160. }
  161. if(flag_begin)
  162. {
  163. flag_begin=false;
  164. //若按键为"+" "-" "*"或"\"则记录当前操作符
  165. //若按键为"=",则完成最后一次计算并显示结果
  166. switch(btn.getText())
  167. {
  168. case "+":
  169. text.setText(text.getText()+"+");
  170. op_now=1; break;
  171. case "-":
  172. text.setText(text.getText()+"-");
  173. op_now=2; break;
  174. case "*":
  175. text.setText(text.getText()+"*");
  176. op_now=3;
  177. break;
  178. case "/":
  179. text.setText(text.getText()+"/");
  180. op_now=4;
  181. break;
  182. case "=":
  183. // System.out.println(num1+" "+num2+" ");
  184. if(op!=0)
  185. {
  186. num1=mul(num1, num2, op);
  187. num2=0.0;
  188. }
  189. if(!flag_mistake)
  190. text.setText(String.valueOf(new DecimalFormat("0.0000").format(num1)));
  191. op=0; point=1.0;
  192. flag_end=true;
  193. break;
  194. default: flag_begin=true;
  195. //最终效果:+-*\=号,则flag_begin为false,否则为true
  196. }
  197. //进行优先级比较以及计算简化的操作
  198. if(!flag_begin&&btn.getText()!="=")
  199. {
  200. if(op==0) op=op_now; //第一个算符不需要任何多余操作,存下来就行了
  201. else if(op_now>=3&&op<3)
  202. {
  203. //若当前算符优先级大于前一算符,
  204. op_greater=op_now;
  205. flag_greater=true;
  206. }
  207. else
  208. {
  209. //否则,完成前一算符的计算,将结果更新到num1,设置num2为0,更新算符
  210. num1=mul(num1, num2, op);
  211. num2=0.0;
  212. op=op_now;
  213. flag_greater=false;
  214. }
  215. }
  216. }
  217. }
  218. //真正进行计算的模块
  219. //传参:a为第一操作数,b为第二操作数,operator为算符(1:+, 2:-, 3:*, 4:\)
  220. public double mul(double a, double b, int operator)
  221. {
  222. // System.out.print(a+" "+b+"\n");
  223. double ans=0.0; //ans用于存储要返回的计算结果
  224. switch(operator)
  225. {
  226. case 1: ans=a+b; break;
  227. case 2: ans=a-b; break;
  228. case 3: ans=a*b; break;
  229. case 4:
  230. //除法党除数为0时进行报错,设置相应的标志以及状态为恢复初始状态
  231. if(b!=0) ans=a/b;
  232. else
  233. {
  234. System.out.println("mistake accoure");
  235. text.setText("mistack!devise 0!");
  236. flag_mistake=true;
  237. flag_point=flag_num=flag_begin=flag_greater=flag_end=false;
  238. num1=num2=num3=0.0; point=1.0; op=0;
  239. }
  240. }
  241. return ans;
  242. }
  243. //主函数,创建界面
  244. public static void main(String args[])
  245. {
  246. f_frame page=new f_frame();
  247. }
  248. }

测试过程及结果

测试点1:除0处理:
算式设计:23+4/0-2=
依次按下”2”、”3”、”+”、”4”、”/”、”0”均正常。如下图所示:

当按下”-”号时,文本框显示报错信息:

 

测试点2:未按数字,直接按算符键,或连续按下两次算符键
算式设计:+
按下+号,显示结果为:

 

测试点3:正常的不涉及优先级及小数的运算:
算式设计:5+168-189=
显示结果:

 

测试点4:正常的涉及优先级以及小数的运算:
算式设计:78+69*3/2-77.25=
显示结果:

 测试点5:
CE键的使用(涉及小数,优先级)
算式设计:在上述测试点4的基础上按下“CE”键。
结果显示:

 测试结论:

        代码执行正常,可正常完成各项计算工作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/275767
推荐阅读
相关标签
  

闽ICP备14008679号