Swing 界面:兩個輸入框、四個運算按鈕(+ - * /)、結果顯示框。點擊運算按鈕時,中間顯示運算符,結果框顯示計算結果。
b1.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
// 註釋部分:解析文本框、計算、設置結果
if (e.getSource() == b1) l1.setText("+"); // 僅設置運算符
}
});
問題:計算邏輯被註釋,且耦合在匿名內部類中,難以擴展。
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 "+"; }
}
// 減乘除同理...
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("未知運算符");
}
}
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 轉數值。