当前位置:   article > 正文

Java实训——计算器(四则运算以及其他功能)_java计算器

java计算器

大二下新人java实训实现计算器,其中的代码是参考csdn博主的,注释多是为了方便自己理解,结尾会放文章链接。

以下是代码的一些分析:

细节讲解:

1 单独添加两个按钮Backspace和C:

setLayout()布局管理器,需要精确指定各个组建的大小和位置,就需要用到空布局。

2 网格布局设置按钮:(网上学习的)

使用字符串数组( text2[ ] )存储需要的计算器按钮面板

自定义按钮类数组,定义了一共text2.length个按钮,先用getContentPane()方法获取JFrame的内容面板,然后通过for循环添加按钮,以及实现监听功能。

3 act获取被点击按钮的名称,a获取act的第一个字符,如果是数字且操作符为默认值则继续往strA中添加字符;若操作符不为默认值,则往strB中添加字符

对于绝对值、开平方和回退功能,我用al获取它们的第三个字符,分别是-、r和c,如果识别到al等于对应字符,则进入相应功能。
方法:

append()可以把括号内任意类型的数据添加到字符串缓冲区里面,并返回字符串缓冲区本身。

.valueOf()用于将基本数据类型转换为String类型,补充一点,type不能为null,不然会报空指针异常。

charAt(索引):返回对应索引的字符。

将StringBuffer类型的strA转换为string,再转换为double类型。

不足:

       不能进行三个数及以上的运算:2+2+2

代码:

  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.WindowAdapter;
  6. import java.awt.event.WindowEvent;
  7. //异常处理
  8. class munber_Exception extends Exception{
  9. String e;
  10. public munber_Exception(){}
  11. public munber_Exception(String message){
  12. this.e=message;
  13. }
  14. public String shows(){
  15. return e;
  16. }
  17. }
  18. class cal extends JFrame implements ActionListener {
  19. private JPanel panel;//定义面板对象名
  20. private JTextArea show;//文本区(JTextArea),它是窗体中一个放置文本的区域。
  21. StringBuffer strA;
  22. StringBuffer strB;
  23. char oper ='~';
  24. double A;
  25. double B;
  26. private String[] text2 =
  27. {"7", "8", "9", "/",
  28. "4", "5", "6", "*",
  29. "1", "2", "3", "-",
  30. "0","+/-", ".", "+",
  31. "1/x", "%","sqrt", "=",};//用字符串数组存储计算器按钮面板
  32. private JButton[] munButton = new JButton[text2.length];//自定义按钮类数组
  33. public cal() {
  34. panel = new JPanel();
  35. show = new JTextArea();
  36. strB=new StringBuffer();
  37. strA=new StringBuffer();
  38. }
  39. public void init() {//初始化
  40. //getContentPane()方法和add()方法添加组件(输入框和B、C按钮),再使用网格布局添加余下的数字和操作符按钮
  41. this.setTitle("计算器");
  42. this.setBounds(900, 300, 316, 288);
  43. this.setResizable(false);
  44. show.setBounds(0,0,300,30);
  45. this.getContentPane().add(show);//用getContentPane()方法获得JFrame的内容面板,用add()方法在面板添加输入框
  46. //单独设置两个按钮 Backpace和C
  47. JButton btnCe_1 = new JButton("Backspace");//setLayout()布局管理器,需要精确指定各个组建的大小和位置,就需要用到空布局。
  48. this.getContentPane().setLayout(null);//设置为null布局(空布局)。
  49. // 在已经接入监听器的类中使用addActionListener事件监听器监听按钮
  50. btnCe_1.addActionListener(this);
  51. btnCe_1.setBounds(0, 30, 150, 30);//设置组件在容器中的大小和位置
  52. this.getContentPane().add(btnCe_1);
  53. JButton btnCe = new JButton("C");
  54. btnCe.addActionListener(this);
  55. btnCe.setBounds(150, 30, 150, 30);
  56. this.getContentPane().add(btnCe);
  57. panel.setBounds(0, 60, 300, 190);
  58. panel.setLayout(new GridLayout(5, 4));
  59. this.getContentPane().add(panel);//用getContentPane()方法获得JFrame的内容面板,用add()方法在面板添加
  60. //添加按键
  61. for (int i = 0; i < text2.length; i++) {
  62. munButton[i] = new JButton(text2[i] + " ");
  63. panel.add(munButton[i]);
  64. }
  65. for (int i = 0; i < munButton.length; i++)//实现每个按钮的监听功能
  66. munButton[i].addActionListener(this);
  67. this.setVisible(true);
  68. this.addWindowListener(new WindowAdapter() {
  69. public void windowClosing(WindowEvent e) {
  70. System.exit(0);
  71. }
  72. });
  73. }
  74. //乘法运算
  75. public double division(double x,double y)throws munber_Exception {
  76. if (y == 0) {
  77. throw new munber_Exception("除数不能为0!");
  78. } else {
  79. return x / y;
  80. }
  81. }
  82. //事件触发ActionEvent事件后,监视器调用接口中的方法actionPerformed(ActionEvent e)对发生的事件做出处理
  83. /*因为每按一次按钮就进入处理功能一次,所以a一直在接收按钮传递过来的值.strA和strB用来存储值
  84. 如果a仍为~:则为strA继续添加字符;若不为~,则为strB添加字符;
  85. 若识别到按钮输入的是操作符,则把操作符赋值给a
  86. 若识别到按了=号,则开始运算,strA->A,strB->B使用方法获取A B值,j存储结果
  87. */
  88. public void actionPerformed(ActionEvent e) {
  89. try {
  90. String act=e.getActionCommand();//定义一个字符串获取按钮(组件)名称
  91. char a=act.charAt(0);//使用一个字符a获取act调用charAt(索引)后返回的值 charAt(索引):返回对应索引的字符
  92. char al='P';
  93. if(act.length()>2){
  94. al=act.charAt(2);//取巧:获取第三个值 c - r x
  95. }
  96. if (a=='0' ||a=='1' || a=='2' ||a=='3'||a=='4'||a=='5'||a=='6'||a=='7'||a=='8'||a=='9'||a=='.')
  97. {
  98. if(oper=='~'){
  99. strA.append(a);//.append()可以把括号内任意类型的数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
  100. // .valueOf()用于将基本数据类型转换为String类型,补充一点,type不能为null,不然会报空指针异常
  101. show.setText(String.valueOf(strA));
  102. }
  103. else {
  104. strB.append(a);
  105. show.setText(String.valueOf(strA)+oper+String.valueOf(strB));
  106. }
  107. }
  108. else if(a=='r'){
  109. if(strA.length()>0){
  110. double Al=Double.parseDouble(String.valueOf(strA));//将StringBuffer类型的strA转换为string,再转换为double类型
  111. strA.delete(0,strA.length());
  112. strA.append(Math.sqrt(Al));
  113. show.setText(String.valueOf(strA));
  114. }
  115. }
  116. else if(a=='x'){
  117. if(strA.length()>0){
  118. double xl=Double.parseDouble(String.valueOf(strA));
  119. if(xl==0){show.setText("除数不能为0");}
  120. else{
  121. strA.delete(0,strA.length());
  122. strA.append(1/xl);
  123. show.setText(String.valueOf(strA));}
  124. }
  125. }
  126. else if(al=='-')
  127. {
  128. if(oper=='~'){
  129. if(strA.length()>0){
  130. double lA=Double.parseDouble(String.valueOf(strA));
  131. if(lA>0){
  132. strA.insert(0,'-');
  133. show.setText(String.valueOf(strA));
  134. }
  135. else if(lA==0){show.setText(String.valueOf(strA));}
  136. else{strA.deleteCharAt(0);show.setText(String.valueOf(strA));}
  137. }
  138. }
  139. else{
  140. double lB=Double.parseDouble(String.valueOf(strB));
  141. if(strB.length()>0){
  142. if(lB>0){
  143. strB.insert(0,'-');
  144. show.setText(String.valueOf(strA)+oper+String.valueOf(strB));
  145. }
  146. else if(lB==0){show.setText(String.valueOf(strB));}
  147. else{strB.deleteCharAt(0);show.setText(String.valueOf(strA)+oper+String.valueOf(strB));}
  148. }
  149. }
  150. }
  151. else if(a=='+'||a=='-'||a=='/'||a=='*'||a=='%'){
  152. oper=a;
  153. show.setText(String.valueOf(strA)+oper);
  154. }
  155. else if(a=='='){
  156. A = Double.parseDouble(String.valueOf(strA));//.parseDouble(“字符串”)将字符串值转换为double值。
  157. B = Double.parseDouble(String.valueOf(strB));
  158. double j;
  159. int len1=strA.length();
  160. int len2=strB.length();
  161. if (oper == '+') {
  162. j = A + B;
  163. show.setText(Double.toString(j));
  164. strA.delete(0,len1);
  165. strB.delete(0,len2);
  166. strA.append(j);
  167. } else if (oper == '-') {
  168. j = A - B;
  169. show.setText(Double.toString(j));//toString(Double值)方法用于获取Double value / object的字符串值
  170. strA.delete(0,len1);
  171. strB.delete(0,len2);
  172. strA.append(j);//支持了运算后再运算
  173. } else if (oper == '*') {
  174. j = A * B;
  175. show.setText(Double.toString(j));
  176. strA.delete(0,len1);
  177. strB.delete(0,len2);
  178. strA.append(j);
  179. } else if (oper == '/') {
  180. try{
  181. j= division(A, B);show.setText(Double.toString(j));}
  182. catch(munber_Exception u){
  183. show.setText(u.shows());
  184. }
  185. }
  186. else if (oper == '%') {
  187. j = A % B;
  188. show.setText(Double.toString(j));
  189. strA.delete(0,len1);
  190. strB.delete(0,len2);
  191. strA.append(j);
  192. }
  193. }
  194. else if (a=='C') {
  195. show.setText(" ");
  196. oper='~';
  197. int len1=strA.length();
  198. int len2=strB.length();
  199. strA.delete(0,len1);
  200. strB.delete(0,len2);
  201. }
  202. else if (a=='c'){
  203. if(oper!='~'){
  204. if(strB.length()>0){//有操作符有B
  205. strB.delete(strB.length()-1,strB.length());
  206. show.setText(String.valueOf(strA)+oper+String.valueOf(strB));
  207. }
  208. }
  209. if(oper=='~'){
  210. if(strA.length()>0){
  211. strA.delete(strA.length()-1,strA.length());
  212. show.setText(String.valueOf(strA));
  213. }
  214. }
  215. }
  216. }catch(ArithmeticException m){
  217. System.out.println("除数不能为0");
  218. }
  219. }
  220. }
  221. public class Calculator {
  222. //调用
  223. public static void main(String[] args) {
  224. cal Calculator1 = new cal();
  225. Calculator1.init();
  226. }
  227. }

布局学习:(20条消息) 简单计算器(Java实训)_Chien d'amis的博客-CSDN博客

实现学习:(20条消息) java 简易计算器_︱Harvey︱的博客-CSDN博客(其实就是两个版本的结合体)

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

闽ICP备14008679号