项目简介
这是一个使用 Java Swing 开发的个人所得税计算工具,模拟了官方个税 APP 的核心功能。主要包含综合所得年度汇算、税率表查询、专项扣除设置以及税务结果展示。项目特点包括纯 Java 实现无第三方依赖、完整的 GUI 交互界面、详细的代码注释,并遵循 2023 年最新个税政策。
核心逻辑与代码结构
主程序入口
Swing 应用启动需要确保线程安全,通常使用 SwingUtilities.invokeLater。这里我们设置了系统外观并初始化主窗口。
package com.tax.calculator;
import javax.swing.*;
public class PersonalIncomeTaxApp {
public static void main(String[] args) {
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);
}
});
}
}
个税计算核心类
计算逻辑是项目的核心。为了精度,金额处理全部使用 BigDecimal。税率表采用静态数组定义,支持快速查找适用档位。
package com.tax.calculator;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
public class TaxCalculator {
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
);
}
}
}


