學習Java Swing實現計算器功能,本文實現該系統的功能截圖,和核心代碼大家參考
Java Swing實現計算器功能
計算器支持混合四則運算
核心代碼
/* 監聽運算符包括點 */
private class CalculatorListener implements ActionListener {
JTextField display;
JButton str;
CalculatorListener(JTextField display, JButton str) {
this.display = display;
this.str = str;
}
public void actionPerformed(ActionEvent e) {
StringBuffer s = new StringBuffer(display.getText());
if (flag) {
display.setText("0");
flag = false;
} else if (!(s.length() == 0)) {
if (!((display.getText().endsWith("+")) || (display.getText().endsWith("-"))
|| (display.getText().endsWith("X")) || (display.getText().endsWith("/")))) {
// 當爲無窮和非數字型,清空
if (display.getText().indexOf("Infinity") != -1 || display.getText().indexOf("NaN") != -1) {
display.setText("0");
// 判斷前面的數是不是小數,以決定要不要在它後面加小數點
} else if (str.getText() == "." && Character.isDigit(s.charAt(s.length() - 1))) {
int lastIndex = -1;
Stack<String> stack = new Stack<String>();
for (int i = 0; i < s.length(); i++) {
lastIndex = new CalculatorImpl().readDouble(display.getText(), i);
stack.push(display.getText().substring(i, lastIndex));
i = lastIndex;
}
String last = stack.pop();
if (last.indexOf(".") == -1) {
s.append(str.getText());
display.setText(s.toString());
}
// 普通情況
} else if (!display.getText().endsWith(".")) {
s.append(str.getText());
display.setText(s.toString());
}
// 當前面是符號時,自動填零
} else if (str.getText() == "." && (s.charAt(s.length() - 1) == '+' || s.charAt(s.length() - 1) == '-'
|| s.charAt(s.length() - 1) == 'X' || s.charAt(s.length() - 1) == '/')) {
s.append("0.");
display.setText(s.toString());
}
// 爲空時,按點填零
} else if (s.length() == 0 && str.getText() == ".") {
s.append("0.");
display.setText(s.toString());
}
}
}
/* 轉換逆波蘭式 */
public double toReversePolishNotation(String s) throws NumberFormatException {
Stack<Character> s1 = new Stack<Character>();//
Stack<Double> s2 = new Stack<Double>();
int lastIndex = -1;
char temp;
String num;
for (int i = 0; i < s.length(); i++) {
System.out.println("第" + i + "趟");
temp = s.charAt(i);
// 判斷是否爲操作數,如果是,就截取操作數
if (Character.isDigit(temp) || temp == '.' || temp == '-') {
// 對出現的前面的負號進行處理
if (temp == '-') {
lastIndex = readDouble(s, i + 1);
num = s.substring(i, lastIndex);
System.out.println("截取字符串" + num);
s2.push(Double.parseDouble(num));
System.out.println("s2 入棧" + s2.peek());
System.out.println("s1 入棧 --> +");
s1.push('+');
} else {
lastIndex = readDouble(s, i);
num = s.substring(i, lastIndex);
System.out.println("截取字符串" + num);
s2.push(Double.parseDouble(num));
System.out.println("s2 入棧" + s2.peek());
}
i = lastIndex - 1;
System.out.println("當前i" + i);
} else {
// 乘除時,直接做運算
if (temp == 'X' || temp == '/') {
System.out.println("s2出棧:-->" + s2.peek());
double num1 = s2.pop();
lastIndex = readDouble(s, i + 1);
double num2 = Double.parseDouble(s.substring(i + 1, lastIndex));
System.out.println("操作數:" + num2);
i = lastIndex - 1;
System.out.println("當前i" + i);
double result = calculate(num1, temp, num2);
System.out.println("num1" + temp + " num2 =" + result);
System.out.println("result 入棧 s2" + result);
s2.push(result);
// 當爲加減時,讓他直接入棧,等待操作
} else if (temp == '+' || temp == '-') {
System.out.println("s1 入棧" + temp);
s1.push(temp);
}
}
}
// 對剩下的加減運算,得出最終結果
while (!s1.isEmpty() && !s2.isEmpty() && s2.size() >= 2) {
System.out.println("s2 出棧:" + s2.peek());
double num2 = s2.pop();
System.out.println("s2 出棧:" + s2.peek());
double num1 = s2.pop();
System.out.println("s1 出棧:" + s1.peek());
double result = calculate(num1, s1.pop(), num2);
System.out.println("計算結果爲: " + result);
s2.push(result);
}
return s2.pop();
}