其实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写了一个简单的计算器相关推荐

  1. java人点灯问题_JAVA学习,写的一个点灯小游戏

    之前写的一个点灯小游戏,没什么技术含量. 截图: 代码: 类Start: import java.io.File; import java.io.IOException; import javax.i ...

  2. java简单编译器源代码_25行代码实现一个简单的编译器

    起因 <25行JavaScript语句实现一个简单的编译器>实现的是一个简单到不能再简单的玩具的玩具,他的魔法是函数式编程简化了js代码.java 8提供了函数式编程的支持,昨晚脑子抽风突 ...

  3. 最近写了一个简单的面向对象的脚本语言 Q 语言

    最近写了一个简单的面向对象的脚本语言 Q 语言,语法类似于 Javascript, 加入了一些 python 的语法功能. 同时实现了部分的 Javascript prototype 的功能 (个人觉 ...

  4. 自己写的一个简单的android记事本app

    自己写的一个简单的记事本app,效果如下: 一.首先是第一个界面的编写,最上面是一个TextView,中间是一个Linearlayout中嵌套一个listview布局,最下面是一个button.下面附 ...

  5. easy-mock写的一个简单的模拟二页的反馈

    用easy-mock写的一个简单的模拟二页的反馈,因为后端团队比较传统,所以设计的结构不太规范. 功能:每页10条,共2页,共12条记录,超出参数范围会返错误码: easy模板: {code: fun ...

  6. AndroidSDK开发6我用kotlin协程写了一个简单sdk

    目录 AndroidSDK开发6我用kotlin协程写了一个简单sdk 1.kotlin的依赖和导包如下:(//如果不使用协程可以去掉协程的导包减少sdk包大小) 2.Application代码如下: ...

  7. 用shell脚本写的一个简单的俄罗斯方块

    用shell脚本写的一个简单的俄罗斯方块 代码 代码 测试 下载链接 代码 代码 #!/bin/bash #version 1.2,若非正常退出,请使用附带的killel.sh脚本杀死进程 #定义用于 ...

  8. 用li写的一个简单的横向导航菜单demo

    用ul li写的一个简单的横向导航菜单,很实用: /* 所有class为menu的div中的ul样式 */ div.menu ul { list-style:none; /* 去掉ul前面的符号 */ ...

  9. java 移动图片_Java写的一个简单的图片移动小程序

    前两天,有一个小姑娘让帮忙给其写一个小玩意,就是在Panel上绘制一个图片,然后通过键盘的方向键进行控制移动.虽然比较简单,这里还是希望和大家分享一下,里面有两点特别需要注意的知识点,这里一并加以说明 ...

最新文章

  1. AWS — AWS Snow 系列
  2. Spring Boot 2.5.5发布:开始支持Java 17了!
  3. 每天一道LeetCode-----找到给定数组中第三大的值
  4. java printstacktrace_为什么异常. printStackTrace() 被认为是不好的实践?_java_酷徒编程知识库...
  5. 为QT添加qss样式文件
  6. ddos常见攻击报文
  7. springsecurity oauth2_跟OAuth2杠上了,老师,我要学全套的!
  8. 难道早上起床后就一定要喝一杯白开水吗?
  9. Keepalived原理详解
  10. 一个比较全介绍UltraGrid的博客
  11. zookeeper学习(二)之java客户端API建立连接
  12. photoshop的页面制作练习2
  13. Double binary trees
  14. 合宙Air720U724U722U Lua 固件更新说明
  15. 洛谷 [P3110] 驮运
  16. 5 款非常好用的AI在线图片处理工具
  17. 关于win10 无线网络不可用,网络适配器出现全感叹号
  18. 申请百度语音识别API 接口-免费
  19. 目标检测入门实战:贪吃蛇小游戏
  20. LaTeX in 24 Hours - 3. Formatting Texts I

热门文章

  1. IOS:IOS集成开发和环境的介绍
  2. matlab 黑白格子
  3. Python制作七夕表白实例项目-让你的情人心动起来
  4. 现在的FM电台呀,什么玩艺儿
  5. 最新API接口(亲测可用)及其使用教程
  6. Ubuntu18解决:Not creating XLA devices, tf_xla_enable_xla_devices not set
  7. [linux] Linux网络之TCP协议详解
  8. 用函数求出平均分、最高分和最低分
  9. FastQC 测序质量
  10. 运城学院计算机应用技术,运城学院学子在中国大学生计算机设计大赛中取得历史最好成绩...