Java Swing 实现简易计算器.exe 的demo

简介

SwingJava 官方图形界面(GUI)工具包,基于 AWT 重写,纯 Java 实现、跨平台,组件统一渲染,不受操作系统原生控件限制。
包路径:javax.swing.*
顶层窗口:JFrame(主窗口)、JDialog(弹窗)
所有组件以 J 开头:JButtonJLabelJTextField
线程规范:GUI 代码必须在事件调度线程 EDT 执行,推荐 SwingUtilities.invokeLater()

1. demo代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame implements ActionListener {
    // 显示输入结果的文本框
    private JTextField display;
    // 操作数、运算符缓存
    private String num1 = "";
    private String num2 = "";
    private String operator = "";

    public Calculator() {
        // 窗口基础设置
        setTitle("简易计算器");
        setSize(300, 400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 窗口居中
        setResizable(false); // 禁止缩放

        // 主面板,垂直布局
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

        // 输入显示框
        display = new JTextField();
        display.setFont(new Font("微软雅黑", Font.PLAIN, 28));
        display.setHorizontalAlignment(JTextField.RIGHT);
        display.setEditable(false); // 禁止手动输入
        mainPanel.add(display, BorderLayout.NORTH);

        // 按钮面板 4行4列网格布局
        JPanel btnPanel = new JPanel();
        btnPanel.setLayout(new GridLayout(4, 4, 8, 8));

        // 按钮文字数组
        String[] btnTexts = {
                "7", "8", "9", "/",
                "4", "5", "6", "*",
                "1", "2", "3", "-",
                "0", ".", "=", "+"
        };

        // 循环创建按钮并绑定事件
        for (String text : btnTexts) {
            JButton btn = new JButton(text);
            btn.setFont(new Font("微软雅黑", Font.PLAIN, 18));
            btn.addActionListener(this);
            btnPanel.add(btn);
        }

        // 功能按钮一行(清零、退格)
        JPanel funcPanel = new JPanel();
        funcPanel.setLayout(new GridLayout(1, 2, 8, 8));
        JButton clearBtn = new JButton("C");
        JButton backBtn = new JButton("←");
        clearBtn.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        backBtn.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        clearBtn.addActionListener(this);
        backBtn.addActionListener(this);
        funcPanel.add(clearBtn);
        funcPanel.add(backBtn);

        // 组装面板
        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new BorderLayout(10, 10));
        centerPanel.add(funcPanel, BorderLayout.NORTH);
        centerPanel.add(btnPanel, BorderLayout.CENTER);
        mainPanel.add(centerPanel, BorderLayout.CENTER);

        add(mainPanel);
    }

    // 按钮点击监听逻辑
    @Override
    public void actionPerformed(ActionEvent e) {
        String clickText = e.getActionCommand();

        // 清零 C
        if ("C".equals(clickText)) {
            display.setText("");
            num1 = "";
            num2 = "";
            operator = "";
            return;
        }

        // 退格 ←
        if ("←".equals(clickText)) {
            String text = display.getText();
            if (text.length() > 0) {
                display.setText(text.substring(0, text.length() - 1));
            }
            return;
        }

        // 等于 = 计算结果
        if ("=".equals(clickText)) {
            if (num1.isEmpty() || operator.isEmpty()) return;
            num2 = display.getText();
            double n1 = Double.parseDouble(num1);
            double n2 = Double.parseDouble(num2);
            double result = 0;

            switch (operator) {
                case "+": result = n1 + n2; break;
                case "-": result = n1 - n2; break;
                case "*": result = n1 * n2; break;
                case "/":
                    if (n2 == 0) {
                        display.setText("除数不能为0");
                        num1 = num2 = operator = "";
                        return;
                    }
                    result = n1 / n2;
                    break;
            }
            // 整数去掉小数点后.0
            if (result == (long) result) {
                display.setText(String.valueOf((long) result));
            } else {
                display.setText(String.valueOf(result));
            }
            // 计算完成清空缓存,可继续用结果运算
            num1 = display.getText();
            operator = "";
            num2 = "";
            return;
        }

        // 运算符 + - * /
        if ("+".equals(clickText) || "-".equals(clickText) || "*".equals(clickText) || "/".equals(clickText)) {
            if (!display.getText().isEmpty()) {
                num1 = display.getText();
                operator = clickText;
                display.setText("");
            }
            return;
        }

        // 数字和小数点
        String current = display.getText();
        // 防止多个小数点
        if (".".equals(clickText) && current.contains(".")) {
            return;
        }
        display.setText(current + clickText);
    }

    // 程序入口
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Calculator calc = new Calculator();
            calc.setVisible(true);
        });
    }
}

2. 打包成可运行 Jar 步骤(IDEA)

File → Project Structure → Artifacts → + → JAR → From modules with dependencies
在这里插入图片描述
在这里插入图片描述

Main class 选择 Calculator
在这里插入图片描述

勾选 Extract to the target JAR
在这里插入图片描述

Build → Build Artifacts 生成 jar 包
在这里插入图片描述
在这里插入图片描述

3. 下载安装launch4j

地址:https://launch4j.sourceforge.net/index.html
在这里插入图片描述
在这里插入图片描述

下载后双击运行安装然后打开

4.打包

Icon可以选择图标,我这里没有选,有需要的可以自行选择
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果报错如下
在这里插入图片描述
就是jdk的版本不一致
我的是程序编译用高版本 Java(如 Java17),运行时用低版本 JRE(Java8)出现的这个问题,修改下就好了

直接打出来的exe包别人无法运行,因为缺少环境

需要这样打包:
https://blog.csdn.net/YXWik/article/details/162209280

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值