Week 9 Challenge: Task Manager. Implemented basic implementations and GUI. Challenges are of increasing difficulty: Writing tasks to a file, reading tasks from a file, sorting and filtering, and lastly add, edit, and delete functionality. There is starter code available for all but the last challenge. Club members should work in groups.
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
// Represents a Task, which can be written and loaded to/from a file and are comparable to each other.
|
||||
public class Task {
|
||||
private String title;
|
||||
private String description;
|
||||
private String dueDate;
|
||||
private boolean completed;
|
||||
|
||||
// Constructor to create a new Task object.
|
||||
public Task(String title, String description, String dueDate) {
|
||||
this.title = title;
|
||||
this.description = description;
|
||||
this.dueDate = dueDate;
|
||||
this.completed = false;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public String getDueDate() {
|
||||
return dueDate;
|
||||
}
|
||||
|
||||
public boolean isCompleted() {
|
||||
return completed;
|
||||
}
|
||||
|
||||
// Edit a task by providing new information.
|
||||
public void editTask(String newTitle, String newDescription, String newDueDate) {
|
||||
this.title = newTitle;
|
||||
this.description = newDescription;
|
||||
this.dueDate = newDueDate;
|
||||
}
|
||||
|
||||
// Return if a task is complete or not.
|
||||
public void toggleComplete() {
|
||||
if(completed) completed = false;
|
||||
else completed = true;
|
||||
|
||||
System.out.println("task status toggled");
|
||||
}
|
||||
|
||||
// TODO: Implement Comparable or Comparator.
|
||||
}
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
import java.awt.event.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.io.File;
|
||||
|
||||
public class Week9 {
|
||||
private static ArrayList<Task> tasks;
|
||||
private static String filepath;
|
||||
private static Week9Gui gui;
|
||||
|
||||
// NOTE: For sorts, the Task class needs something implemented.
|
||||
private static void sortByTitle() {
|
||||
System.out.println("Sort By Title clicked!");
|
||||
// TODO
|
||||
gui.update(tasks);
|
||||
}
|
||||
|
||||
// NOTE: For sorts, the Task class needs something implemented.
|
||||
private static void sortByDueDate() {
|
||||
System.out.println("Sort By Due Date clicked!");
|
||||
// TODO
|
||||
gui.update(tasks);
|
||||
}
|
||||
|
||||
// NOTE: For sorts, the Task class needs something implemented.
|
||||
private static void filterByComplete() {
|
||||
System.out.println("Filter By Complete clicked!");
|
||||
// TODO
|
||||
gui.update(tasks);
|
||||
}
|
||||
|
||||
private void parse(File f) {
|
||||
// TODO: Need to open the file and get each line.
|
||||
// TODO: Parse the format ("TITLE, DESCRIPTION, DUE DATE, COMPLETED"),
|
||||
// TODO: Create a new Task object and add it to the ArrayList.
|
||||
}
|
||||
|
||||
// Writes each task to the file after a change.
|
||||
private static void saveTasks() {
|
||||
System.out.println("writing tasks to " + filepath);
|
||||
// TODO: Write each Task stored in the ArrayList to the file.
|
||||
}
|
||||
|
||||
///////////////////////// END OF TODO ////////////////////////////
|
||||
|
||||
// Initialize tasks and GUI, populate with test data (if applicable).
|
||||
private void init() {
|
||||
filepath = getNotesDirectoryPath();
|
||||
initTasks();
|
||||
testData();
|
||||
}
|
||||
|
||||
// Identify the operating system of the user, and obtain the path to the "tasks" directory.
|
||||
private String getNotesDirectoryPath() {
|
||||
String os = System.getProperty("os.name").toLowerCase();
|
||||
|
||||
String userHome = System.getProperty("user.home");
|
||||
String tasksDir = "tasks";
|
||||
|
||||
if (os.contains("win")) // Windows
|
||||
return userHome + "\\" + tasksDir;
|
||||
else if (os.contains("mac")) // MacOS
|
||||
return userHome + "/Library/Application Support/" + tasksDir;
|
||||
else // Linux/other
|
||||
return userHome + "/" + tasksDir;
|
||||
}
|
||||
|
||||
// Create the tasks file if it does not already exist. Load tasks from the existing file otherwise.
|
||||
private void initTasks() {
|
||||
File f = new File(filepath);
|
||||
tasks = new ArrayList<Task>();
|
||||
|
||||
if(f.isFile()) {
|
||||
System.out.println("loading tasks from " + filepath);
|
||||
parse(f);
|
||||
} else {
|
||||
try {
|
||||
f.createNewFile();
|
||||
System.out.println(filepath + " has been created.");
|
||||
} catch(Exception e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Test tasks, not read from a file and are not intended to be saved to a file.
|
||||
private void testData() {
|
||||
for(int i = 0; i < 10; i++)
|
||||
tasks.add(new Task("Title " + i, "Description " + i, "Due Date " + i));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
new Week9().init();
|
||||
ActionListener sortByTitle = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
sortByTitle();
|
||||
}
|
||||
};
|
||||
|
||||
ActionListener sortByDueDate = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
sortByDueDate();
|
||||
}
|
||||
};
|
||||
|
||||
ActionListener filterByCompleted = new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
filterByComplete();
|
||||
}
|
||||
};
|
||||
|
||||
gui = new Week9Gui(tasks, sortByTitle, sortByDueDate, filterByCompleted);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
import java.util.ArrayList;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.UIManager;
|
||||
|
||||
import java.awt.event.*;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.GridLayout;
|
||||
|
||||
public class Week9Gui {
|
||||
private JFrame frame = new JFrame("SLCC Programming Club Challenge - Task Manager");
|
||||
|
||||
private ActionListener titleSort;
|
||||
private ActionListener dueDateSort;
|
||||
private ActionListener completeFilter;
|
||||
|
||||
public Week9Gui(ArrayList<Task> tasks, ActionListener titleSort, ActionListener dueDateSort, ActionListener completeFilter) {
|
||||
this.titleSort = titleSort;
|
||||
this.dueDateSort = dueDateSort;
|
||||
this.completeFilter = completeFilter;
|
||||
|
||||
initGui(tasks);
|
||||
}
|
||||
|
||||
// Setup the basic GUI layout.
|
||||
private void initGui(ArrayList<Task> tasks) {
|
||||
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
|
||||
frame.setLayout(new BorderLayout());
|
||||
frame.setLocationRelativeTo(null);
|
||||
|
||||
try {
|
||||
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
|
||||
} catch (Exception e) {
|
||||
System.out.println("Error with cross platform look & feel.");
|
||||
}
|
||||
|
||||
frame.add(buttonsView(), BorderLayout.PAGE_END);
|
||||
frame.add(view(tasks));
|
||||
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
// Displays sort and filter buttons
|
||||
private JPanel buttonsView() {
|
||||
JButton sortByTitle = new JButton("Title");
|
||||
sortByTitle.addActionListener(titleSort);
|
||||
|
||||
JButton sortByDueDate = new JButton("Due Date");
|
||||
sortByDueDate.addActionListener(dueDateSort);
|
||||
|
||||
JButton filterByComplete = new JButton("Complete");
|
||||
filterByComplete.addActionListener(completeFilter);
|
||||
|
||||
JPanel p = new JPanel(new GridLayout(2, 3));
|
||||
p.add(new JLabel("Sort by:"));
|
||||
p.add(new JLabel("Sort by:"));
|
||||
p.add(new JLabel("Filter by:"));
|
||||
p.add(sortByTitle);
|
||||
p.add(sortByDueDate);
|
||||
p.add(filterByComplete);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
// Displays tasks and their completion status.
|
||||
private JPanel view(ArrayList<Task> tasks) {
|
||||
JPanel v = new JPanel(new GridLayout(tasks.size(), 4));
|
||||
|
||||
for(Task t : tasks) {
|
||||
v.add(new JLabel(t.getTitle()));
|
||||
v.add(new JLabel(t.getDescription()));
|
||||
v.add(new JLabel(t.getDueDate()));
|
||||
JCheckBox toggleComplete = new JCheckBox("Completed", t.isCompleted());
|
||||
toggleComplete.addActionListener(
|
||||
e -> { t.toggleComplete(); }
|
||||
);
|
||||
v.add(toggleComplete);
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
// Clear everything and refresh the JFrame to update information.
|
||||
public void update(ArrayList<Task> tasks) {
|
||||
frame.getContentPane().removeAll();
|
||||
frame.add(buttonsView(), BorderLayout.PAGE_END);
|
||||
frame.add(view(tasks));
|
||||
frame.repaint();
|
||||
frame.revalidate();
|
||||
frame.pack();
|
||||
System.out.println("Updated UI");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user