π 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