java
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator_me extends JFrame implements ActionListener {
private JTextField display;// 显示屏
private JButton[] numberButtons = new JButton[10];// 数字
private JButton[] operatorButtons = new JButton[8];// 运算符
private JButton addButton, subButton, mulButton, divButton;
private JButton decButton, equButton, delButton, clrButton;
private double num1 = 0, num2 = 0, result = 0;
private char operator;
public Calculator_me() {
initializeComponents();
setupLayout();
addEventListeners();
setupWindow();
}
private void initializeComponents() {
display = new JTextField();
display.setPreferredSize(new Dimension(320, 50));
display.setFont(new Font("Arial", Font.BOLD, 20));
display.setEditable(false); // 数字只能通过按键修改
display.setHorizontalAlignment(JTextField.RIGHT);
addButton = new JButton("+");
subButton = new JButton("-");
mulButton = new JButton("×");
divButton = new JButton("÷");
equButton = new JButton("=");
delButton = new JButton("删除");
clrButton = new JButton("清空");
// 将运算符按钮添加到数组中便于管理
operatorButtons[0] = addButton;
operatorButtons[1] = subButton;
operatorButtons[2] = mulButton;
operatorButtons[3] = divButton;
operatorButtons[4] = decButton;
operatorButtons[5] = equButton;
operatorButtons[6] = delButton;
operatorButtons[7] = clrButton;
// 创建数字按钮0-9
for (int i = 0; i < 10; i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].setFont(new Font("Arial", Font.BOLD, 18));
numberButtons[i].setFocusable(false);
}
// 设置所有运算符按钮的字体和样式
for (int i = 0; i < 8; i++) {
operatorButtons[i].setFont(new Font("Arial", Font.BOLD, 18));
operatorButtons[i].setFocusable(false);
}
}
// 将组件添加至窗体
private void setupLayout() {
// 主面板
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
// 创建显示区域
JPanel displayPanel = new JPanel();
displayPanel.add(display);
// 创建按钮区域面板,使用网格布局
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(5, 4, 5, 5));
// 第一行:清空、删除、空白、除法
buttonPanel.add(clrButton);
buttonPanel.add(delButton);
buttonPanel.add(new JButton()); // 空白占位
buttonPanel.add(divButton);
// 第二行:7、8、9、乘法
buttonPanel.add(numberButtons[7]);
buttonPanel.add(numberButtons[8]);
buttonPanel.add(numberButtons[9]);
buttonPanel.add(mulButton);
// 第三行:4、5、6、减法
buttonPanel.add(numberButtons[4]);
buttonPanel.add(numberButtons[5]);
buttonPanel.add(numberButtons[6]);
buttonPanel.add(subButton);
// 第四行:1、2、3、加法
buttonPanel.add(numberButtons[1]);
buttonPanel.add(numberButtons[2]);
buttonPanel.add(numberButtons[3]);
buttonPanel.add(addButton);
// 第五行:空白、0、小数点、等号
buttonPanel.add(new JButton()); // 空白占位
buttonPanel.add(numberButtons[0]);
buttonPanel.add(decButton);
buttonPanel.add(equButton);
// 将显示面板和按钮面板添加到主面板
panel.add(displayPanel, BorderLayout.NORTH);
panel.add(buttonPanel, BorderLayout.CENTER);
// 主面板添加到窗体
this.add(panel);
}
private void addEventListeners() {
for (int i = 0; i < numberButtons.length; i++) {
numberButtons[i].addActionListener(this);
}
for (int i = 0; i < operatorButtons.length; i++) {
operatorButtons[i].addActionListener(this);
}
}
private void setupWindow() {
this.setTitle("Java 8 计算器");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(350, 400);
this.setLocationRelativeTo(null);
this.setResizable(false);
}
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < 10; i++) {
if (e.getSource() == numberButtons[i]) {
display.setText(display.getText().concat(numberButtons[i].getText()));
}
}
if (e.getSource() == decButton) {
if (!display.getText().contains(".")) {
display.setText(display.getText().concat(String.valueOf(".")));
}
}
if (e.getSource() == addButton || e.getSource() == subButton || e.getSource() == mulButton
|| e.getSource() == divButton) {
num1 = Double.parseDouble(display.getText());
operator = e.getActionCommand().charAt(0);
display.setText("");
}
if (e.getSource() == equButton) {
num2 = Double.parseDouble(display.getText());
result = perfromCalculation(num1, num2, operator);
display.setText(String.valueOf(result));
num1 = result;
}
if (e.getSource() == clrButton) {
display.setText("");
num1 = 0;
num2 = 0;
result = 0;
}
if (e.getSource() == delButton) {
String str = display.getText();
if (str.length() > 0) {
display.setText(str.substring(0, str.length() - 1));
}
}
}
private double perfromCalculation(double num1, double num2, char operator) {
switch (operator) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
if (num2 != 0) {
return num1 / num2;
} else {
JOptionPane.showMessageDialog(this, "除数不能为0", "计算错误", JOptionPane.ERROR_MESSAGE);
return 0;
}
default:
return 0;
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new Calculator().setVisible(true);
});
}
}
基于Swing GUI的计算器实现
包括:
UI组件创建和初始化
在窗体中添加UI组件
编写事件影响逻辑
计算逻辑实现
在initializeComponents()中,添加了显示器和按钮组件
java
// 显示屏组件
display = new JTextField();
display.setPreferredSize(new Dimension(320, 50));
display.setFont(new Font("Arial", Font.BOLD, 20));
display.setEditable(false); // 设置为只读
// 数字按钮 0-9
for (int i = 0; i < 10; i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].setFont(new Font("Arial", Font.BOLD, 18));
}
// 运算符按钮
addButton = new JButton("+");
subButton = new JButton("-");
// ... 其他按钮
布局
在setupLayout()方法中通过布局管理器添加组件,BorderLayout是一个边界布局管理器实例
将容器氛围东西南北中五个区域
java
// 使用 BorderLayout 作为主布局
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
// 使用 GridLayout 排列按钮
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(5, 4, 5, 5)); // 5行4列,间距5像素
// 添加组件到面板
buttonPanel.add(clrButton);
buttonPanel.add(delButton);
// ... 添加其他按钮
// 将面板添加到主窗体
panel.add(displayPanel, BorderLayout.NORTH);
panel.add(buttonPanel, BorderLayout.CENTER);
this.add(panel);
事件响应逻辑
通过ActionListener处理点击事件
java
public class Calculator extends JFrame implements ActionListener {
// 添加事件监听器
private void addEventListeners() {
for (int i = 0; i < 10; i++) {
numberButtons[i].addActionListener(this);
}
for (int i = 0; i < 8; i++) {
operatorButtons[i].addActionListener(this);
}
}
// 事件处理方法
@Override
public void actionPerformed(ActionEvent e) {
// 处理数字按钮
for (int i = 0; i < 10; i++) {
if (e.getSource() == numberButtons[i]) {
display.setText(display.getText().concat(String.valueOf(i)));
}
}
// ... 处理其他按钮
}
}
计算逻辑
java
private double performCalculation(double num1, double num2, char operator) {
switch (operator) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
if (num2 != 0) {
return num1 / num2;
} else {
JOptionPane.showMessageDialog(this, "错误:除数不能为零!");
return 0;
}
default:
return 0;
}
}
结构分析
Calculator_me类继承了JFrame创建窗体应用
实现ActionListener处理按钮事件
将UI和逻辑封装在同一个类中