java swing 简单计算器_java用swing写了一个简单的计算器
其实swing没什么难度,主要是字符串运算表达式,如何进行计算才能得到结果
swing界面5分钟,算法5小时
下面看具体代码
package frame;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Calculator {
@SuppressWarnings("static-access")
public static void main(String[] args) {
JFrame jFrame = new JFrame("java简易计算器");
Container c = jFrame.getContentPane();// 获取jframe的面板
c.setLayout(new GridLayout(3, 1));//设置jframe面板为网格面板 三行1列
JTextArea jtf = new JTextArea(10, 40);
jtf.setEditable(false);//内容文本框拒绝手动修改
JScrollPane textScrollPanel = new JScrollPane(jtf);//滑条面板
textScrollPanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);//水平自动滑条
textScrollPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);//垂直自动滑条
JPanel numPanel = new JPanel();//数字键面板
numPanel.setLayout(new GridLayout(4, 3));
for (int i = 0; i < 10; i++) {
JButton jb = new JButton(9 - i + "");
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtf.append(jb.getText());
}
});
numPanel.add(jb);
}
JButton jb4 = new JButton(".");
jb4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtf.append(".");
}
});
numPanel.add(jb4);
JButton jb3 = new JButton("←/退格");
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (null == jtf.getText() || jtf.getText().equals("")) {
return;
}
String newStr = jtf.getText().substring(0, jtf.getText().length() - 1);
jtf.setText(newStr);
}
});
numPanel.add(jb3);
JPanel symbolPanel = new JPanel();//符号键面板
symbolPanel.setLayout(new GridLayout(2, 3));
String[] ss = { "+", "-", "*", "/" };
for (String string : ss) {
JButton jb = new JButton(string);
jb.setFont(new Font("黑体", Font.BOLD, 40));
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtf.append(jb.getText());
}
});
symbolPanel.add(jb);
}
JButton jb = new JButton("=");
jb.setFont(new Font("黑体", Font.BOLD, 40));
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String te = jtf.getText().replaceAll("\r|\n", "");
if (null == te || te.matches("^[+,[-],*,/].*") || te.replaceAll("\r|\n", "").length() == 0
|| te.matches(".*[+,[-],*,/]$")) {
JOptionPane.showMessageDialog(jFrame, "输入有误,请检查");
return;
}
String s = te;
if (te.contains("=")) {
te.lastIndexOf("=");
s = te.substring(te.lastIndexOf("=") + 1, te.length());
}
BigDecimal count = caclu(s);
jtf.append(jb.getText() + "\r\n");
jtf.append(count.toString());
}
});
symbolPanel.add(jb);
JButton jb1 = new JButton("C/清空");
jb1.setFont(new Font("黑体", Font.BOLD, 30));
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jtf.setText("");
}
});
symbolPanel.add(jb1);
// 排版
c.add(textScrollPanel, BorderLayout.NORTH);// 上显示面板
c.add(numPanel, BorderLayout.CENTER);// 中数字键面板
c.add(symbolPanel, BorderLayout.SOUTH);// 下符号键面板
jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
jFrame.setLocation(80, 80);
jFrame.setSize(500, 500);
jFrame.pack();
}
public static BigDecimal caclu(String s) {
BigDecimal count = new BigDecimal("0");
String[] st = s.split("[+,[-]]");
Pattern p1 = Pattern.compile("[+,[-]]?");
Matcher m1 = p1.matcher(s);
List l1 = new ArrayList<>();// 按顺序存放加减符号
while (m1.find()) {
String v1 = m1.group();
if (v1.replaceAll(" ", "").length() == 0) {
continue;
}
if (v1.contains("+")) {
l1.add("+");
} else if (v1.contains("-")) {
l1.add("-");
}
}
List l2 = new ArrayList<>();// 按顺序存放乘除运算后待进行加减运算的数字
for (String s1 : st) {
if (s1.contains("*") || s1.contains("/")) {
Pattern p = Pattern.compile("[*,/]?");
Matcher m = p.matcher(s1);
List l3 = new ArrayList<>();// 存放运算符号
while (m.find()) {
String v1 = m.group();
if (v1.replaceAll(" ", "").length() == 0) {
continue;
}
if (v1.contains("*")) {
l3.add("*");
} else if (v1.contains("/")) {
l3.add("/");
}
}
String[] st1 = s1.split("[*,/]");
BigDecimal i1 = new BigDecimal(st1[0]);
for (int i = 0; i < l3.size(); i++) {
String v2 = l3.get(i);
if (v2.contains("*")) {
i1 = i1.multiply(new BigDecimal(st1[i + 1]));
} else if (v2.contains("/")) {
i1 = i1.divide(new BigDecimal(st1[i + 1]), MathContext.DECIMAL128);
}
l2.add(i1);
}
} else {
l2.add(new BigDecimal(s1));
}
}
count = l2.get(0);
for (int i = 0; i < l1.size(); i++) {
String v3 = l1.get(i);
if (v3.contains("+")) {
count = count.add(new BigDecimal(l2.get(i + 1).toString()));
} else if (v3.contains("-")) {
count = count.subtract(new BigDecimal(l2.get(i + 1).toString()));
}
}
return count;
}
}
java swing 简单计算器_java用swing写了一个简单的计算器相关推荐
- java人点灯问题_JAVA学习,写的一个点灯小游戏
之前写的一个点灯小游戏,没什么技术含量. 截图: 代码: 类Start: import java.io.File; import java.io.IOException; import javax.i ...
- java简单编译器源代码_25行代码实现一个简单的编译器
起因 <25行JavaScript语句实现一个简单的编译器>实现的是一个简单到不能再简单的玩具的玩具,他的魔法是函数式编程简化了js代码.java 8提供了函数式编程的支持,昨晚脑子抽风突 ...
- 最近写了一个简单的面向对象的脚本语言 Q 语言
最近写了一个简单的面向对象的脚本语言 Q 语言,语法类似于 Javascript, 加入了一些 python 的语法功能. 同时实现了部分的 Javascript prototype 的功能 (个人觉 ...
- 自己写的一个简单的android记事本app
自己写的一个简单的记事本app,效果如下: 一.首先是第一个界面的编写,最上面是一个TextView,中间是一个Linearlayout中嵌套一个listview布局,最下面是一个button.下面附 ...
- easy-mock写的一个简单的模拟二页的反馈
用easy-mock写的一个简单的模拟二页的反馈,因为后端团队比较传统,所以设计的结构不太规范. 功能:每页10条,共2页,共12条记录,超出参数范围会返错误码: easy模板: {code: fun ...
- AndroidSDK开发6我用kotlin协程写了一个简单sdk
目录 AndroidSDK开发6我用kotlin协程写了一个简单sdk 1.kotlin的依赖和导包如下:(//如果不使用协程可以去掉协程的导包减少sdk包大小) 2.Application代码如下: ...
- 用shell脚本写的一个简单的俄罗斯方块
用shell脚本写的一个简单的俄罗斯方块 代码 代码 测试 下载链接 代码 代码 #!/bin/bash #version 1.2,若非正常退出,请使用附带的killel.sh脚本杀死进程 #定义用于 ...
- 用li写的一个简单的横向导航菜单demo
用ul li写的一个简单的横向导航菜单,很实用: /* 所有class为menu的div中的ul样式 */ div.menu ul { list-style:none; /* 去掉ul前面的符号 */ ...
- java 移动图片_Java写的一个简单的图片移动小程序
前两天,有一个小姑娘让帮忙给其写一个小玩意,就是在Panel上绘制一个图片,然后通过键盘的方向键进行控制移动.虽然比较简单,这里还是希望和大家分享一下,里面有两点特别需要注意的知识点,这里一并加以说明 ...
最新文章
- AWS — AWS Snow 系列
- Spring Boot 2.5.5发布:开始支持Java 17了!
- 每天一道LeetCode-----找到给定数组中第三大的值
- java printstacktrace_为什么异常. printStackTrace() 被认为是不好的实践?_java_酷徒编程知识库...
- 为QT添加qss样式文件
- ddos常见攻击报文
- springsecurity oauth2_跟OAuth2杠上了,老师,我要学全套的!
- 难道早上起床后就一定要喝一杯白开水吗?
- Keepalived原理详解
- 一个比较全介绍UltraGrid的博客
- zookeeper学习(二)之java客户端API建立连接
- photoshop的页面制作练习2
- Double binary trees
- 合宙Air720U724U722U Lua 固件更新说明
- 洛谷 [P3110] 驮运
- 5 款非常好用的AI在线图片处理工具
- 关于win10 无线网络不可用,网络适配器出现全感叹号
- 申请百度语音识别API 接口-免费
- 目标检测入门实战:贪吃蛇小游戏
- LaTeX in 24 Hours - 3. Formatting Texts I
热门文章
- IOS:IOS集成开发和环境的介绍
- matlab 黑白格子
- Python制作七夕表白实例项目-让你的情人心动起来
- 现在的FM电台呀,什么玩艺儿
- 最新API接口(亲测可用)及其使用教程
- Ubuntu18解决:Not creating XLA devices, tf_xla_enable_xla_devices not set
- [linux] Linux网络之TCP协议详解
- 用函数求出平均分、最高分和最低分
- FastQC 测序质量
- 运城学院计算机应用技术,运城学院学子在中国大学生计算机设计大赛中取得历史最好成绩...