[Java] 计算器 →→→→→进入此内容的聊天室

来自 , 2020-12-15, 写在 Java, 查看 121 次.
URL http://www.code666.cn/view/49b8b4f9
  1. package gui;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Color;
  5. import java.awt.GridLayout;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8.  
  9. import javax.swing.JButton;
  10. import javax.swing.JFrame;
  11. import javax.swing.JPanel;
  12. import javax.swing.JTextField;
  13.  
  14.  
  15. public class Calculator2 extends JFrame implements ActionListener{
  16.  
  17.         //显示的名字
  18.         private final String[] KEYS={ "7", "8", "9", "/", "sqrt", "4", "5", "6",
  19.                         "*", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" };
  20.         private final String[] COMMAND={"Backspace","CE","C"};
  21.         private final String[] M={"","MC" ,"MR","MS","M+"};
  22.         //按钮
  23.         private JButton[] keys=new JButton[KEYS.length];
  24.         private JButton[] command=new JButton[COMMAND.length];
  25.         private JButton[] m=new JButton[M.length];
  26.         //计算结果文本框
  27.         private JTextField resultTxt=new JTextField("0");
  28.        
  29.         //标记用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
  30.         private boolean firstDigit=true;
  31.         //计算中间结果
  32.         private double resultNum=0.0;
  33.         //当前运算的运算符
  34.         private String operator="=";
  35.         //操作是否合法
  36.         private boolean operateValidFlag=true;
  37.        
  38.         /**
  39.          * 构造函数
  40.          * @param args
  41.          */
  42.        
  43.         public Calculator2() {
  44.                 // TODO Auto-generated constructor stub
  45.                 super();
  46.                 //初始化计算器
  47.                 init();
  48.                 this.setBackground(Color.LIGHT_GRAY);
  49.                 this.setTitle("计算器");
  50.                 this.setLocation(500, 400);
  51.                 //不许修改计算器大小
  52.                 this.setResizable(false);
  53.                 //是计算器中的各组件大小合适
  54.                 this.pack();
  55.         }
  56.         /**
  57.          * 初始化计算器
  58.          */
  59.         private void init() {
  60.                 // TODO Auto-generated method stub
  61.                 //文本框中内容右对齐
  62.                 resultTxt.setHorizontalAlignment(JTextField.RIGHT );
  63.                 //不允许修改结果文本框
  64.                 resultTxt.setEditable(false);
  65.                 //设置文本框背景颜色
  66.                 resultTxt.setBackground(Color.white);
  67.                
  68.                 /**
  69.                  * 初始化计算器上键的按钮,将键放到一个画板内
  70.                  */
  71.                 JPanel calkeyPanel=new JPanel();
  72.                 //用网格布局,4X5 网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素
  73.                 calkeyPanel.setLayout(new GridLayout(4, 5, 3, 3));
  74.                 for(int i=0;i<KEYS.length;i++){
  75.                         keys[i]=new JButton(KEYS[i]);
  76.                         calkeyPanel.add(keys[i]);
  77.                         keys[i].setForeground(Color.blue);
  78.                 }
  79.                
  80.                 //运算符键用红色表示,其他蓝色
  81.                 keys[3].setForeground(Color.red);
  82.                 keys[8].setForeground(Color.red);
  83.                 keys[13].setForeground(Color.red);
  84.                 keys[19].setForeground(Color.red);
  85.                
  86.                 /**
  87.                  * 初始化功能键,用红色表示。将功能键放到一个画板内
  88.                  */
  89.                 JPanel commandPanel=new JPanel();
  90.                 //用网格布局 1X3
  91.                 commandPanel.setLayout(new GridLayout(1, 3, 3, 3));
  92.                 for(int i=0;i<COMMAND.length;i++){
  93.                         command[i]=new JButton(COMMAND[i]);
  94.                         commandPanel.add(command[i]);
  95.                         command[i].setForeground(Color.red);
  96.                 }
  97.                 /**
  98.                  * 初始化M键,用red表示。将其放到一个面板上
  99.                  */
  100.                 JPanel mPanel=new JPanel();
  101.                 mPanel.setLayout(new GridLayout(5, 1, 3, 3));
  102.                 for(int i=0;i<M.length;i++){
  103.                         m[i]=new JButton(M[i]);
  104.                         mPanel.add(m[i]);
  105.                         m[i].setForeground(Color.red);
  106.                 }
  107.                
  108.                 /**
  109.                  * 计算器的整体布局,将calkey和command画板放到计算器的中部
  110.                  * 将文本框放到北部,m画板放到西部
  111.                  */
  112.                 //新建一个大画板
  113.                 JPanel panel=new JPanel();
  114.                 panel.setLayout(new BorderLayout(3, 3));
  115.                 panel.add("North",commandPanel);
  116.                 panel.add("Center",calkeyPanel);
  117.                
  118.                 //建立一个画板放文本框
  119.                 JPanel top=new JPanel();
  120.                 top.setLayout(new BorderLayout());
  121.                 top.add("Center",resultTxt);
  122.                 //整体布局
  123.                 getContentPane().setLayout(new BorderLayout(3,5));
  124.                 getContentPane().add("North", top);
  125.                 getContentPane().add("Center", panel);
  126.                 getContentPane().add("West", mPanel);
  127.                
  128.                 //为各个按钮添加监听器
  129.                 //都使用同一个事件监听,即本对象。
  130.                 for(int i=0;i<KEYS.length;i++){
  131.                         keys[i].addActionListener(this);
  132.                 }
  133.                 for(int i=0;i<COMMAND.length;i++){
  134.                         command[i].addActionListener(this);
  135.                 }
  136.                 for(int i=0;i<M.length;i++){
  137.                         m[i].addActionListener(this);
  138.                 }
  139.         }
  140.  
  141.         /**
  142.          * 处理事件
  143.          * @param args
  144.          */
  145.        
  146.         @Override
  147.         public void actionPerformed(ActionEvent e) {
  148.                 // TODO Auto-generated method stub
  149.                 //获取事件源的标签
  150.                 String label=e.getActionCommand();
  151.                 if(label.equals(COMMAND[0])){
  152.                         handleBackspace();
  153.                 }else if (label.equals(COMMAND[1])) {
  154.                         resultTxt.setText("0");
  155.                 }else if (label.equals(COMMAND[2])) {
  156.                         handleC();
  157.                 }else if ("0123456789.".indexOf(label)>=0) {
  158.                         handleNumber(label);
  159.                 }else {//用户按了运算符键
  160.                         handleOperator(label);
  161.                 }
  162.         }
  163.  
  164.  
  165.         private void handleBackspace() {
  166.                 // TODO Auto-generated method stub
  167.                 String text=resultTxt.getText();
  168.                 int i=text.length();
  169.                 if(i>0){
  170.                         //退格,建文本最后一个字符去掉
  171.                         text=text.substring(0, i-1);
  172.                         if(text.length()==0){
  173.                                 //如果文本没有内容,则初始化计算器的各种值r
  174.                                 resultTxt.setText("0");
  175.                                 firstDigit=true;
  176.                                 operator="=";
  177.                         }else {
  178.                                 resultTxt.setText(text);//显示新的文本
  179.                         }
  180.                 }
  181.         }
  182.         private void handleC() {
  183.                 // TODO Auto-generated method stub
  184.                 //初始化计算器的各种值
  185.                 resultTxt.setText("0");
  186.                 firstDigit=true;
  187.                 operator="=";
  188.         }
  189.         private void handleNumber(String key) {
  190.                 // TODO Auto-generated method stub
  191.                 if(firstDigit){
  192.                         resultTxt.setText(key);
  193.                 }else if ((key.equals("."))&&(resultTxt.getText().indexOf("."))<0) {
  194.                         // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
  195.                         resultTxt.setText(resultTxt.getText()+".");
  196.                 }else if (!key.equals(".")) {
  197.                         //如果输入的不是小数点,则将数字附在结果文本框的后面
  198.                         resultTxt.setText(resultTxt.getText()+key);
  199.                 }
  200.                 //以后输入的肯定不的第一个数字了
  201.                 firstDigit=false;
  202.         }
  203.         private void handleOperator(String key) {
  204.                 // TODO Auto-generated method stub
  205.                 if(operator.equals("/")){
  206.                         //如果当前结果文本框中的值=0
  207.                         if(getNumberFromText()==0.0){
  208.                                 //操作不合法
  209.                                 operateValidFlag=false;
  210.                                 resultTxt.setText("除数不能为零");
  211.                         }else {
  212.                                 resultNum/=getNumberFromText();
  213.                         }
  214.                 }else if (operator.equals("1/x")) {
  215.                         //倒数运算
  216.                         if (resultNum==0.0) {
  217.                                 //操作不合法
  218.                                 operateValidFlag=false;
  219.                                 resultTxt.setText("0没有倒数");
  220.                         }else {
  221.                                 resultNum=1/resultNum;
  222.                         }
  223.                 }else if (operator.equals("+")) {
  224.                         resultNum+=getNumberFromText();
  225.                 }else if (operator.equals("-")) {
  226.                         resultNum-=getNumberFromText();
  227.                 }else if (operator.equals("*")) {
  228.                         resultNum*=getNumberFromText();
  229.                 }else if (operator.equals("sqrt")) {
  230.                         resultNum=Math.sqrt(resultNum);
  231.                 }else if (operator.equals("%")) {
  232.                         resultNum=resultNum/100;
  233.                 }else if (operator.equals("+/-")) {
  234.                         resultNum=resultNum*(-1);
  235.                 }else if (operator.equals("=")) {
  236.                         resultNum=getNumberFromText();
  237.                 }
  238.                
  239.                 if (operateValidFlag) {
  240.                         //双精度浮点数的运算
  241.                         long t1;
  242.                         double t2;
  243.                         t1=(long)resultNum;
  244.                         t2=resultNum-t1;
  245.                         if(t2==0){
  246.                                 resultTxt.setText(String.valueOf(t1));
  247.                         }else {
  248.                                 resultTxt.setText(String.valueOf(resultNum));
  249.                         }
  250.                 }
  251.                 //运算符等于用户按的按钮
  252.                 operator=key;
  253.                 firstDigit=true;
  254.                 operateValidFlag=true;
  255.                
  256.         }
  257.        
  258.         //从结果文本中获取数字
  259.         private double getNumberFromText() {
  260.                 // TODO Auto-generated method stub
  261.                 double result=0;
  262.                 try {
  263.                         result=Double.valueOf(resultTxt.getText()).doubleValue();
  264.                 } catch (NumberFormatException e) {
  265.                         // TODO: handle exception
  266.                 }
  267.                 return result;
  268.         }
  269.         public static void main(String[] args) {
  270.                 // TODO Auto-generated method stub
  271.  
  272.                 Calculator2 calculator2=new Calculator2();
  273.                 calculator2.setVisible(true);
  274.                 calculator2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  275.         }
  276.  
  277. }
  278.  

回复 "计算器"

这儿你可以回复上面这条便签

captcha