首页 > 编程语言 >Java实验-Swing 计算器

Java实验-Swing 计算器

时间:2023-03-02 13:24:07浏览次数:38  
标签:case Java String res Swing equals break 计算器 firstNum

实验要求:

  1. 计算器软件是非常实用的工具

请用Java图形界面的知识,编写以上软件。

  • 仅用JButton、JTextField两个组件和JFrame窗口实现。
  • 实现基本的加减乘除运算。

代码:

GridLayout布局方式的主类:

package com.junlin.exer4; 

public class JavaMain {
    public static void main(String[] args) {
        Calculator calc = new Calculator("xxx_计算器");
    }
}

GridLayout布局方式的计算器界面类:

package com.junlin.exer4;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;


public class Calculator extends JFrame {
    private final JTextArea textArea;
    private String firstNum = "";   //第一个数
    private String op = "";     //操作符
    private String secondNum = "";  //第二个数
    private String showText = "";  //要展示在文本框中的文字
    private String result = "";
    private double eps = 1e-8;
    public Calculator(String title) {
        super(title);
        this.setSize(402,627);
        this.setLayout(null);
        this.setBackground(new Color(241, 241, 241));

        JPanel head = new JPanel();
        head.setLayout(new BorderLayout());
        head.setPreferredSize(new Dimension(402,50));
        head.add(new JLabel("简单计算器", JLabel.CENTER), BorderLayout.CENTER);
        head.setBackground(new Color(242, 242, 242));

        this.add(head);
        head.setBounds(0,0,  this.getWidth(), 30);

        textArea = new JTextArea();
        textArea.setColumns(3);
        textArea.setText("0");
        textArea.setFont(new Font("宋体",Font.BOLD,25));

        this.add(textArea);
        textArea.setBounds(10, 50, this.getWidth() - 20, 100);

        addButton();

        this.setVisible(true);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void refreshShowText(String text) {
        showText = text;
        textArea.setText(text);
    }
    private void refreshResult(String result) {
        refreshShowText(result);
        firstNum = result;
        this.result = result;
        secondNum = "";
        op = "";
    }

    private Object processNum(double res) {
        System.out.println(res);
        if(Math.abs(((int)res - res)) <= eps) {
            return (int)res;
        }else {
            String s = String.format("%.2f",res);
            return Double.parseDouble(s);
        }
    }

    //向界面中添加按钮
    private void addButton() {
        String[] candidate = {"CE", "÷", "x", "C", "7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "√", "1/x", "0", ".", "="};
        int len = candidate.length;
        JPanel panel = new JPanel();
        panel.setLayout(null);

        for(int i = 0;i < len;i++) {
            String text = candidate[i];
            JButton button = new JButton(text);
            Font f = new Font("宋体",Font.BOLD,16);
            button.setFont(f);
            button.setBackground(new Color(224, 224, 224));
            button.setBounds((i % 4) * 80 + (i % 4) * 10, (i / 4) * 70 + (i / 4) * 10, 85, 70);
            panel.add(button);
            button.addActionListener(e -> {
                switch (text) {
                    case "C":
                        refreshResult("");
                        break;
                    case "CE":
                        break;
                    case "+":
                    case "-":
                    case "x":
                    case "÷":
                        if(!firstNum.equals("") && op.equals("")) {
                            op = text;
                            refreshShowText(showText + op);
                        }
                        break;
                    case "1/x":
                        if(!firstNum.equals("") && op.equals("") && secondNum.equals("")) {
                            double res = 1.0 / Double.parseDouble(firstNum);
                            refreshResult(String.valueOf(processNum(res)));
                        }
                        break;
                    case "√":
                        if(!firstNum.equals("") && op.equals("") && secondNum.equals("")) {
                            double res = Math.sqrt(Double.parseDouble(firstNum));
                            refreshResult(String.valueOf(processNum(res)));
                        }
                        break;
                    case ".":
                        break;
                    case "=":
                        if(!firstNum.equals("") && !op.equals("") && !secondNum.equals("")) {
                            double res = 0.0;
                            switch (op) {
                                case "+":
                                    res = Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
                                    break;
                                case "-":
                                    res = Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
                                    break;
                                case "x":
                                    res = Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
                                    break;
                                case "÷":
                                    res = Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
                                    break;
                            }
                            refreshResult(String.valueOf(processNum(res)));
                        }
                        break;
                    default:  //数字
                        if(op.equals("")) {
                            if(result.equals("")) {
                                firstNum += text;
                            }
                            else {
                                refreshResult("");
                                firstNum = text;
                            }
                        }else {
                            secondNum += text;
                        }

                        refreshShowText(showText + text);
                        break;
                }
            });
        }
        panel.setBounds(20, 160, this.getWidth() - 30, this.getHeight() - 50 - 100 - 60);
        this.add(panel);
    }
}

标签:case,Java,String,res,Swing,equals,break,计算器,firstNum
From: https://www.cnblogs.com/junlin623/p/17171457.html

相关文章

  • Java实验-Swing 扑克牌游戏
    实验要求:扑克牌游戏是非常具有趣味性游戏,如下图所示,建立一个窗口界面,用JLable和相关组件(比如适当增加按钮,文本域等,可以自由发挥)实现以下界面,要求:点击任何一张牌,能控制......
  • Java实验-Swing 涂鸦板
    实验要求:涂鸦板是一个具有趣味性的小程序,它的实现原理是通过鼠标事件,控制鼠标移动结合画图功能实现。鼠标拖拽才开始绘制,松开鼠标则停止绘制。代码:--MyPaint画板类:pac......
  • java调用WCF服务
    一、概述最近项目上有需要和建科机器进行通信的需求,而建科这边给的技术文档和服务都是webservice的,我这边要做的就是用Java和建科的webservice交互。启动建科的webservice......
  • 【JavaScript】33_递归
    17、递归递归调用自身的函数称为递归函数递归的作用和循环是基本一直递归的核心思想就是将一个大的问题拆分为一个一个小的问题,小的问题解决了,大的问题也就解决了编写递归函......
  • mac系统上hdfs java api的简单使用
    1、背景在上一节中,我们简单学习了在命令行上如何操作hdfsshellapi,此处我们通过java程序来操作一下。2、环境准备需要在本地环境变量中配置HADOOP_HOME或在程序启动......
  • mac系统上hdfs java api的简单使用
    目录1、背景2、环境准备3、环境搭建3.1引入jar包3.2引入log4j.properties配置文件3.3初始化HadoopApi4、javaapi操作4.1创建目录4.2上传文件4.3列出目录下有哪些文......
  • Java读取文件的几种方式
    1.使用流读取文件publicstaticvoidstream(){StringfileName="D:\\test.txt";finalStringCHARSET_NAME="UTF-8";List<String>content=new......
  • 【javascript】slice()、substring()和substr() 三种字符串截取方法区别
    slice(start,end):slice(start,end)方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。 1、start(包含)和end(不包含)参数来指定字符串提取的部分;2、......
  • Java--判空方法
    方法有StringUtils.isBlank(),StringUtils.isNotBlank(),StringUtils.isEmpty();使用关系StringUtils.isNotEmpty()==!StringUtils.isEmpty();StringUti......
  • 【JavaScript】- map、forEach、filter之间的区别!
    map、forEach、filter这三者都可以遍历数组,他们之间有什么区别呢?map():方法定义在JavaScript的Array中,它返回一个新的数组,数组中的元素为原始数组调用函数处理后的值值得......