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());
}
}
start=true 替換顯示,false 追加start=true):僅記錄運算符(負號特殊處理)start=false):讀取顯示值 → calculate() 執行上一運算 → 記錄新運算符 → start=truecalculate():根據 op 更新 arg,刷新顯示KeyListener)CalculatorEngine + CalculatorView)經典 Swing 計算器教學案例,展示了事件驅動、狀態機、佈局管理、系統外觀適配核心技術。作為入門專案極佳,生產級需引入表達式引擎、MVC 架構、完善異常處理與測試覆蓋。