基于 Java Swing 的个人所得税计算模拟器源码实现
本项目使用 Java Swing 开发个人所得税计算模拟器,模拟官方个税 APP 核心功能,包括综合所得年度汇算、税率表查询及专项扣除设置。代码采用纯 Java 实现,无第三方依赖,遵循 2023 年最新个税政策。提供完整 GUI 界面与核心计算逻辑,支持用户交互。适用于 Java 学习者参考税务计算需求。程序为模拟器,实际报税请以官方系统为准。

本项目使用 Java Swing 开发个人所得税计算模拟器,模拟官方个税 APP 核心功能,包括综合所得年度汇算、税率表查询及专项扣除设置。代码采用纯 Java 实现,无第三方依赖,遵循 2023 年最新个税政策。提供完整 GUI 界面与核心计算逻辑,支持用户交互。适用于 Java 学习者参考税务计算需求。程序为模拟器,实际报税请以官方系统为准。

这是一个使用 Java Swing 开发的个人所得税计算模拟器,模拟了官方个税 APP 的核心功能,包括:
项目特点:
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);
}
});
}
}
package com.tax.calculator;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
/**
* 个人所得税计算器
* 实现 2023 年最新个税计算规则
*/
public class TaxCalculator {
// 税率表(年度综合所得)
private static final TaxBracket[] TAX_BRACKETS = {
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, Double.MAX_VALUE, 0.45, 181920)
};
// 月度专项扣除标准
private static final Map<String, BigDecimal> SPECIAL_DEDUCTIONS = new HashMap<>();
static {
// 初始化专项扣除标准(月度)
SPECIAL_DEDUCTIONS.put("养老", new BigDecimal("1000"));
SPECIAL_DEDUCTIONS.put("医疗", new BigDecimal("200"));
SPECIAL_DEDUCTIONS.put("失业", new BigDecimal("50"));
SPECIAL_DEDUCTIONS.put("住房", new BigDecimal("1200"));
SPECIAL_DEDUCTIONS.put("子女教育", new BigDecimal("1000"));
SPECIAL_DEDUCTIONS.put("继续教育", new BigDecimal("400"));
SPECIAL_DEDUCTIONS.put("大病医疗", new BigDecimal("8000")); // 年度上限
SPECIAL_DEDUCTIONS.put("房贷利息", new BigDecimal("1000"));
SPECIAL_DEDUCTIONS.put("住房租金", new BigDecimal("1500"));
SPECIAL_DEDUCTIONS.put("赡养老人", new BigDecimal("2000"));
}
/**
* 计算年度个人所得税
* @param annualIncome 年度总收入
* @param specialDeductions 专项扣除金额
* @param additionalDeductions 专项附加扣除
* @return 计算结果
*/
public static TaxResult calculateAnnualTax(
double annualIncome,
double specialDeductions,
double additionalDeductions) {
// 基本扣除费用(年度)
final double BASIC_DEDUCTION = 60000;
// 转换为 BigDecimal 确保精度
BigDecimal income = BigDecimal.valueOf(annualIncome);
BigDecimal special = BigDecimal.valueOf(specialDeductions);
BigDecimal additional = BigDecimal.valueOf(additionalDeductions);
BigDecimal basic = BigDecimal.valueOf(BASIC_DEDUCTION);
// 计算应纳税所得额
BigDecimal taxableIncome = income
.subtract(special)
.subtract(additional)
.subtract(basic)
.max(BigDecimal.ZERO); // 不能为负数
// 查找适用税率
TaxBracket bracket = findTaxBracket(taxableIncome.doubleValue());
// 计算应纳税额
BigDecimal taxAmount = taxableIncome
.multiply(BigDecimal.valueOf(bracket.getRate()))
.subtract(BigDecimal.valueOf(bracket.getQuickDeduction()));
// 确保税额不为负数
taxAmount = taxAmount.max(BigDecimal.ZERO);
// 计算税后收入
BigDecimal afterTaxIncome = income.subtract(taxAmount);
return new TaxResult(
income.doubleValue(),
taxableIncome.doubleValue(),
taxAmount.doubleValue(),
afterTaxIncome.doubleValue(),
bracket
);
}
/**
* 根据应纳税所得额查找适用税率
*/
private static TaxBracket findTaxBracket(double taxableIncome) {
for (TaxBracket bracket : TAX_BRACKETS) {
if (taxableIncome >= bracket.getLowerBound() &&
taxableIncome < bracket.getUpperBound()) {
return bracket;
}
}
return TAX_BRACKETS[TAX_BRACKETS.length - 1];
}
/**
* 获取专项扣除标准
*/
public static Map<String, BigDecimal> getSpecialDeductionStandards() {
return new HashMap<>(SPECIAL_DEDUCTIONS);
}
/**
* 税率档次类
*/
public static class TaxBracket {
private final double lowerBound;
private final double upperBound;
private final double rate;
private final double quickDeduction;
public TaxBracket(double lowerBound, double upperBound,
double rate, double quickDeduction) {
this.lowerBound = lowerBound;
this.upperBound = upperBound;
this.rate = rate;
this.quickDeduction = quickDeduction;
}
// Getter 方法
public double getLowerBound() { return lowerBound; }
public double getUpperBound() { return upperBound; }
public double getRate() { return rate; }
public double getQuickDeduction() { return quickDeduction; }
@Override
public String toString() {
return String.format("税率:%.1f%%, 速算扣除数:%.0f", rate * 100, quickDeduction);
}
}
/**
* 计算结果类
*/
public static class TaxResult {
private final double totalIncome; // 总收入
private final double taxableIncome; // 应纳税所得额
private final double taxAmount; // 应纳税额
private final double afterTaxIncome; // 税后收入
private final TaxBracket taxBracket; // 适用税率档次
public TaxResult(double totalIncome, double taxableIncome,
double taxAmount, double afterTaxIncome,
TaxBracket taxBracket) {
this.totalIncome = totalIncome;
this.taxableIncome = taxableIncome;
this.taxAmount = taxAmount;
this.afterTaxIncome = afterTaxIncome;
this.taxBracket = taxBracket;
}
// Getter 方法
public double getTotalIncome() { return totalIncome; }
public double getTaxableIncome() { return taxableIncome; }
public double getTaxAmount() { return taxAmount; }
public double getAfterTaxIncome() { return afterTaxIncome; }
public TaxBracket getTaxBracket() { return taxBracket; }
@Override
public String toString() {
return String.format(
"计算结果:\n" +
"总收入:¥%.2f\n" +
"应纳税所得额:¥%.2f\n" +
"应纳税额:¥%.2f\n" +
"税后收入:¥%.2f\n" +
"适用税率:%s",
totalIncome, taxableIncome, taxAmount, afterTaxIncome, taxBracket
);
}
}
}
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);
}
JPanel {
( (, , , ));
panel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.GRAY),
,
TitledBorder.LEFT,
TitledBorder.TOP
));
panel.add( ());
incomeField = ();
panel.add(incomeField);
panel.add( ());
specialDeductionField = ();
panel.add(specialDeductionField);
panel.add( ());
additionalDeductionField = ();
panel.add(additionalDeductionField);
panel.add( ());
( (FlowLayout.LEFT));
deductionTypeCombo = <>();
queryPanel.add(deductionTypeCombo);
standardLabel = ();
queryPanel.add(standardLabel);
panel.add(queryPanel);
panel;
}
JScrollPane {
resultArea = ();
resultArea.setEditable();
resultArea.setFont( (, Font.PLAIN, ));
resultArea.setBorder(BorderFactory.createEmptyBorder(, , , ));
(resultArea);
scrollPane.setBorder(BorderFactory.createTitledBorder());
scrollPane;
}
JPanel {
( (FlowLayout.CENTER, , ));
();
calculateBtn.setFont( (, Font.BOLD, ));
calculateBtn.setBackground( (, , ));
calculateBtn.setForeground(Color.WHITE);
calculateBtn.setPreferredSize( (, ));
calculateBtn.addActionListener( () {
{
calculateTax();
}
});
();
clearBtn.setFont( (, Font.PLAIN, ));
clearBtn.setPreferredSize( (, ));
clearBtn.addActionListener(e -> clearResults());
();
rateTableBtn.setFont( (, Font.PLAIN, ));
rateTableBtn.setPreferredSize( (, ));
rateTableBtn.addActionListener(e -> showTaxRateTable());
panel.add(calculateBtn);
panel.add(clearBtn);
panel.add(rateTableBtn);
panel;
}
{
Map<String, BigDecimal> standards = TaxCalculator.getSpecialDeductionStandards();
(String key : standards.keySet()) {
deductionTypeCombo.addItem(key);
}
deductionTypeCombo.addActionListener(e -> {
(String) deductionTypeCombo.getSelectedItem();
(selected != ) {
standards.get(selected);
standardLabel.setText(String.format(, standard));
}
});
(deductionTypeCombo.getItemCount() > ) {
deductionTypeCombo.setSelectedIndex();
}
}
{
{
Double.parseDouble(incomeField.getText());
Double.parseDouble(specialDeductionField.getText());
Double.parseDouble(additionalDeductionField.getText());
(income < || special < || additional < ) {
JOptionPane.showMessageDialog(,
,
,
JOptionPane.WARNING_MESSAGE);
;
}
TaxCalculator. TaxCalculator.calculateAnnualTax(
income, special, additional);
displayResult(result);
} (NumberFormatException ex) {
JOptionPane.showMessageDialog(,
,
,
JOptionPane.ERROR_MESSAGE);
}
}
{
();
sb.append();
sb.append(String.format(, result.getTotalIncome()));
sb.append(String.format(, result.getTaxableIncome()));
sb.append(String.format(, result.getTaxBracket()));
sb.append(String.format(, result.getTaxAmount()));
sb.append(String.format(, result.getAfterTaxIncome()));
result.getTaxAmount() / ;
result.getAfterTaxIncome() / ;
sb.append();
sb.append(String.format(, monthlyTax));
sb.append(String.format(, monthlyAfterTax));
sb.append();
(result.getTaxableIncome() > ) {
sb.append();
sb.append();
sb.append();
} {
sb.append();
}
resultArea.setText(sb.toString());
resultArea.setCaretPosition();
}
{
();
sb.append();
sb.append();
sb.append();
TaxCalculator.TaxBracket[] brackets = .TaxBracket[]{
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, Double.MAX_VALUE, , )
};
( ; i < brackets.length; i++) {
TaxCalculator. brackets[i];
String range;
(b.getUpperBound() == Double.MAX_VALUE) {
range = String.format(, b.getLowerBound());
} {
range = String.format(,
b.getLowerBound(), b.getUpperBound());
}
sb.append(String.format(,
i + , range, b.getRate() * , b.getQuickDeduction()));
}
sb.append();
resultArea.setText(sb.toString());
}
{
resultArea.setText();
}
}
# 编译所有 Java 文件
javac -d . com/tax/calculator/*.java
# 运行程序
java com.tax.calculator.PersonalIncomeTaxApp
应纳税所得额 = 年度收入 - 60000(基本减除费用) - 专项扣除 - 专项附加扣除
应纳税额 = 应纳税所得额 × 适用税率 - 速算扣除数
采用逐级累进计算方式,通过查找表确定适用税率。
本项目采用 MIT 开源协议,允许自由使用、修改和分发。
程序运行效果如下:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online