0% found this document useful (0 votes)
9 views

ExpenseManagementSystem

Uploaded by

Safreena Rafeek
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views

ExpenseManagementSystem

Uploaded by

Safreena Rafeek
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

Expense Management System

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

The system will consist of:

1. Main Class: ExpenseManagementSystem — Manages the main GUI and functionality.


2. Expense Model: Expense — Represents each expense item with details like category, date, and amount.
3. Table Model: ExpenseTableModel — Custom table model to display expenses in a JTable.
4. Database or File Storage: Basic file-based storage for saving and loading expense data.
5. Monthly Summary Calculation: Calculates total expenses by month.

Expense Class

import java.io.Serializable;
import java.util.Date;

public class Expense implements Serializable {


private String category;
private Date date;
private double amount;
private String description;

public Expense(String category, Date date, double amount, String description) {


this.category = category;
this.date = date;
this.amount = amount;
this.description = description;
}

public String getCategory() { return category; }


public Date getDate() { return date; }
public double getAmount() { return amount; }
public String getDescription() { return description; }

@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;

public class ExpenseTableModel extends AbstractTableModel {


private ArrayList expenses;
private final String[] columns = {"Category", "Date", "Amount", "Description"};
private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

public ExpenseTableModel(ArrayList expenses) {


this.expenses = expenses;
}

@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];
}

public void addExpense(Expense expense) {


expenses.add(expense);
fireTableDataChanged();
}

public ArrayList getExpenses() {


return expenses;
}
}
ExpenseManagementSystem Class

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 class ExpenseManagementSystem extends JFrame {


private JTextField categoryField, dateField, amountField, descriptionField;
private JButton addButton, monthlySummaryButton;
private JTable expenseTable;
private ExpenseTableModel tableModel;
private ArrayList expenseList;

public ExpenseManagementSystem() {
setTitle("Expense Management System");
setSize(800, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());

expenseList = new ArrayList<>();


tableModel = new ExpenseTableModel(expenseList);
expenseTable = new JTable(tableModel);

// 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("Date (yyyy-MM-dd):"));


dateField = new JTextField();
inputPanel.add(dateField);

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);
}

private class AddExpenseListener implements ActionListener {


public void actionPerformed(ActionEvent e) {
try {
String category = categoryField.getText();
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateField.getText());
double amount = Double.parseDouble(amountField.getText());
String description = descriptionField.getText();

Expense expense = new Expense(category, date, amount, description);


tableModel.addExpense(expense);

// Clear input fields


categoryField.setText("");
dateField.setText("");
amountField.setText("");
descriptionField.setText("");
} catch (ParseException | NumberFormatException ex) {
JOptionPane.showMessageDialog(ExpenseManagementSystem.this, "Please enter valid values.");
}
}
}

private class MonthlySummaryListener implements ActionListener {


public void actionPerformed(ActionEvent e) {
String month = JOptionPane.showInputDialog(ExpenseManagementSystem.this, "Enter month (yyyy-MM):");
if (month != null && !month.isEmpty()) {
try {
double totalExpense = calculateMonthlyExpense(month);
JOptionPane.showMessageDialog(ExpenseManagementSystem.this, "Total expenses for " + month + ": $" +
totalExpense);
} catch (ParseException ex) {
JOptionPane.showMessageDialog(ExpenseManagementSystem.this, "Invalid date format.");
}
}
private double calculateMonthlyExpense(String month) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Date targetDate = sdf.parse(month);
Calendar cal = Calendar.getInstance();
cal.setTime(targetDate);

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();
}

public static void main(String[] args) {


SwingUtilities.invokeLater(() -> new ExpenseManagementSystem());
}
}

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.

You might also like