Java实现仿win10计算器

这篇博客详述了使用Java实现一个Win10风格计算器的过程,包括实验目的、内容、原理和运行效果。计算器具备加减乘除、开平方、平方、清除等功能,并处理了除数为零的情况。通过布局管理和事件监听,实现了界面缩放时组件同步缩放,保持整体风格。同时,博主分享了关键代码和异常处理策略。
摘要由CSDN通过智能技术生成

一、实验目的:

1、掌握Java图形用户界面的编程设计方法;
2、掌握异常处理的编程方法。
3、掌握组件的监听和动作响应处理方法。

二、实验内容

实现一个计算器。要求:
1、参照Windows计算器功能,实现加、减、乘、除运算;
2、声明为按钮数组;
3、对0~9数字操作,采用相同的算法;
4、解决除数为零的问题;
5、具有清除一个数字、全部清除、开平方和平方功能。
6、计算结果保留4位小数。
7、界面缩放时,所有组件同步缩放,保持界面整体风格不变。

三、实验原理

  • 首先分析界面的布局,可把界面分成上下两大部分
    上面用一个面板来装文本框,下面用一个面板来装计算器的按钮
    框架默认布局是边框布局(BorderLayout),所以我将文本框所在的面板放在北部,将按钮所在的面板放在计算器的中部,就能达到预期的效果。
    按钮所在面板采用网格布局(GridLayout),能实现当调整界面大小时所有组件同步缩放,保持界面整体风格不变。
    为了尽量还原win10的计算器,我取消了按钮的边框文本框的边框样式,以及在边界上进行了颜色,间距等的设置。(跟win10自带计算器颜色相近的rgb好难找啊,我在网上把颜色比对了好久 (ノ`Д)ノ)。
  • 为各按钮添加事件监听器的做法是都使用同一个事件监听器处理事件获取事件源并判断就行了。
    为了判断用户通过按键输入的是整个表达式的第一个数字还是运算符后的第一个数字,我加了一个布尔变量firstDigit,在运算时会用到。我把运算分成了两大类:只用一个数字运算的,如:求倒数,%,开方,平方,取正负数,(相当于单目运算符);其余的为需要两个数字做运算(运算符前和运算符后,即双目运算符)。
    除了各个处理方法外我还写了一个从文本框中获取数字(把字符串转换成double型加上异常处理)的方法:getNumberFromText(),因为要多次用到,写成一个方法直接调用就行。

四、运行

  • 外观已经很尽力在模仿了,嘻嘻(左图是我做的,右图是电脑上win10的计算器)
    在这里插入图片描述
  • 实现界面缩放时,所有组件同步缩放,保持界面整体风格不变:
    在这里插入图片描述
  • 正常加减乘除运算的实现比较常规,这里就只展示除法且除数为0的情况吧
    在这里插入图片描述
  • 开方运算(结果为小数时保留小数点后4位)
    在这里插入图片描述
  • 如果给负数开方是不合法的:
    在这里插入图片描述
  • 平方运算
    在这里插入图片描述
  • 求倒数:
    在这里插入图片描述
  • 求倒数分母为0是不合法的:
    在这里插入图片描述
  • 按退格键:
    在这里插入图片描述
  • 取正负:
    在这里插入图片描述
  • 小数运算:
    在这里插入图片描述

源代码:

package 计算器;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;

/**
 * Created by Henry
 * Date: 2019/12/18
 * Time: 16:08
 */
public class Calculator implements ActionListener {
   
    /**
     * 计算器
     */
    private JFrame frame = new JFrame();

    //计算器上各按键的名字(从上到下,从左到右)
    private String[] keys = {
   "%","CE","C","Back","1⁄x","X²","√x","÷","7","8","9","X","4","5","6","-","1","2","3","+","+/-","0",".","="};
    private JButton buttons[] = new JButton[keys.length];  //计算器上按键的按钮
    private JTextField resultText = new JTextField("0");  //显示计算结果文本框

    private boolean firstDigit = true;  // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
    private double resultNum = 0.0000;   // 计算的中间结果
    private String operator = "=";   // 当前运算的运算符(按键"C"时需要将其还原为"=")
    private boolean operateValidFlag = true;   // 判断操作是否合法

    /**
     * 构造函数
     */
    public Calculator() {
   
        init();  // 初始化计算器
        frame.setTitle("计算器 -- @author 程铧庆");
        frame.setSize(366, 439);
        frame.setLocation(500, 300);
        frame.setResizable(true);  // 允许修改计算器窗口的大小
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    /**
     * 初始化计算器
     */
    private void init() {
   

        Color color1 = new Color(181, 181, 181);  //功能键和运算符颜色
        Col
  • 58
    点赞
  • 214
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值