ExpenseManagementSystem
ExpenseManagementSystem
Here’s a detailed version of an Expense Management System using Java Swing that includes features for tracking
expenses, viewing historical data, and calculating total expenses for previous months. This version builds on
basic functionality, incorporating monthly summaries and a more robust data model.
Project Structure
Expense Class
import java.io.Serializable;
import java.util.Date;
@Override
public String toString() {
return "Category: " + category + ", Date: " + date + ", Amount: " + amount + ", Description: " + description;
}
}
import javax.swing.table.AbstractTableModel;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@Override
public int getRowCount() {
return expenses.size();
}
@Override
public int getColumnCount() {
return columns.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Expense expense = expenses.get(rowIndex);
switch (columnIndex) {
case 0: return expense.getCategory();
case 1: return dateFormat.format(expense.getDate());
case 2: return expense.getAmount();
case 3: return expense.getDescription();
default: return null;
}
}
@Override
public String getColumnName(int column) {
return columns[column];
}
This class provides the main GUI and functionality, including adding, viewing, and summarizing expenses by
month.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.stream.Collectors;
public ExpenseManagementSystem() {
setTitle("Expense Management System");
setSize(800, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// Input panel
JPanel inputPanel = new JPanel(new GridLayout(5, 2));
inputPanel.add(new JLabel("Category:"));
categoryField = new JTextField();
inputPanel.add(categoryField);
inputPanel.add(new JLabel("Amount:"));
amountField = new JTextField();
inputPanel.add(amountField);
inputPanel.add(new JLabel("Description:"));
addButton = new JButton("Add Expense");
monthlySummaryButton = new JButton("Show Monthly Summary");
addButton.addActionListener(new AddExpenseListener());
monthlySummaryButton.addActionListener(new MonthlySummaryListener());
inputPanel.add(addButton);
inputPanel.add(monthlySummaryButton);
add(inputPanel, BorderLayout.NORTH);
add(new JScrollPane(expenseTable), BorderLayout.CENTER);
setVisible(true);
}
return expenseList.stream()
.filter(exp -> {
Calendar expCal = Calendar.getInstance();
expCal.setTime(exp.getDate());
return expCal.get(Calendar.YEAR) == cal.get(Calendar.YEAR) &&
expCal.get(Calendar.MONTH) == cal.get(Calendar.MONTH);
})
.mapToDouble(Expense::getAmount)
.sum();
}
Explanation
• Expense Class: Represents each expense with attributes like category, date, amount, and description.
• ExpenseTableModel Class: Custom table model to display expenses in a JTable.
• ExpenseManagementSystem Class:
• AddExpenseListener: Adds a new expense when the “Add Expense” button is clicked.
• MonthlySummaryListener: Prompts the user for a month (in “yyyy-MM” format) and calculates the total
expenses for that month.
• calculateMonthlyExpense Method: Filters expenses by the selected month and calculates the total amount.