直接上代码
package cal;
public class Main {
public static void main(String[] args) {
Demo.createGrid();
}
}
生成界面:
package cal;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Demo extends JFrame {
public static void createGrid() {
Font fn = new Font("黑体", Font.BOLD, 25);
JFrame jf = new JFrame("计算器");
jf.setBounds(600, 100, 600, 700);
jf.setLayout(new BorderLayout());// 将界面设置为边界布局
// 创建一个装文本的容器
JPanel text = new JPanel(new GridLayout(2, 1));
// 创建一个文本框
JTextField jt = new JTextField(40);
jt.setHorizontalAlignment(JTextField.RIGHT);
jt.setFont(fn);
jt.setText("0");
// 创建一个文本域
JTextArea ja = new JTextArea(2, 40);
ja.setFont(fn);
text.add(jt);
text.add(ja);
// jt.requestFocus();
// 给按钮建一个网格布局
JPanel jp = new JPanel(new GridLayout(5, 5));
String[] str = { "CE", "C", "DEL", "%", "/", "sin", "1", "2", "3", "*", "cos", "4", "5", "6", "-", "tan", "7",
"8", "9", "+", "(", ")", "0", ".", "=" };
JButton[] bu = new JButton[str.length];
for (int i = 0; i < 25; i++) {
bu[i] = new JButton(str[i]);
bu[i].setFont(fn);
bu[i].setContentAreaFilled(false);//将按钮设为透明
String str1 = bu[i].getText();
if (str1.equals("tan") || str1.equals("cos") || str1.equals("sin")) {
bu[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String s = jt.getText();
if (s.compareTo("0") == 0) {
jt.setText(str1 + "(");
} else {
jt.setText(new StringBuffer(s).append(str1).append("(").toString());
}
}
});
} else if (str1.equals("DEL")) {
bu[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
StringBuffer sb = new StringBuffer(jt.getText());
if (sb.length() == 1) {
jt.setText("0");
} else {
jt.setText(sb.deleteCharAt(sb.length() - 1).toString());
}
ja.setText("");
}
});
} else if (str1.equals("CE")) {
bu[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
StringBuffer sb = new StringBuffer(jt.getText());
for (int i = sb.length() - 1; i >= 0
&& (Character.isDigit(sb.charAt(i)) || sb.charAt(i) == '.'); i--) {
sb.deleteCharAt(i);
}
if (sb.length() == 0) {
sb.append('0');
}
jt.setText(sb.toString());
ja.setText("");
}
});
} else if (str1.equals("C")) {
bu[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jt.setText("0");
ja.setText("");
}
});
} else if (str1.equals("=")) {
bu[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String s = jt.getText();
ja.setText(ReversePolish.reverse(s));
// jt.requestFocus();
}
});
} else {
bu[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s = jt.getText();
if (s.compareTo("0") == 0 && !judge(str1)) {
jt.setText(str1);
} else {
jt.setText(s + str1);
}
}
});
}
jp.add(bu[i]);
}
jf.add(text, BorderLayout.NORTH);
jf.add(jp);
jf.setVisible(true);
}
private static boolean judge(String s) {
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("%") || s.equals(".")) {
return true;
} else {
return false;
}
}
}
运算处理:
package cal;
import java.util.LinkedList;
public class ReversePolish {
private static LinkedList<String> number = new LinkedList<String>();
private static LinkedList<String> symbol = new LinkedList<String>();
private static LinkedList<String> operation = new LinkedList<String>();
private static void initialization(){
number.clear();
symbol.clear();
operation.clear();
}
private static String[] handle(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '+'||ch == '-'||ch == '*'||ch == '/'||ch == '(' || ch == ')'||ch == '%') {
int index = sb.length();
if(index > 0 && sb.charAt(index-1) != ' ') {
sb.append(' ');
}
sb.append(ch).append(' ');
} else if (ch == 't') {
sb.append("tan");
i += 2;
} else if (ch == 's') {
sb.append("sin");
i += 2;
} else if (ch == 'c') {
sb.append("cos");
i += 2;
} else {
sb.append(ch);
}
}
return sb.toString().trim().split(" ");
}
public static String reverse(String s) {
initialization();
String[] str = handle(s);
//构建逆波兰表达式
for (String ss : str) {
//System.out.println(ss);
if (Character.isDigit(ss.charAt(0))) {
number.add(ss);
} else if (symbol.size() == 0) {
symbol.add(ss);
} else if (judge(symbol.getFirst(), ss)) {
symbol.addFirst(ss);
} else {
if (ss.compareTo(")") == 0) {
while (!symbol.isEmpty()) {
if (symbol.getFirst().compareTo("(") == 0) {
symbol.removeFirst();
if(symbol.isEmpty()) {
break;
}
if((symbol.getFirst().equals("tan")||symbol.getFirst().equals("sin")||symbol.getFirst().equals("cos"))) {
number.add(symbol.removeFirst());
}
break;
} else {
number.add(symbol.removeFirst());
}
}
} else {
while (!symbol.isEmpty() && !judge(symbol.getFirst(), ss)) {
number.add(symbol.removeFirst());
}
symbol.addFirst(ss);
}
}
}
while (!symbol.isEmpty()) {
number.add(symbol.removeFirst());
}
//计算结果
for (int i = 0; i < number.size(); i++) {
//System.out.println(number.get(i));
char ch = number.get(i).charAt(0);
if (Character.isDigit(ch)) {
operation.addFirst(number.get(i));
} else if (ch == 't') {
double a = Math.toRadians(Double.valueOf(operation.removeFirst()));
operation.addFirst(String.valueOf(Math.tan(a)));
} else if (ch == 's') {
double a = Math.toRadians(Double.valueOf(operation.removeFirst()));
operation.addFirst(String.valueOf(Math.sin(a)));
} else if (ch == 'c') {
double a = Math.toRadians(Double.valueOf(operation.removeFirst()));
operation.addFirst(String.valueOf(Math.cos(a)));
} else if (ch == '*') {
double a = Double.valueOf(operation.removeFirst());
double b = Double.valueOf(operation.removeFirst());
operation.addFirst(delSuffixZero(new StringBuffer(String.valueOf(b * a))));
} else if (ch == '/') {
if(number.get(i-1).compareTo("0") == 0){
return "除数不能为零!";
}
double a = Double.valueOf(operation.removeFirst());
double b = Double.valueOf(operation.removeFirst());
System.out.println(a+" "+b+" "+String.valueOf(b/a));
operation.addFirst(delSuffixZero(new StringBuffer(String.valueOf(b / a))));
} else if (ch == '%') {
String a = operation.removeFirst();
String b = operation.removeFirst();
if(a.indexOf('.') != -1 || b.indexOf('.') != -1) {
return "浮点类型数据不能进行取模运算!";
}
operation.addFirst(String.valueOf(Integer.valueOf(b) % Integer.valueOf(a)));
} else if (ch == '+') {
double a = Double.valueOf(operation.removeFirst());
double b = Double.valueOf(operation.removeFirst());
operation.addFirst(delSuffixZero(new StringBuffer(String.valueOf(b + a))));
} else if (ch == '-') {
double a = Double.valueOf(operation.removeFirst());
double b = Double.valueOf(operation.removeFirst());
operation.addFirst(delSuffixZero(new StringBuffer(String.valueOf(b - a))));
}
}
return operation.getFirst();
}
private static String delSuffixZero(StringBuffer str) {
int start = str.indexOf(".");
int end = str.length();
int i;
for(i = end-1; i >= start && str.charAt(i) == '0'; i--);
if(i < end-1) {
str.delete(i, end);
}
return str.toString();
}
/*
* 判断栈顶符号与待进栈符号的优先级 s为栈顶符号,s2为待进栈符号 若s2优先级小于
* 等于s返回false,否则返回true
*/
private static boolean judge(String s, String s2) {
if (s2.compareTo(")") == 0) {
return false;
} else if (s2.compareTo("-") == 0 || s2.compareTo("+") == 0) {
if(s.equals("(") || s.equals("tan") || s.equals("sin") || s.equals("cos")) {
return true;
}
return false;
} else if (s2.compareTo("*") == 0 || s2.compareTo("/") == 0 || s2.compareTo("%") == 0) {
if (s.compareTo("*") == 0 || s2.compareTo("/") == 0 || s2.compareTo("%") == 0) {
return false;
} else {
return true;
}
} else {
return true;
}
}
}
效果图: