首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 簡易計算器 GUI:事件處理與計算邏輯分離實現

     編輯:程式設計疑難解答

需求

Swing 界面:兩個輸入框、四個運算按鈕(+ - * /)、結果顯示框。點擊運算按鈕時,中間顯示運算符,結果框顯示計算結果。

計算器界面草圖

問題代碼分析

b1.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent e) {
        // 註釋部分:解析文本框、計算、設置結果
        if (e.getSource() == b1) l1.setText("+"); // 僅設置運算符
    }
});

問題:計算邏輯被註釋,且耦合在匿名內部類中,難以擴展。

重構設計:MVC 分層

1. 模型層:運算策略接口

interface Operator {
    double apply(double a, double b);
    String symbol();
}

class AddOperator implements Operator {
    public double apply(double a, double b) { return a + b; }
    public String symbol() { return "+"; }
}
// 減乘除同理...

2. 工廠獲取運算器

class OperatorFactory {
    static Operator get(char op) {
        switch (op) {
            case '+': return new AddOperator();
            case '-': return new SubOperator();
            case '*': return new MulOperator();
            case '/': return new DivOperator();
        }
        throw new IllegalArgumentException("未知運算符");
    }
}

3. 視圖層:統一監聽器

public class CalculatorFrame extends JFrame implements ActionListener {
    JTextField tf1, tf2, tfResult;
    JLabel lblOp;
    JButton btnAdd, btnSub, btnMul, btnDiv;

    public CalculatorFrame() {
        // 初始化組件、佈局...
        btnAdd.addActionListener(this);
        btnSub.addActionListener(this);
        btnMul.addActionListener(this);
        btnDiv.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();
        char op = '?';
        if (src == btnAdd) op = '+';
        else if (src == btnSub) op = '-';
        else if (src == btnMul) op = '*';
        else if (src == btnDiv) op = '/';

        lblOp.setText(String.valueOf(op)); // 顯示運算符

        try {
            double a = Double.parseDouble(tf1.getText().trim());
            double b = Double.parseDouble(tf2.getText().trim());
            Operator oper = OperatorFactory.get(op);
            double result = oper.apply(a, b);
            tfResult.setText(String.valueOf(result));
        } catch (NumberFormatException ex) {
            tfResult.setText("輸入錯誤");
        } catch (ArithmeticException ex) {
            tfResult.setText("除數不能為零");
        }
    }
}

關鍵改進點

  • 運算邏輯解耦:策略模式 + 工廠,新增運算只需加類、改工廠。
  • 統一監聽器:框架實現 ActionListener,e.getSource() 區分按鈕。
  • 異常處理:捕獲格式錯誤、除零異常,友好提示。
  • 文本解析:Double.parseDouble 而非 Integer.getInteger(後者讀取系統屬性)。

總結

計算器 GUI 的核心在於「界面與邏輯分離」。採用策略模式封裝運算、統一事件監聽、異常保護,代碼清晰、易擴展、健壯。新手請牢記:JTextField.getText() 返回字符串,需 parseDouble 轉數值。

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