package 计算器;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.text.DecimalFormat;

/**

* Created by pengyanmei

* Date: 2020/12

*@author 彭艳梅

*/

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(230, 241,216); //功能键和运算符颜色

Color color2 = new Color(223, 53, 57); //等于号专属颜色

Color color3 = new Color(255, 251,209); //背景颜色

// 建立一个画板放文本框

JPanel textPanel = new JPanel();

textPanel.setLayout(new BorderLayout());

textPanel.add(resultText);

resultText.setFont(new Font("楷体",Font.BOLD,90)); //设置文本框中文字的字体以及大小,加粗

resultText.setHorizontalAlignment(JTextField.RIGHT); //文本框中的内容采用右对齐方式

resultText.setEditable(false); //不能修改结果文本框

resultText.setBorder(null); //删除文本框的边框

// 设置文本框背景颜色

resultText.setBackground(color1);

// 初始化计算器上键的按钮,将键放在一个画板内

JPanel keysPanel = new JPanel();

// 用网格布局器,6行,4列的网格,网格之间的水平方向垂直方向间隔均为2个像素

keysPanel.setLayout(new GridLayout(6, 4, 2, 2));

//初始化功能按钮

for(int i = 0; i < 8; i++) {

buttons[i] = new JButton(keys[i]);

keysPanel.add(buttons[i]);

buttons[i].setBackground(color3);

buttons[i].setForeground(Color.black);

buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 24));

buttons[i].setBorderPainted(false); //去除按钮的边框

}

//初始化运算符及数字键按钮

for(int i = 8; i < keys.length; i++) {

buttons[i] = new JButton(keys[i]);

keysPanel.add(buttons[i]);

if((i+1)%4==0) buttons[i].setBackground(color3);

else buttons[i].setBackground(Color.white);

buttons[i].setForeground(Color.black);

buttons[i].setFont(new Font(Font.SERIF, Font.PLAIN, 24));

buttons[i].setBorderPainted(false); //去除按钮的边框

}

buttons[23].setBackground(color2); // '='符键用特殊颜色

keysPanel.setBackground(color1);

//将文本框所在的面板放在北部,将keysPanel面板放在计算器的中部

frame.getContentPane().add("North", textPanel);

frame.getContentPane().add("Center", keysPanel);

//设置两个面板的边框,尽量还原win10计算器

textPanel.setBorder(BorderFactory.createMatteBorder(25,3,1,3,color1));

keysPanel.setBorder(BorderFactory.createMatteBorder(6,3,3,3,color1));

// 为各按钮添加事件监听器,都使用同一个事件监听器。

for (int i = 0; i < keys.length; i++) {

buttons[i].addActionListener(this);

}

}

/**

* 处理事件

*/

public void actionPerformed(ActionEvent ev) {

String command = ev.getActionCommand(); // 获取事件源

if (command.equals(keys[3])) {

// 用户按了"Back"键

doBackspace();

} else if (command.equals(keys[1])) {

// 用户按了"CE"键

resultText.setText("0");

} else if (command.equals(keys[2])) {

// 用户按了"C"键

doC();

} else if ("0123456789.".indexOf(command) >= 0) {

// 用户按了数字键或者小数点键

doNumber(command);

} else if(command.equals(keys[0]) || command.equals(keys[4]) || command.equals(keys[5]) ||

command.equals(keys[6]) || command.equals(keys[20])) {

// 用户按了只需一个数的运算键(求倒数,%,开方,平方,取正负数)

doOperator1(command);

} else {

doOperator2(command);

}

}

/**

* 处理Back键被按下的事件

*/

private void doBackspace() {

String text = resultText.getText();

int i = text.length();

if (i > 0) {

text = text.substring(0, i - 1); // 退格,将文本最后一个字符去掉

if (text.length() == 0) {

// 如果文本没有内容了,则初始化计算器的各种值

resultText.setText("0");

firstDigit = true;

operator = "=";

} else {

// 显示新的文本

resultText.setText(text);

}

}

}

/**

* 处理C键被按下的事件

*/

private void doC() {

// 初始化计算器的各种值

resultText.setText("0");

firstDigit = true;

operator = "=";

}

/**

* 处理数字键被按下的事件

*/

private void doNumber(String key) {

if (firstDigit) {

// 输入的为第一个数

resultText.setText(key);

} else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) {

// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面

resultText.setText(resultText.getText() + ".");

} else if (!key.equals(".")) {

// 如果输入的不是小数点,则将数字附在结果文本框的后面

resultText.setText(resultText.getText() + key);

}

firstDigit = false;

}

/**

* 处理运算符键被按下的事件

*/

//只需一个数的运算

private void doOperator1(String key) {

operator = key; // 运算符为用户按的按钮

if (operator.equals("1⁄x")) {

// 倒数运算

if (resultNum == 0) {

operateValidFlag = false; //操作不合法

resultText.setText("零没有倒数");

} else {

resultNum = 1 / getNumberFromText();

}

} else if (operator.equals("√x")) {

// 平方根运算

if (resultNum < 0) {

operateValidFlag = false; //操作不合法

resultText.setText("根号内不能为负");

} else {

resultNum = Math.sqrt(getNumberFromText());

}

} else if (operator.equals("X²")) {

// 平方运算

resultNum = getNumberFromText()*getNumberFromText();

} else if (operator.equals("%")) {

// 百分号运算,除以100

resultNum = getNumberFromText() / 100;

} else if (operator.equals("+/-")) {

// 正数负数运算

resultNum = getNumberFromText() * (-1);

if (operateValidFlag) {

// 操作合法的情况下,结果为小数保留小数点后4位,整数正常输出

long t1;

double t2;

t1 = (long) resultNum;

t2 = resultNum - t1;

if (t2 == 0) {

resultText.setText(String.valueOf(t1));

} else {

resultText.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));

}

}

firstDigit = true;

operateValidFlag = true;

}

}

//需要两个数的运算

private void doOperator2(String key) {

if (operator.equals("÷")) {

// 除法运算

// 如果当前结果文本框中的值等于0

if (getNumberFromText() == 0.0) {

operateValidFlag = false; //操作不合法

resultText.setText("除数不能为零");

} else {

resultNum /= getNumberFromText();

}

} else if (operator.equals("+")) {

// 加法运算

resultNum += getNumberFromText();

} else if (operator.equals("-")) {

// 减法运算

resultNum -= getNumberFromText();

} else if (operator.equals("X")) {

// 乘法运算

resultNum *= getNumberFromText();

} else if (operator.equals("=")) {

// 赋值运算

resultNum = getNumberFromText();

}

if (operateValidFlag) {

// 操作合法的情况下,结果为小数保留小数点后4位,整数正常输出

long t1;

double t2;

t1 = (long) resultNum;

t2 = resultNum - t1;

if (t2 == 0) {

resultText.setText(String.valueOf(t1));

} else {

resultText.setText(String.valueOf(new DecimalFormat("0.0000").format(resultNum)));

}

}

operator = key; // 运算符为用户按的按钮

firstDigit = true;

operateValidFlag = true;

}

/**

* 从结果文本框中获取数字

*/

private double getNumberFromText() {

double result = 0;

try {

result = Double.valueOf(resultText.getText()).doubleValue();

} catch (NumberFormatException e) {

}

return result;

}

public static void main(String[] args) {

new Calculator();

}

}

Java计算器编程代码相关推荐

  1. java并发编程代码示例_java并发编程之同步器代码示例

    java并发编程之同步器代码示例 发布时间:2020-09-08 16:53:41 来源:脚本之家 阅读:58 作者:Blessing_H 同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作 ...

  2. java计算器程序代码,图形化界面

    实现了加减乘除,平方立方开根号以及小数点运算,代码如下: package test1;import java.awt.*;import java.awt.event.WindowAdapter; im ...

  3. java计算器程序代码实现加减乘除_Python+tkinter能实现计算器!太神奇了

    听说Python很强大,有第三方库啥事儿都能干,不仅能写一个计算器框架,还能实现加减乘除运算,听着甚是崇拜啊! 废话不啰嗦了,让我们一起来看看Python是如何把计算器用一个个代码实现的. 这里我们用 ...

  4. JAVA基础编程代码50个

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2 ...

  5. java计算器程序代码

    /*  * 描述:计算器  */ package cn.tx; import java.awt.Button; import java.awt.Frame; import java.awt.GridL ...

  6. Java计算器简易代码

    B站狂神计算器作业 我写的计算器 package com.chen.method;import java.util.Scanner; //简易计算器 public class Demo7 {publi ...

  7. 一段java并发编程代码

    1 snmpGetDevicesTask方法 public static Map<String,CapEbu> snmpGetDevicesTask(List<String> ...

  8. java编程计算器程序代码_34 个送给 Java 程序员的练手项目合集

    人类一生中,99% 的技能都是靠实践学来的,编程更是如此. 在这一点上,编程和打篮球很像:你得亲自上场去打,才能学会篮球:同样,亲手敲下代码,才能真正学会「编程」.太多人看完一本书.几个 G 的视频后 ...

  9. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...

    本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...

最新文章

  1. Android不使用支持库请求运行时权限
  2. 彻底理解kafka中partition和消费者对应关系
  3. python 怎么安装opencv?
  4. mongodb 查询效率_2020年9个好用的MongoDB 图形化界面工具
  5. OpenGL之正背面剔除、深度测试与多边形偏移
  6. 利用github和git命令,将本地项目共享到服务器上
  7. c语言关于链表选择题看不懂,有关链表基本操作三题
  8. designer一直未响应 qt_未雨绸缪及时清淤 曾是内涝重灾区 这次涵洞未积水
  9. 【POJ - 1486】Sorting Slides(思维建图,二分图求必须边,关建边,图论)
  10. android主要文件的作用是什么,androidmanifest.xml文件的作用是什么
  11. 指静脉屏幕说明usart hmi
  12. 笔记本电脑如何强制关机_笔记本按电源按钮不能关机只是关闭屏幕的解决办法...
  13. C#获取当前时区转换方法
  14. windows编程--网络编程学习--winsock编程(2)
  15. Html5动态桌面,动态桌面软件《Wallpaper Engine》 让你的电脑桌面动起来!
  16. html多重阴影,求问:CSS3多重阴影效果实现的问题。为什么没有任何的效果,怎么改颜色都没用。...
  17. xcode 配置wechat_react-native-wechat微信组件的使用
  18. 腾讯优图TFace正式开源,更可信的人脸识别!
  19. Android神兵利器之黄油刀的使用(ButterKnife)
  20. 量化选股模型—一致预期模型

热门文章

  1. dolphinscheduler 补数据
  2. 第十六章:开发工具-traceback:异常和栈轨迹-底层异常API
  3. RabbitMq安装Web界面插件报错
  4. CIKM 2021 | 淘宝多场景推荐排序模型ZEUS
  5. 个人日记开发最终实现
  6. 初探 Ettercap: ARP投毒 DNS欺骗
  7. 单调栈(C/C++)
  8. 计算机专业笔记本用i5还是i7,笔记本电脑i5和i7的区别大么?
  9. HTML中的表格及样式的设置
  10. 《我是一只IT小小鸟》书评──将要成为IT小小鸟