Java Swing實現計算器功能

學習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();
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章