首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Swing 計算器完整實戰代碼

     編輯:Java 相關知識

核心設計

  • CalculatorPanel:繼承 JPanel,實現 ActionListener,封裝所有邏輯
  • JTextField display:顯示輸入/結果,不可編輯
  • GridLayout(4,4):16 個按鈕佈局(789/456*123-0.=+)
  • 狀態變量:arg(累積結果)、op(當前運算符)、start(新數字輸入標誌)

完整代碼


package test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class test08 {
    public static void main(String[] args) {
        try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }
        catch (Exception e) {}
        JFrame frame = new CalculatorFrame();
        frame.setVisible(true);
    }
}

class CalculatorPanel extends JPanel implements ActionListener {
    private JTextField display;
    private JButton btn;
    private double arg = 0;
    private String op = "=";
    private boolean start = true;

    public CalculatorPanel() {
        setLayout(new BorderLayout());
        display = new JTextField("0");
        display.setEditable(false);
        add(display, BorderLayout.NORTH);

        JPanel p = new JPanel();
        p.setLayout(new GridLayout(4, 4));
        String buttons = "789/456*123-0.=+";
        for (int i = 0; i < buttons.length(); i++) {
            btn = new JButton(buttons.substring(i, i + 1));
            p.add(btn);
            btn.addActionListener(this);
        }
        add(p, BorderLayout.CENTER);
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        String s = evt.getActionCommand();
        // 數字鍵或小數點
        if ('0' <= s.charAt(0) && s.charAt(0) <= '9' || s.equals(".")) {
            if (start) display.setText(s);
            else display.setText(display.getText() + s);
            start = false;
        }
        // 運算符鍵
        else {
            if (start) {
                if (s.equals("-")) { display.setText(s); start = false; }
                else op = s;
            } else {
                double x = Double.parseDouble(display.getText());
                calculate(x);
                op = s;
                start = true;
            }
        }
    }

    public void calculate(double n) {
        switch (op) {
            case "+": arg += n; break;
            case "-": arg -= n; break;
            case "*": arg *= n; break;
            case "/": arg /= n; break;
            case "=": arg = n; break;
        }
        display.setText("" + arg);
    }
}

class CalculatorFrame extends JFrame {
    public CalculatorFrame() {
        setTitle("Java 計算器");
        setSize(220, 180);
        addWindowListener(new WindowAdapter() {
            @Override public void windowClosing(WindowEvent e) { System.exit(0); }
        });
        getContentPane().add(new CalculatorPanel());
    }
}

邏輯流程解析

  1. 數字鍵:start=true 替換顯示,false 追加
  2. 運算符:
    • 緊接運算符後(start=true):僅記錄運算符(負號特殊處理)
    • 數字後(start=false):讀取顯示值 → calculate() 執行上一運算 → 記錄新運算符 → start=true
  3. calculate():根據 op 更新 arg,刷新顯示

已知限制與改進方向

  • 無運算優先級(順序執行),需引入表達式解析(Shunting-yard 算法/ScriptEngine)
  • 無錯誤處理(除零、溢出、非法輸入)
  • 無鍵盤支持(可添加 KeyListener)
  • UI 硬編碼,建議外部化佈局/國際化
  • 邏輯與 UI 耦合,建議 MVC 分離(CalculatorEngine + CalculatorView)

總結

經典 Swing 計算器教學案例,展示了事件驅動、狀態機、佈局管理、系統外觀適配核心技術。作為入門專案極佳,生產級需引入表達式引擎、MVC 架構、完善異常處理與測試覆蓋。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved