Java计算器编程代码
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计算器编程代码相关推荐
- java并发编程代码示例_java并发编程之同步器代码示例
java并发编程之同步器代码示例 发布时间:2020-09-08 16:53:41 来源:脚本之家 阅读:58 作者:Blessing_H 同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作 ...
- java计算器程序代码,图形化界面
实现了加减乘除,平方立方开根号以及小数点运算,代码如下: package test1;import java.awt.*;import java.awt.event.WindowAdapter; im ...
- java计算器程序代码实现加减乘除_Python+tkinter能实现计算器!太神奇了
听说Python很强大,有第三方库啥事儿都能干,不仅能写一个计算器框架,还能实现加减乘除运算,听着甚是崇拜啊! 废话不啰嗦了,让我们一起来看看Python是如何把计算器用一个个代码实现的. 这里我们用 ...
- JAVA基础编程代码50个
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2 ...
- java计算器程序代码
/* * 描述:计算器 */ package cn.tx; import java.awt.Button; import java.awt.Frame; import java.awt.GridL ...
- Java计算器简易代码
B站狂神计算器作业 我写的计算器 package com.chen.method;import java.util.Scanner; //简易计算器 public class Demo7 {publi ...
- 一段java并发编程代码
1 snmpGetDevicesTask方法 public static Map<String,CapEbu> snmpGetDevicesTask(List<String> ...
- java编程计算器程序代码_34 个送给 Java 程序员的练手项目合集
人类一生中,99% 的技能都是靠实践学来的,编程更是如此. 在这一点上,编程和打篮球很像:你得亲自上场去打,才能学会篮球:同样,亲手敲下代码,才能真正学会「编程」.太多人看完一本书.几个 G 的视频后 ...
- java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...
本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...
最新文章
- Android不使用支持库请求运行时权限
- 彻底理解kafka中partition和消费者对应关系
- python 怎么安装opencv?
- mongodb 查询效率_2020年9个好用的MongoDB 图形化界面工具
- OpenGL之正背面剔除、深度测试与多边形偏移
- 利用github和git命令,将本地项目共享到服务器上
- c语言关于链表选择题看不懂,有关链表基本操作三题
- designer一直未响应 qt_未雨绸缪及时清淤 曾是内涝重灾区 这次涵洞未积水
- 【POJ - 1486】Sorting Slides(思维建图,二分图求必须边,关建边,图论)
- android主要文件的作用是什么,androidmanifest.xml文件的作用是什么
- 指静脉屏幕说明usart hmi
- 笔记本电脑如何强制关机_笔记本按电源按钮不能关机只是关闭屏幕的解决办法...
- C#获取当前时区转换方法
- windows编程--网络编程学习--winsock编程(2)
- Html5动态桌面,动态桌面软件《Wallpaper Engine》 让你的电脑桌面动起来!
- html多重阴影,求问:CSS3多重阴影效果实现的问题。为什么没有任何的效果,怎么改颜色都没用。...
- xcode 配置wechat_react-native-wechat微信组件的使用
- 腾讯优图TFace正式开源,更可信的人脸识别!
- Android神兵利器之黄油刀的使用(ButterKnife)
- 量化选股模型—一致预期模型