其实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;
}
}