跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

基于 Java Swing 的个人所得税计算模拟器

基于 Java Swing 开发的一款个人所得税计算模拟器,模拟官方个税 APP 核心功能,支持综合所得年度汇算计算、税率表查询及专项扣除设置。项目采用纯 Java 实现,无第三方依赖,利用 BigDecimal 保证计算精度,遵循 2023 年个税政策。包含主程序入口、核心计算逻辑类及图形界面代码示例。适用于 Java 学习者参考或作为税务计算工具原型。注意本程序仅为模拟器,实际报税请以官方系统为准。

星云发布于 2026/3/23更新于 2026/5/69 浏览
基于 Java Swing 的个人所得税计算模拟器

项目简介

本项目是一个使用 Java Swing 开发的个人所得税计算模拟器,模拟了官方个税 APP 的核心功能,包括:

  • 综合所得年度汇算计算
  • 税率表查询
  • 专项扣除项目设置
  • 税务计算结果展示

项目特点:

  • 100% 纯 Java 实现,无第三方依赖
  • 完整 GUI 界面,支持用户交互
  • 详细的代码注释
  • 遵循 2023 年最新个税政策

核心代码实现

1. 主程序入口

package com.tax.calculator;

import javax.swing.*;

/**
 * 个人所得税计算模拟器 - 主程序
 * @author TaxDeveloper
 * @version 1.0
 */
public class PersonalIncomeTaxApp {
    public static void main(String[] args) {
        // 使用 SwingUtilities 确保线程安全
        SwingUtilities.invokeLater(() -> {
            try {
                // 设置系统外观
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                
                // 创建并显示主窗口
                TaxCalculatorFrame frame = new TaxCalculatorFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
                
                System.out.println("个人所得税计算模拟器启动成功!");
            } catch (Exception e) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(null, 
                    "程序启动失败:" + e.getMessage(), 
                    "错误", 
                    JOptionPane.ERROR_MESSAGE);
            }
        });
    }
}

2. 个税计算核心类

 com.tax.calculator;

 java.math.BigDecimal;
 java.math.RoundingMode;
 java.util.HashMap;
 java.util.Map;


   {
    
    
       TaxBracket[] TAX_BRACKETS = {
         (, , , ),
         (, , , ),
         (, , , ),
         (, , , ),
         (, , , ),
         (, , , ),
         (, Double.MAX_VALUE, , )
    };
    
    
       Map<String, BigDecimal> SPECIAL_DEDUCTIONS =  <>();
    
     {
        
        SPECIAL_DEDUCTIONS.put(,  ());
        SPECIAL_DEDUCTIONS.put(,  ());
        SPECIAL_DEDUCTIONS.put(,  ());
        SPECIAL_DEDUCTIONS.put(,  ());
        SPECIAL_DEDUCTIONS.put(,  ());
        SPECIAL_DEDUCTIONS.put(,  ());
        SPECIAL_DEDUCTIONS.put(,  ()); 
        SPECIAL_DEDUCTIONS.put(,  ());
        SPECIAL_DEDUCTIONS.put(,  ());
        SPECIAL_DEDUCTIONS.put(,  ());
    }
    
    
      TaxResult  {
        
        
            ;
        
        
           BigDecimal.valueOf(annualIncome);
           BigDecimal.valueOf(specialDeductions);
           BigDecimal.valueOf(additionalDeductions);
           BigDecimal.valueOf(BASIC_DEDUCTION);
        
        
           income
            .subtract(special)
            .subtract(additional)
            .subtract(basic)
            .max(BigDecimal.ZERO); 
        
        
           findTaxBracket(taxableIncome.doubleValue());
        
        
           taxableIncome
            .multiply(BigDecimal.valueOf(bracket.getRate()))
            .subtract(BigDecimal.valueOf(bracket.getQuickDeduction()));
        
        
        taxAmount = taxAmount.max(BigDecimal.ZERO);
        
        
           income.subtract(taxAmount);
        
          (
            income.doubleValue(),
            taxableIncome.doubleValue(),
            taxAmount.doubleValue(),
            afterTaxIncome.doubleValue(),
            bracket
        );
    }
    
    
      TaxBracket  {
         (TaxBracket bracket : TAX_BRACKETS) {
             (taxableIncome >= bracket.getLowerBound() && 
                taxableIncome < bracket.getUpperBound()) {
                 bracket;
            }
        }
         TAX_BRACKETS[TAX_BRACKETS.length - ];
    }
    
    
      Map<String, BigDecimal>  {
          <>(SPECIAL_DEDUCTIONS);
    }
    
    
        {
           lowerBound;
           upperBound;
           rate;
           quickDeduction;
        
          {
            .lowerBound = lowerBound;
            .upperBound = upperBound;
            .rate = rate;
            .quickDeduction = quickDeduction;
        }
        
        
           {  lowerBound; }
           {  upperBound; }
           {  rate; }
           {  quickDeduction; }
        
        
         String  {
             String.format(, rate * , quickDeduction);
        }
    }
    
    
        {
           totalIncome;          
           taxableIncome;        
           taxAmount;            
           afterTaxIncome;       
          TaxBracket taxBracket;       
        
          {
            .totalIncome = totalIncome;
            .taxableIncome = taxableIncome;
            .taxAmount = taxAmount;
            .afterTaxIncome = afterTaxIncome;
            .taxBracket = taxBracket;
        }
        
        
           {  totalIncome; }
           {  taxableIncome; }
           {  taxAmount; }
           {  afterTaxIncome; }
         TaxBracket  {  taxBracket; }
        
        
         String  {
             String.format(
                 +
                 +
                 +
                 +
                 +
                ,
                totalIncome, taxableIncome, taxAmount, afterTaxIncome, taxBracket
            );
        }
    }
}
package
import
import
import
import
/** * 个人所得税计算器 * 实现 2023 年最新个税计算规则 */
public
class
TaxCalculator
// 税率表(年度综合所得)
private
static
final
new
TaxBracket
0
36000
0.03
0
new
TaxBracket
36000
144000
0.10
2520
new
TaxBracket
144000
300000
0.20
16920
new
TaxBracket
300000
420000
0.25
31920
new
TaxBracket
420000
660000
0.30
52920
new
TaxBracket
660000
960000
0.35
85920
new
TaxBracket
960000
0.45
181920
// 月度专项扣除标准
private
static
final
new
HashMap
static
// 初始化专项扣除标准(月度)
"养老"
new
BigDecimal
"1000"
"医疗"
new
BigDecimal
"200"
"失业"
new
BigDecimal
"50"
"住房"
new
BigDecimal
"1200"
"子女教育"
new
BigDecimal
"1000"
"继续教育"
new
BigDecimal
"400"
"大病医疗"
new
BigDecimal
"8000"
// 年度上限
"房贷利息"
new
BigDecimal
"1000"
"住房租金"
new
BigDecimal
"1500"
"赡养老人"
new
BigDecimal
"2000"
/** * 计算年度个人所得税 * @param annualIncome 年度总收入 * @param specialDeductions 专项扣除金额 * @param additionalDeductions 专项附加扣除 * @return 计算结果 */
public
static
calculateAnnualTax
( double annualIncome, double specialDeductions, double additionalDeductions)
// 基本扣除费用(年度)
final
double
BASIC_DEDUCTION
=
60000
// 转换为 BigDecimal 确保精度
BigDecimal
income
=
BigDecimal
special
=
BigDecimal
additional
=
BigDecimal
basic
=
// 计算应纳税所得额
BigDecimal
taxableIncome
=
// 不能为负数
// 查找适用税率
TaxBracket
bracket
=
// 计算应纳税额
BigDecimal
taxAmount
=
// 确保税额不为负数
// 计算税后收入
BigDecimal
afterTaxIncome
=
return
new
TaxResult
/** * 根据应纳税所得额查找适用税率 */
private
static
findTaxBracket
(double taxableIncome)
for
if
return
return
1
/** * 获取专项扣除标准 */
public
static
getSpecialDeductionStandards
()
return
new
HashMap
/** * 税率档次类 */
public
static
class
TaxBracket
private
final
double
private
final
double
private
final
double
private
final
double
public
TaxBracket
(double lowerBound, double upperBound, double rate, double quickDeduction)
this
this
this
this
// Getter 方法
public
double
getLowerBound
()
return
public
double
getUpperBound
()
return
public
double
getRate
()
return
public
double
getQuickDeduction
()
return
@Override
public
toString
()
return
"税率:%.1f%%, 速算扣除数:%.0f"
100
/** * 计算结果类 */
public
static
class
TaxResult
private
final
double
// 总收入
private
final
double
// 应纳税所得额
private
final
double
// 应纳税额
private
final
double
// 税后收入
private
final
// 适用税率档次
public
TaxResult
(double totalIncome, double taxableIncome, double taxAmount, double afterTaxIncome, TaxBracket taxBracket)
this
this
this
this
this
// Getter 方法
public
double
getTotalIncome
()
return
public
double
getTaxableIncome
()
return
public
double
getTaxAmount
()
return
public
double
getAfterTaxIncome
()
return
public
getTaxBracket
()
return
@Override
public
toString
()
return
"计算结果:\n"
"总收入:¥%.2f\n"
"应纳税所得额:¥%.2f\n"
"应纳税额:¥%.2f\n"
"税后收入:¥%.2f\n"
"适用税率:%s"

3. GUI 界面实现

package com.tax.calculator;

import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.util.Map;

/**
 * 个税计算器主界面
 */
public class TaxCalculatorFrame extends JFrame {
    
    private JTextField incomeField;
    private JTextField specialDeductionField;
    private JTextField additionalDeductionField;
    private JTextArea resultArea;
    private JComboBox<String> deductionTypeCombo;
    private JLabel standardLabel;
    
    public TaxCalculatorFrame() {
        initUI();
        initData();
    }
    
    private void initUI() {
        setTitle("个人所得税计算模拟器 v1.0");
        setSize(800, 600);
        setLocationRelativeTo(null);
        
        // 主面板
        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        
        // 输入面板
        mainPanel.add(createInputPanel(), BorderLayout.NORTH);
        
        // 结果面板
        mainPanel.add(createResultPanel(), BorderLayout.CENTER);
        
        // 按钮面板
        mainPanel.add(createButtonPanel(), BorderLayout.SOUTH);
        
        add(mainPanel);
    }
    
    private JPanel createInputPanel() {
        JPanel panel = new JPanel(new GridLayout(5, 2, 10, 10));
        panel.setBorder(BorderFactory.createTitledBorder(
            BorderFactory.createLineBorder(Color.GRAY),
            "个税计算参数输入",
            TitledBorder.LEFT,
            TitledBorder.TOP
        ));
        
        // 年度总收入
        panel.add(new JLabel("年度总收入 (¥):"));
        incomeField = new JTextField("120000");
        panel.add(incomeField);
        
        // 专项扣除
        panel.add(new JLabel("三险一金专项扣除 (¥):"));
        specialDeductionField = new JTextField("10000");
        panel.add(specialDeductionField);
        
        // 专项附加扣除
        panel.add(new JLabel("专项附加扣除 (¥):"));
        additionalDeductionField = new JTextField("3000");
        panel.add(additionalDeductionField);
        
        // 扣除标准查询
        panel.add(new JLabel("扣除项目查询:"));
        JPanel queryPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        deductionTypeCombo = new JComboBox<>();
        queryPanel.add(deductionTypeCombo);
        standardLabel = new JLabel("标准:¥0");
        queryPanel.add(standardLabel);
        panel.add(queryPanel);
        
        return panel;
    }
    
    private JScrollPane createResultPanel() {
        resultArea = new JTextArea();
        resultArea.setEditable(false);
        resultArea.setFont(new Font("宋体", Font.PLAIN, 14));
        resultArea.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        
        JScrollPane scrollPane = new JScrollPane(resultArea);
        scrollPane.setBorder(BorderFactory.createTitledBorder("计算结果"));
        
        return scrollPane;
    }
    
    private JPanel createButtonPanel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 10));
        
        // 计算按钮
        JButton calculateBtn = new JButton("计算个税");
        calculateBtn.setFont(new Font("微软雅黑", Font.BOLD, 14));
        calculateBtn.setBackground(new Color(70, 130, 180));
        calculateBtn.setForeground(Color.WHITE);
        calculateBtn.setPreferredSize(new Dimension(120, 40));
        
        calculateBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                calculateTax();
            }
        });
        
        // 清除按钮
        JButton clearBtn = new JButton("清除结果");
        clearBtn.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        clearBtn.setPreferredSize(new Dimension(120, 40));
        clearBtn.addActionListener(e -> clearResults());
        
        // 税率表按钮
        JButton rateTableBtn = new JButton("查看税率表");
        rateTableBtn.setFont(new Font("微软雅黑", Font.PLAIN, 14));
        rateTableBtn.setPreferredSize(new Dimension(120, 40));
        rateTableBtn.addActionListener(e -> showTaxRateTable());
        
        panel.add(calculateBtn);
        panel.add(clearBtn);
        panel.add(rateTableBtn);
        
        return panel;
    }
    
    private void initData() {
        // 初始化扣除类型下拉框
        Map<String, BigDecimal> standards = TaxCalculator.getSpecialDeductionStandards();
        for (String key : standards.keySet()) {
            deductionTypeCombo.addItem(key);
        }
        
        // 添加下拉框监听
        deductionTypeCombo.addActionListener(e -> {
            String selected = (String) deductionTypeCombo.getSelectedItem();
            if (selected != null) {
                BigDecimal standard = standards.get(selected);
                standardLabel.setText(String.format("标准:¥%.2f", standard));
            }
        });
        
        // 默认选择第一个
        if (deductionTypeCombo.getItemCount() > 0) {
            deductionTypeCombo.setSelectedIndex(0);
        }
    }
    
    /**
     * 执行个税计算
     */
    private void calculateTax() {
        try {
            // 获取输入值
            double income = Double.parseDouble(incomeField.getText());
            double special = Double.parseDouble(specialDeductionField.getText());
            double additional = Double.parseDouble(additionalDeductionField.getText());
            
            // 验证输入
            if (income < 0 || special < 0 || additional < 0) {
                JOptionPane.showMessageDialog(this,
                    "输入值不能为负数!",
                    "输入错误",
                    JOptionPane.WARNING_MESSAGE);
                return;
            }
            
            // 执行计算
            TaxCalculator.TaxResult result = TaxCalculator.calculateAnnualTax(
                income, special, additional);
            
            // 显示结果
            displayResult(result);
            
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(this,
                "请输入有效的数字!",
                "输入错误",
                JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * 显示计算结果
     */
    private void displayResult(TaxCalculator.TaxResult result) {
        StringBuilder sb = new StringBuilder();
        sb.append("=== 个人所得税计算结果 ===\n\n");
        sb.append(String.format("年度总收入:¥%,.2f\n", result.getTotalIncome()));
        sb.append(String.format("应纳税所得额:¥%,.2f\n", result.getTaxableIncome()));
        sb.append(String.format("适用税率档次:%s\n", result.getTaxBracket()));
        sb.append(String.format("应纳个人所得税:¥%,.2f\n", result.getTaxAmount()));
        sb.append(String.format("年度税后收入:¥%,.2f\n\n", result.getAfterTaxIncome()));
        
        // 计算月度数据
        double monthlyTax = result.getTaxAmount() / 12;
        double monthlyAfterTax = result.getAfterTaxIncome() / 12;
        
        sb.append("=== 月度数据估算 ===\n");
        sb.append(String.format("月度平均纳税:¥%,.2f\n", monthlyTax));
        sb.append(String.format("月度税后收入:¥%,.2f\n\n", monthlyAfterTax));
        
        // 添加税务建议
        sb.append("=== 税务优化建议 ===\n");
        if (result.getTaxableIncome() > 0) {
            sb.append("1. 充分利用专项附加扣除项目\n");
            sb.append("2. 合理规划年度收入时间分布\n");
            sb.append("3. 符合条件的捐赠可税前扣除\n");
        } else {
            sb.append("当前收入无需缴纳个人所得税\n");
        }
        
        resultArea.setText(sb.toString());
        resultArea.setCaretPosition(0);
    }
    
    /**
     * 显示税率表
     */
    private void showTaxRateTable() {
        StringBuilder sb = new StringBuilder();
        sb.append("=== 个人所得税税率表(综合所得) ===\n\n");
        sb.append("级数 | 全年应纳税所得额 | 税率 | 速算扣除数\n");
        sb.append("----|-----------------|------|----------\n");
        
        TaxCalculator.TaxBracket[] brackets = new TaxCalculator.TaxBracket[]{
            new TaxCalculator.TaxBracket(0, 36000, 0.03, 0),
            new TaxCalculator.TaxBracket(36000, 144000, 0.10, 2520),
            new TaxCalculator.TaxBracket(144000, 300000, 0.20, 16920),
            new TaxCalculator.TaxBracket(300000, 420000, 0.25, 31920),
            new TaxCalculator.TaxBracket(420000, 660000, 0.30, 52920),
            new TaxCalculator.TaxBracket(660000, 960000, 0.35, 85920),
            new TaxCalculator.TaxBracket(960000, Double.MAX_VALUE, 0.45, 181920)
        };
        
        for (int i = 0; i < brackets.length; i++) {
            TaxCalculator.TaxBracket b = brackets[i];
            String range;
            if (b.getUpperBound() == Double.MAX_VALUE) {
                range = String.format("超过%,.0f 元", b.getLowerBound());
            } else {
                range = String.format("%,.0f - %, .0f 元", 
                    b.getLowerBound(), b.getUpperBound());
            }
            
            sb.append(String.format("%-4d| %-15s | %.1f%% | %,.0f 元\n", 
                i + 1, range, b.getRate() * 100, b.getQuickDeduction()));
        }
        
        sb.append("\n注:应纳税所得额 = 年度收入 - 6 万元 (基本扣除) - 专项扣除 - 专项附加扣除\n");
        
        resultArea.setText(sb.toString());
    }
    
    /**
     * 清除结果
     */
    private void clearResults() {
        resultArea.setText("");
    }
}

使用说明

1. 运行环境要求

  • Java 8 或更高版本
  • 支持 Swing 的桌面环境

2. 编译运行

# 编译所有 Java 文件
javac -d . com/tax/calculator/*.java

# 运行程序
java com.tax.calculator.PersonalIncomeTaxApp

3. 程序功能演示

  1. 输入计算参数:
    • 年度总收入
    • 三险一金专项扣除
    • 专项附加扣除
  2. 查询扣除标准:
    • 通过下拉框选择不同扣除项目
    • 查看各项目扣除标准
  3. 计算个税:
    • 点击'计算个税'按钮
    • 查看详细计算结果
  4. 查看税率表:
    • 点击'查看税率表'按钮
    • 了解各级税率信息

核心算法说明

1. 计算公式

应纳税所得额 = 年度收入 - 60000(基本减除费用) - 专项扣除 - 专项附加扣除
应纳税额 = 应纳税所得额 × 适用税率 - 速算扣除数

2. 税率表算法

采用逐级累进计算方式,通过查找表确定适用税率。

项目扩展建议

  1. 数据持久化:添加文件保存/加载功能
  2. 历史记录:记录多次计算结果
  3. 导出功能:支持 PDF/Excel 导出
  4. 联网更新:自动更新税率政策
  5. 图表展示:使用 JFreeChart 添加图表

注意事项

  1. 本程序为模拟器,实际报税请以官方系统为准
  2. 税率政策如有更新,需要相应修改代码
  3. 计算结果仅供参考,不构成税务建议

目录

  1. 项目简介
  2. 核心代码实现
  3. 1. 主程序入口
  4. 2. 个税计算核心类
  5. 3. GUI 界面实现
  6. 使用说明
  7. 1. 运行环境要求
  8. 2. 编译运行
  9. 编译所有 Java 文件
  10. 运行程序
  11. 3. 程序功能演示
  12. 核心算法说明
  13. 1. 计算公式
  14. 2. 税率表算法
  15. 项目扩展建议
  16. 注意事项
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 我用 Nexent 做了个 AI 大厨:基于 Nexent 知识库与 MCP 生态打造智能烹饪顾问实战
  • 深入解析潜在扩散模型(LDMs)架构与原理
  • Stable Diffusion WebUI 落幕:AI 绘画框架的技术演进与思考
  • 强化学习基础:动态规划算法原理与实现
  • 大型语言模型(LLM)核心技术与应用学习路线
  • 基于 Netty 构建高性能 HTTP 服务器实战
  • 昇腾 Ascend C 编程模型与算子开发实战
  • Ubuntu 实体机与虚拟机安装及配置避坑指南
  • Google 发布 Gemini Embedding 2 及 MuleRun 自进化 AI 助手动态
  • Vivado 2023.2 安装指南:Windows 与 Linux 双平台部署
  • Python Web 框架 Django 核心功能与实战
  • Linux 信号机制深度剖析:从信号捕捉到 SIGCHLD 处理
  • 基于 Java 的百度地图路线规划服务开发指南
  • Fooocus 实战指南:基于 SDXL 的 AI 图像生成入门
  • Pico 4XVR 1.10.13 版本下载安装指南
  • C++ 与 Linux 多线程进阶:深入理解互斥锁
  • WebGL 黑洞着色器:广义相对论真实吸积盘效果
  • Web 开发中五种核心加密算法实战与原理
  • ToDesk ToClaw:AI Agent 如何真正融入日常工作流
  • 基于Rokid灵珠AI平台的春节全能助手智能体开发实践

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online