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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值