multiple windows working with state

This commit is contained in:
goeranh 2025-06-13 00:21:07 +02:00
commit 49cc348e13
No known key found for this signature in database
15 changed files with 466 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

3
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

7
.idea/encodings.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

14
.idea/misc.xml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

26
pom.xml Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.dhsn.oop</groupId>
<artifactId>todo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.13.1</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,14 @@
package de.dhsn.oop;
import de.dhsn.oop.data.TodoList;
import de.dhsn.oop.ui.MainWindow;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<TodoList> listen = new ArrayList<>();
MainWindow mw = new MainWindow(listen);
}
}

View File

@ -0,0 +1,7 @@
package de.dhsn.oop.data;
public class TextTodoItem extends TodoItem{
public TextTodoItem(String t) {
super(t);
}
}

View File

@ -0,0 +1,31 @@
package de.dhsn.oop.data;
import javax.swing.*;
import java.awt.*;
public abstract class TodoItem extends JPanel {
public boolean done = false;
public String title;
private JLabel t;
private JCheckBox cbdone;
public TodoItem(String t){
title = t;
setLayout(new BorderLayout());
this.t = new JLabel(t);
cbdone = new JCheckBox();
add(cbdone, BorderLayout.LINE_START);
add(this.t, BorderLayout.CENTER);
setVisible(true);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

View File

@ -0,0 +1,41 @@
package de.dhsn.oop.data;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
public class TodoList {
List<TodoItem> list;
String listTitle;
public TodoList(String listTitle) {
this.listTitle = listTitle;
this.list = new ArrayList<>();
}
public String getListTitle() {
return listTitle;
}
public void setListTitle(String listTitle) {
this.listTitle = listTitle;
}
public void addTodo(TodoItem item){
list.add(item);
}
public List<TodoItem> getList(){
return list;
}
public int length(){
return list.toArray().length;
}
@Override
public String toString() {
return new Gson().toJson(this);
}
}

View File

@ -0,0 +1,44 @@
package de.dhsn.oop.ui;
import de.dhsn.oop.data.TodoList;
import javax.swing.*;
import java.awt.*;
/**
* Overview List Item to show Todo Lists on the home screen
*/
public class ListOverviewItem extends JPanel {
private JLabel titleText = new JLabel();
private JLabel title = new JLabel();
private JLabel length = new JLabel();
private JLabel lenghtText = new JLabel();
public ListOverviewItem(TodoList list) {
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(2,2,2,2);
title.setText(list.getListTitle());
title.setFont(title.getFont().deriveFont(Font.BOLD, 15f));
titleText.setText("Titel: ");
lenghtText.setText("Anz.: ");
length.setText(Integer.toString(list.length()));
this.add(titleText, c);
c.gridx++;
this.add(title, c);
c.gridx++;
this.add(lenghtText, c);
c.gridx++;
this.add(length, c);
this.setVisible(true);
}
}

View File

@ -0,0 +1,25 @@
package de.dhsn.oop.ui;
import de.dhsn.oop.data.TodoList;
import javax.swing.*;
import java.awt.*;
import java.util.List;
public class ListsOverview extends JPanel {
public ListsOverview(List<TodoList> lists){
super();
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(2,2,2,2);
c.gridx=0;
c.gridy=0;
for(TodoList list: lists){
ListOverviewItem listOverviewItem = new ListOverviewItem(list);
this.add(listOverviewItem, c);
c.gridy++;
}
this.setVisible(true);
}
}

View File

@ -0,0 +1,96 @@
package de.dhsn.oop.ui;
import de.dhsn.oop.data.TodoList;
import de.dhsn.oop.ui.helpers.TodoListListModel;
import javax.swing.*;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.List;
import java.util.Objects;
public class MainWindow extends JFrame implements ActionListener, ListSelectionListener {
private JButton addNewList;
private List<TodoList> lists;
private JList<String> list;
/**
* Main window constructor, takes a (potentially empty) list of TodoList
* this list of lists is supposed to keep all application state for easy file save and open operations
* @param lists
* @throws HeadlessException
*/
public MainWindow(List<TodoList> lists) throws HeadlessException {
super();
this.lists = lists;
Container cp = getContentPane();
cp.removeAll();
setTitle("Todo List");
setSize(new Dimension(800, 600));
setMinimumSize(new Dimension(400, 250));
setLayout(new BorderLayout());
list = new JList<>();
list.setModel(new TodoListListModel(lists));
list.addListSelectionListener(this);
cp.add(list, BorderLayout.NORTH);
addNewList = new JButton("Neue Liste Anlegen");
addNewList.addActionListener(this);
cp.add(addNewList, BorderLayout.SOUTH);
pack();
setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("exit test");
System.out.println(lists);
System.exit(0);
}
});
}
/**
* listener function for the add new list button on the main page
* @param e the event to be processed
*/
@Override
public void actionPerformed(ActionEvent e) {
new NewListDialog(this);
}
/**
* callback function to be called with a title for a new list
* this is called from NewListDialog when the user presses the save button
* @param title
* @return
*/
public void nldCallback(String title){
boolean result = lists.add(new TodoList(title));
//overwrite list contents
list.setModel(new TodoListListModel(lists));
}
/**
* handle click events on the list of list titles
* displays the list in a new window
* @param e the event that characterizes the change.
*/
@Override
public void valueChanged(ListSelectionEvent e) {
// two events are emitted - only execute the code once
if (e.getValueIsAdjusting()){
//show new window for the selected list
new TodoListView(lists.get(list.getSelectedIndex()));
}
}
}

View File

@ -0,0 +1,37 @@
package de.dhsn.oop.ui;
import de.dhsn.oop.data.TodoList;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class NewListDialog extends JFrame implements ActionListener {
private JTextField input = new JTextField("TODO");
private JButton confirm = new JButton("Anlegen");
private MainWindow mw;
public NewListDialog(MainWindow mw){
this.mw = mw;
Container cp = getContentPane();
setLayout(new BorderLayout());
JLabel l = new JLabel("Name der Liste: ");
cp.add(l, BorderLayout.LINE_START);
input.setColumns(15);
cp.add(input, BorderLayout.LINE_END);
confirm.addActionListener(this);
cp.add(confirm, BorderLayout.SOUTH);
pack();
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
mw.nldCallback(input.getText().strip());
setVisible(false);
dispose();
}
}

View File

@ -0,0 +1,51 @@
package de.dhsn.oop.ui;
import de.dhsn.oop.data.TextTodoItem;
import de.dhsn.oop.data.TodoItem;
import de.dhsn.oop.data.TodoList;
import javax.swing.*;
import java.awt.*;
public class TodoListView extends JFrame {
class TodoListItem extends JPanel {
public TodoListItem(TodoItem item) {
}
}
JLabel title;
TodoList list;
public TodoListView(TodoList list) {
super();
this.list = list;
for(int i = 0; i < 32; i++)
this.list.addTodo(new TextTodoItem("item " + i));
setMinimumSize(new Dimension(100, 100));
setSize(new Dimension(100, 300));
Container cp = getContentPane();
setLayout(new BorderLayout());
title = new JLabel(list.getListTitle());
cp.add(title, BorderLayout.NORTH);
// scrolling content panel
JPanel scrollContent = new JPanel();
//not setting a size results in immediate collapsing of the lsit upon resizing the window
scrollContent.setMinimumSize(new Dimension(50,50));
scrollContent.setLayout(new BoxLayout(scrollContent, BoxLayout.Y_AXIS));
//add all todoitems in the list to the scrolpane
for (TodoItem t : list.getList())
scrollContent.add(t);
JScrollPane scp = new JScrollPane(scrollContent);
cp.add(scp,BorderLayout.CENTER);
pack();
setVisible(true);
}
}

View File

@ -0,0 +1,32 @@
package de.dhsn.oop.ui.helpers;
import de.dhsn.oop.data.TodoList;
import javax.swing.*;
import javax.swing.event.ListDataListener;
import java.util.List;
public class TodoListListModel implements ListModel<String> {
List<TodoList> global;
public TodoListListModel(List<TodoList> lists){
global = lists;
}
@Override
public int getSize() {
return global.size();
}
@Override
public String getElementAt(int index) {
return ((TodoList) global.get(index)).getListTitle();
}
@Override
public void addListDataListener(ListDataListener l) {
}
@Override
public void removeListDataListener(ListDataListener l) {
}
}