Skip to content

🧠 Build a Smart Daily Planner in Java (with Source Code & Full Explanation!)

πŸš€ App Overview

This Java Swing-based desktop app lets you create, edit, and manage daily tasks with reminders, priorities, and save/load capabilities.


🧱 Step 1: Define the Task Object





// Task.java
import java.io.Serializable;
import java.time.LocalTime;

public class Task implements Serializable {
    private String title;
    private String description;
    private LocalTime startTime;
    private LocalTime endTime;
    private String priority; // "High", "Medium", "Low"
    private boolean completed;

    public Task(String title, String description, LocalTime startTime, LocalTime endTime, String priority) {
        this.title = title;
        this.description = description;
        this.startTime = startTime;
        this.endTime = endTime;
        this.priority = priority;
        this.completed = false;
    }

    // Getters and setters omitted for brevity
}

πŸ” Explanation:

  • This Task class models each to-do item.
  • It implements Serializable so it can be saved/loaded to disk.
  • It uses LocalTime for scheduling.

🧱 Step 2: Create the Task Manager

// TaskManager.java
import java.util.*;
import java.io.*;

public class TaskManager {
    private List<Task> taskList = new ArrayList<>();

    public void addTask(Task task) {
        taskList.add(task);
    }

    public void removeTask(Task task) {
        taskList.remove(task);
    }

    public List<Task> getTasks() {
        return taskList;
    }

    public void saveTasks(String filename) throws IOException {
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
            out.writeObject(taskList);
        }
    }

    public void loadTasks(String filename) throws IOException, ClassNotFoundException {
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
            taskList = (List<Task>) in.readObject();
        }
    }
}

πŸ” Explanation:

  • This manager class handles task operations.
  • It uses object serialization to save/load the list of tasks.

πŸ–ΌοΈ Step 3: Design the GUI (Main Class)





// SmartPlannerApp.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.time.LocalTime;

public class SmartPlannerApp {
    private JFrame frame;
    private DefaultListModel<Task> taskListModel;
    private JList<Task> taskJList;
    private TaskManager taskManager;

    public SmartPlannerApp() {
        taskManager = new TaskManager();
        frame = new JFrame("Smart Daily Planner");
        frame.setSize(600, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        taskListModel = new DefaultListModel<>();
        taskJList = new JList<>(taskListModel);
        frame.add(new JScrollPane(taskJList), BorderLayout.CENTER);

        JButton addButton = new JButton("Add Task");
        addButton.addActionListener(e -> showAddTaskDialog());
        frame.add(addButton, BorderLayout.SOUTH);

        frame.setVisible(true);
    }

    private void showAddTaskDialog() {
        JTextField titleField = new JTextField();
        JTextField descField = new JTextField();
        JTextField startTimeField = new JTextField("HH:mm");
        JTextField endTimeField = new JTextField("HH:mm");
        String[] priorities = {"High", "Medium", "Low"};
        JComboBox<String> priorityBox = new JComboBox<>(priorities);

        JPanel panel = new JPanel(new GridLayout(0, 1));
        panel.add(new JLabel("Title:")); panel.add(titleField);
        panel.add(new JLabel("Description:")); panel.add(descField);
        panel.add(new JLabel("Start Time:")); panel.add(startTimeField);
        panel.add(new JLabel("End Time:")); panel.add(endTimeField);
        panel.add(new JLabel("Priority:")); panel.add(priorityBox);

        int result = JOptionPane.showConfirmDialog(frame, panel, "New Task", JOptionPane.OK_CANCEL_OPTION);
        if (result == JOptionPane.OK_OPTION) {
            Task newTask = new Task(
                titleField.getText(),
                descField.getText(),
                LocalTime.parse(startTimeField.getText()),
                LocalTime.parse(endTimeField.getText()),
                (String) priorityBox.getSelectedItem()
            );
            taskManager.addTask(newTask);
            taskListModel.addElement(newTask);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(SmartPlannerApp::new);
    }
}

πŸ” Explanation:

  • JList shows all tasks.
  • β€œAdd Task” button launches a dialog to input task details.
  • We use DefaultListModel for dynamic UI updates.

πŸ”” Step 4: Add Task Reminder (Optional)

You can use a TimerTask to alert the user when a task is about to start. This can be added after loading tasks:

// inside SmartPlannerApp or separate ReminderService
Timer timer = new Timer(true);
for (Task task : taskManager.getTasks()) {
    long delay = java.time.Duration.between(LocalTime.now(), task.getStartTime()).toMillis();
    if (delay > 0) {
        timer.schedule(new TimerTask() {
            public void run() {
                JOptionPane.showMessageDialog(frame, "Reminder: " + task.getTitle() + " is starting now!");
            }
        }, delay);
    }
}

πŸ’Ύ Step 5: Add Save/Load Buttons

Add two buttons for persistence:

JButton saveButton = new JButton("Save");
saveButton.addActionListener(e -> {
    try {
        taskManager.saveTasks("tasks.dat");
        JOptionPane.showMessageDialog(frame, "Tasks saved!");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
});

JButton loadButton = new JButton("Load");
loadButton.addActionListener(e -> {
    try {
        taskManager.loadTasks("tasks.dat");
        taskListModel.clear();
        for (Task task : taskManager.getTasks()) {
            taskListModel.addElement(task);
        }
        JOptionPane.showMessageDialog(frame, "Tasks loaded!");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
});

JPanel controlPanel = new JPanel();
controlPanel.add(addButton);
controlPanel.add(saveButton);
controlPanel.add(loadButton);
frame.add(controlPanel, BorderLayout.SOUTH);

🎁 Bonus: Export to Text

public void exportTasksToText(String filename) throws IOException {
    try (PrintWriter writer = new PrintWriter(new FileWriter(filename))) {
        for (Task task : taskManager.getTasks()) {
            writer.println("Title: " + task.getTitle());
            writer.println("Time: " + task.getStartTime() + " - " + task.getEndTime());
            writer.println("Priority: " + task.getPriority());
            writer.println("Description: " + task.getDescription());
            writer.println("Completed: " + task.isCompleted());
            writer.println("------------------------");
        }
    }
}

🧠 Final Words

This project demonstrates how powerful Java can be for building productivity tools. You learned:

  • GUI building with Swing
  • File I/O & Serialization
  • Timer scheduling
  • MVC architecture with task management

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *