Java8 Swing实现计算器

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和逻辑封装在同一个类中

相关推荐
SccTsAxR2 小时前
[C语言]常见排序算法①
c语言·开发语言·经验分享·笔记·其他·排序算法
怀旧,3 小时前
【C++】20. unordered_set和unordered_map
开发语言·c++
alibli3 小时前
一文学会CMakeLists.txt: CMake现代C++跨平台工程化实战
开发语言·c++·系统架构
Florence234 小时前
GPU硬件架构和配置的理解
开发语言
李游Leo4 小时前
JavaScript事件机制与性能优化:防抖 / 节流 / 事件委托 / Passive Event Listeners 全解析
开发语言·javascript·性能优化
JJJJ_iii5 小时前
【左程云算法09】栈的入门题目-最小栈
java·开发语言·数据结构·算法·时间复杂度
枫叶丹45 小时前
【Qt开发】显示类控件(三)-> QProgressBar
开发语言·qt
Bear on Toilet5 小时前
继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
开发语言·javascript·c++·算法·继承
码猿宝宝5 小时前
浏览器中javascript时间线,从加载到执行
开发语言·javascript·ecmascript