当前位置:   article > 正文

java计算器gui(有三角函数,幂运算)_private class number extends windowadapter impleme

private class number extends windowadapter implements actionlistener

这个是真的简单的计算器,看到网上很多,现学了一些swing,时间紧,自己又菜,这个计算器,有很多限制,只能计算一些特别简单的计算,比如(2+3+4)是不行的,只能2+3,在网上我也看了很多计算器,但是找到带三角函数的,幂运算,基本上代码实现的比较复杂,我觉得既然都很难去理解,觉得没必要去复制粘贴。我的这个嘞,里面也有抛出异常(一个是除数为0还有一个是开放为负数),这个开方为负数,当时读取的时候回把这个负号当成减号,然后输入sqrt-5会报错(正常情况应该是输出NaN,然后控制台抛出异常),所以我就全换成elseif (原来全是if),把判断减法的那个条件放在了开方条件的后面,这样就可以了。

这个计算器的输入格式:2+3

sin90

2^3

  1. /*
  2. *@小姚
  3. *写的不好,很多bug,很多限制,才学的,所以不懂,加了特别多的注释
  4. */
  5. import java.awt.*;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.awt.event.WindowAdapter;
  9. import java.awt.event.WindowEvent;
  10. import javax.swing.*;
  11. public class Calculator extends JFrame {
  12. private final String[] FH = { "+", "-", "*", "/", ".", "=", "C", "sin", "cos", "tan", "^", "log","sqrt","<-" };
  13. CharSequence FHH[] = { "+", "-", "*", "/" };
  14. private JPanel btjp = new JPanel();// 创建面板容器
  15. private JTextField jt = new JTextField();// 创建文本框
  16. public Calculator(String title) {
  17. super(title);
  18. btjp.setLayout(new GridLayout(6, 4, 20, 5));// 定义面板,并设置为网格布局,5行4列,组件水平距离为20,垂直距离为5
  19. JButton[] JBtn_1 = new JButton[10];
  20. JButton[] JBtn_2 = new JButton[FH.length];
  21. for (int i = 0; i <= 9; i++)
  22. JBtn_1[i] = new JButton(String.valueOf(i));// 数字按键
  23. for (int i = 0; i <= 9; i++) {
  24. JBtn_1[i].setFont(new Font("宋体", Font.BOLD, 30));// 给数字按键调整字体大小
  25. }
  26. for (int i = 0; i < FH.length; i++)
  27. JBtn_2[i] = new JButton(String.valueOf(FH[i]));// 符号按键
  28. for (int i = 0; i < FH.length; i++) {
  29. //System.out.println(FH[i]);
  30. JBtn_2[i].setFont(new Font("宋体", Font.BOLD, 30));// 给符号按键调整字体大小
  31. }
  32. // 把这些按钮按照事先排好的顺序,按在面板容器
  33. btjp.add(JBtn_1[1]);
  34. btjp.add(JBtn_1[2]);
  35. btjp.add(JBtn_1[3]);
  36. btjp.add(JBtn_2[0]);
  37. btjp.add(JBtn_1[4]);
  38. btjp.add(JBtn_1[5]);
  39. btjp.add(JBtn_1[6]);
  40. btjp.add(JBtn_2[1]);
  41. btjp.add(JBtn_1[7]);
  42. btjp.add(JBtn_1[8]);
  43. btjp.add(JBtn_1[9]);
  44. btjp.add(JBtn_2[2]);
  45. btjp.add(JBtn_2[4]);
  46. btjp.add(JBtn_1[0]);
  47. btjp.add(JBtn_2[6]);
  48. btjp.add(JBtn_2[3]);
  49. for (int i = 5; i < FH.length; i++)
  50. btjp.add(JBtn_2[i]);
  51. // btjp.add(JBtn_2[5]);
  52. // btjp.add(JBtn_2[6]);
  53. // btjp.add(JBtn_2[7]);
  54. // btjp.add(JBtn_2[8]);
  55. // btjp.add(JBtn_3[0]);
  56. jt.setHorizontalAlignment(JTextField.RIGHT);// 文本框内容右侧对齐
  57. jt.setFont(new Font("宋体", Font.BOLD, 30));
  58. // JBtn_1[2].setFont(new Font("宋体",Font.BOLD,30));
  59. jt.setPreferredSize(new Dimension(200, 100));// 文本框为宽200,长100
  60. // 以下this是指主窗口JFrame
  61. this.add(jt, BorderLayout.NORTH);// 将文本框放在靠北的地方
  62. this.add(btjp, BorderLayout.CENTER);// 将面板容器放在中央
  63. this.setSize(600, 600);// 设置主窗口的大小
  64. this.setResizable(true);// 表示生成的窗体能够是否有用户改变大小,false表示不能,true代表能
  65. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 使用 System exit 方法退出应用程序。
  66. this.setVisible(true);
  67. // etVisible(true)并不是告诉JVM让该控件可见,而是在内部调用repaint方法把各个控件画出来进行显示。
  68. // 如果在控件还没完全添加完其他控件就setVisible(true)那么在方法后面添加的控件都不能显示
  69. for (int i = 0; i <= 9; i++)
  70. JBtn_1[i].addActionListener(new number());// 为事件源增加监听器
  71. for (int i = 0; i < FH.length; i++)
  72. JBtn_2[i].addActionListener(new number());
  73. }
  74. private class number extends WindowAdapter implements ActionListener {// 重写监听器里面的内容
  75. public void actionPerformed(ActionEvent e) {// 这个是ActionListener这个接口里面的方法,监听器里的方法
  76. // TODO Auto-generated method stub
  77. // getActionCommand()依赖于按钮上的字符串
  78. // getSource得到的组件的名称,而getActionCommand得到的是标签。
  79. // 如:Button bt=new Button("buttons");
  80. // 用getSource得到的是bt 而用getActionCommand得到的是:buttons
  81. if (!e.getActionCommand().equals("=") && !e.getActionCommand().equals("C")&&!e.getActionCommand().equals("<-")) {
  82. jt.setText(jt.getText() + e.getActionCommand());// 在文本框中显示
  83. } //
  84. else if(e.getActionCommand().equals("<-")) {
  85. String Formula = jt.getText();
  86. int len = Formula.length();
  87. if(len!=0) {
  88. String s = String.valueOf(Formula.substring(0,len-1));
  89. jt.setText(s);
  90. }
  91. }
  92. else if (e.getActionCommand().equals("=")) {
  93. String Formula = jt.getText();
  94. if (Formula.contains(FHH[0])) {// java中contains方法是判断是否存在包含关系的,
  95. // 1.java中String元素下标从0开始,substring(a)是从第a个字符开始截取,包含第a个字符。可以看成数学中的[ ),表示左闭右开区间
  96. // 2.substring(a, b)表示截取下标从a开始到b结束的字符,包含第a个字符但是不包含第b个字符,可以看成[a,b)。
  97. // Double.parseDouble方法是把数字类型的字符串,转换成double类型
  98. // Double.valueOf方法是把数字类型的字符串,转换成Double类型
  99. double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('+')));
  100. double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('+') + 1));
  101. jt.setText(String.valueOf(number_1 + number_2));
  102. }
  103. else if (Formula.contains(FHH[2])) {
  104. double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('*')));
  105. double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('*') + 1));
  106. jt.setText(String.valueOf(number_1 * number_2));
  107. }
  108. else if (Formula.contains(FHH[3])) {
  109. double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('/')));
  110. double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('/') + 1));
  111. try {
  112. check(number_1, number_2);
  113. } catch (YiChangException e1) {
  114. // TODO Auto-generated catch block
  115. e1.printStackTrace();
  116. }
  117. jt.setText(String.valueOf(number_1 / number_2));
  118. }
  119. else if (Formula.contains("sin")) {
  120. double number = Double.parseDouble(Formula.substring(Formula.indexOf('n') + 1));
  121. double a = Math.toRadians(number);
  122. jt.setText(String.valueOf(Math.sin(a)));
  123. }
  124. else if (Formula.contains("cos")) {
  125. double number = Double.parseDouble(Formula.substring(Formula.indexOf('s') + 1));
  126. double a = Math.toRadians(number);
  127. jt.setText(String.valueOf(Math.cos(a)));
  128. }
  129. else if (Formula.contains("tan")) {
  130. double number = Double.parseDouble(Formula.substring(Formula.indexOf('n') + 1));
  131. double a = Math.toRadians(number);
  132. jt.setText(String.valueOf(Math.tan(a)));
  133. }
  134. else if (Formula.contains("^")) {
  135. double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('^')));
  136. double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('^') + 1));
  137. jt.setText(String.valueOf(Math.pow(number_1, number_2)));
  138. }
  139. else if (Formula.contains("log")) {
  140. double number = Double.parseDouble(Formula.substring(Formula.indexOf('g') + 1));
  141. jt.setText(String.valueOf(Math.log(number)));
  142. }
  143. else if (Formula.contains("sqrt")) {
  144. double number = Double.parseDouble(Formula.substring(Formula.indexOf('t') + 1));
  145. if(number<0)System.out.println("skadh");
  146. try {
  147. check2(number);
  148. } catch (YiChangException2 e1) {
  149. // TODO Auto-generated catch block
  150. e1.printStackTrace();
  151. }
  152. jt.setText(String.valueOf(Math.sqrt(number)));
  153. }
  154. else if (Formula.contains(FHH[1])) {
  155. double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('-')));
  156. double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('-') + 1));
  157. jt.setText(String.valueOf(number_1 - number_2));
  158. }
  159. } else {
  160. jt.setText(null);
  161. }
  162. }
  163. }
  164. void check(double x, double y) throws YiChangException {
  165. if (y == 0) {
  166. throw new YiChangException("您输入的分母为0,不能进行除法运算");
  167. } else
  168. return;
  169. }
  170. void check2(double x) throws YiChangException2 {
  171. if (x<0) {
  172. throw new YiChangException2("您输入的数为负数,不能进行开方运算");
  173. } else
  174. return;
  175. }
  176. public static void main(String[] args) {
  177. new Calculator("炒鸡简单的计算器");
  178. }
  179. }
  180. class YiChangException2 extends Exception {
  181. public YiChangException2() {
  182. }
  183. public YiChangException2(String message) {
  184. super(message);
  185. }
  186. }
  187. class YiChangException extends Exception {
  188. public YiChangException() {
  189. }
  190. public YiChangException(String message) {
  191. super(message);
  192. }
  193. }

 

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

闽ICP备14008679号