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<String> 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<BigDecimal> l2 = new ArrayList<>();// 按顺序存放乘除运算后待进行加减运算的数字
		for (String s1 : st) {
			if (s1.contains("*") || s1.contains("/")) {
				Pattern p = Pattern.compile("[*,/]?");
				Matcher m = p.matcher(s1);
				List<String> 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;
	}

}

 

转载于:https://my.oschina.net/2892328252/blog/790454

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值