From 862fb85d541af579657cfdaa8db770e4c3916eaf Mon Sep 17 00:00:00 2001 From: Jonas Smedegaard Date: Mon, 28 Apr 2025 22:35:16 +0200 Subject: split class HelloApplication into classes Main and Window --- .../com/example/portfolio2/Controller.java | 4 +- .../com/example/portfolio2/HelloApplication.java | 192 --------------------- .../com/example/portfolio2/Main.java | 21 +++ .../com/example/portfolio2/Window.java | 192 +++++++++++++++++++++ 4 files changed, 215 insertions(+), 194 deletions(-) delete mode 100644 src/com.example.portfolio2/com/example/portfolio2/HelloApplication.java create mode 100644 src/com.example.portfolio2/com/example/portfolio2/Main.java create mode 100644 src/com.example.portfolio2/com/example/portfolio2/Window.java (limited to 'src') diff --git a/src/com.example.portfolio2/com/example/portfolio2/Controller.java b/src/com.example.portfolio2/com/example/portfolio2/Controller.java index f38a3ca..2212396 100644 --- a/src/com.example.portfolio2/com/example/portfolio2/Controller.java +++ b/src/com.example.portfolio2/com/example/portfolio2/Controller.java @@ -18,7 +18,7 @@ class Controller{ private Model model; /// Application view - private HelloApplication view; + private Window view; /// clear the participation database at program launch void initialize() { @@ -29,7 +29,7 @@ class Controller{ /// /// @param model Application model /// @param view Application view - Controller(Model model, HelloApplication view){ + Controller(Model model, Window view){ this.model=model; this.view=view; } diff --git a/src/com.example.portfolio2/com/example/portfolio2/HelloApplication.java b/src/com.example.portfolio2/com/example/portfolio2/HelloApplication.java deleted file mode 100644 index e79dbda..0000000 --- a/src/com.example.portfolio2/com/example/portfolio2/HelloApplication.java +++ /dev/null @@ -1,192 +0,0 @@ -// SPDX-FileCopyrightText: -// SPDX-FileCopyrightText: -// SPDX-FileCopyrightText: -// SPDX-License-Identifier: GPL-3.0-or-later - -package com.example.portfolio2; - -import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.control.ComboBox; -import javafx.scene.control.Label; -import javafx.scene.control.TextArea; -import javafx.scene.layout.HBox; -import javafx.scene.layout.VBox; -import javafx.stage.Stage; - -import java.io.IOException; -import java.util.List; - -/// Bachelorizer - JavaFX Window view -// Class is final to forbid subclassing, -// because object is passed to controller during instantiation -public final class HelloApplication extends Application { - - /// Default constructor - // (declared explicitly only to silence javadoc) - public HelloApplication(){} - - /// Label styling - public static final String LABEL_STYLE = - "-fx-font-weight: bold;-fx-font-size: 18;-fx-padding: 10"; - - /// Application model - private Model model = new Model(); - - /// Application controller - private Controller con = new Controller(model,this); - - /// database singleton - MyDB myDB = new MyDB(); - - /* Below is the original implementation of the UI elements with - accompanying, individual calls to setOnAction to specify functionality. - Before changing to a list format, - we made sure methods in controller and model - were generalized to allow for the new structure seamlessly. - private ComboBox programCombo = new ComboBox<>(); - private ComboBox subject1Combo = new ComboBox<>(); - private ComboBox subject2Combo = new ComboBox<>(); - private ComboBox electiveCombo = new ComboBox<>(); - - private ComboBox programSelect = new ComboBox<>(); - private ComboBox subject1Select = new ComboBox<>(); - private ComboBox subject2Select = new ComboBox<>(); - private ComboBox electiveSelect = new ComboBox<>(); - - private TextArea programArea = new TextArea(); - private TextArea subject1Area = new TextArea(); - private TextArea subject2Area = new TextArea(); - private TextArea electiveArea = new TextArea(); - - private Label programEcts = new Label(); - private Label subject1Ects = new Label(); - private Label subject2Ects = new Label(); - private Label electiveEcts = new Label(); - - private VBox program = new VBox(new Label("Program"), programCombo, programSelect, programArea, programEcts); - private VBox subject1 = new VBox(new Label("Subject 1"), subject1Combo, subject1Select, subject1Area, subject1Ects); - private VBox subject2 = new VBox(new Label("Subject 2"), subject2Combo, subject2Select, subject2Area, subject2Ects); - private VBox elective = new VBox(new Label("Elective"), electiveCombo, electiveSelect, electiveArea, electiveEcts); - */ - - @Override - public void start(Stage stage) throws IOException { - // clear old insertions into participation table - con.initialize(); - - // define list of columns based on their names - List columns = List.of( - new ActivityColumn("Program"), - new ActivityColumn("Subject 1"), - new ActivityColumn("Subject 2"), - new ActivityColumn("Elective") - ); - - // define list of subject modules - List subjectModules = List.of("Computer Science", "Informatik", "Astrology"); - - // define button functionality for each activity column - for (ActivityColumn col : columns) { - col.nameLabel.setStyle(LABEL_STYLE); - col.ectsLabel.setStyle(LABEL_STYLE); - col.categoryCombo.setPrefSize(250, 35); - col.activitySelect.setPrefSize(250, 35); - col.area.setPrefWidth(250); - - // all boxes share same activity logic - col.activitySelect.setOnAction(event -> { - con.onActivitySelected(col.categoryCombo, col.activitySelect, col.area); - con.updateEcts(col.ectsLabel, col.categoryCombo); - }); - - // handle each category box - switch (col.name) { - case "Program" -> { - col.categoryCombo.getItems().addAll("HumTek", "NatBach"); - col.categoryCombo.setOnAction(event -> { - con.onComboSelected(col.categoryCombo, col.activitySelect, col.area); - }); - } - // TODO: use the list for filling the box - case "Subject 1" -> { - col.categoryCombo.getItems().addAll("Computer Science", "Informatik", "Astrology"); - col.categoryCombo.setOnAction(event -> { - con.onSubjectModuleSelected(col.categoryCombo, columns.get(2).categoryCombo, subjectModules); - con.onComboSelected(col.categoryCombo, col.activitySelect, col.area); - }); - } - case "Subject 2" -> { - col.categoryCombo.getItems().addAll("Computer Science", "Informatik", "Astrology"); - // TODO: figure out a better way... - col.categoryCombo.setOnAction(event -> { - con.onSubjectModuleSelected(col.categoryCombo, columns.get(1).categoryCombo, subjectModules); - con.onComboSelected(col.categoryCombo, col.activitySelect, col.area); - }); - } - case "Elective" -> { - - // hide useless box - col.categoryCombo.setVisible(false); - - con.fillElective(col.activitySelect); - } - } - } - - // define HBox and scene for columns - HBox root = new HBox(columns.get(0).asVBox(), columns.get(1).asVBox(), columns.get(2).asVBox(), columns.get(3).asVBox()); - Scene scene = new Scene(root, 1000, 500); - stage.setTitle("Course Selector RUC: Ultimate Deluxe Edition"); - stage.setScene(scene); - stage.show(); - } - - /// JVM entry point - /// - /// @param args command-line arguments - public static void main(String[] args) { - launch(); - } - - /// column of activities - private class ActivityColumn { - - /// identifier stored in the text felt - String name; - - /// display text - Label nameLabel; - - /// dropdown list for categories - ComboBox categoryCombo; - - /// dropdown list for activities - ComboBox activitySelect; - - /// descriptionof chosen activities - TextArea area; - - /// text to display ECTS points - Label ectsLabel; - - /// column of activities - /// - /// @param name identifier - ActivityColumn(String name) { - this.name = name; - nameLabel = new Label(name); - categoryCombo = new ComboBox<>(); - activitySelect = new ComboBox<>(); - area = new TextArea(); - ectsLabel = new Label(); - } - - /// activity columne as VBox - /// - /// @return column of activities as VBox - VBox asVBox() { - return new VBox(nameLabel, categoryCombo, activitySelect, area, ectsLabel); - } - } -} diff --git a/src/com.example.portfolio2/com/example/portfolio2/Main.java b/src/com.example.portfolio2/com/example/portfolio2/Main.java new file mode 100644 index 0000000..da6524a --- /dev/null +++ b/src/com.example.portfolio2/com/example/portfolio2/Main.java @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: +// SPDX-FileCopyrightText: +// SPDX-FileCopyrightText: +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.example.portfolio2; + +/// Bachelorizer - bachelor programme registrar +public final class Main { + + /// Default constructor + // (declared explicitly only to silence javadoc) + public Main() {} + + /// JVM entry point + /// + /// @param args command-line arguments + public static void main(String[] args) { + Window.main(args); + } +} diff --git a/src/com.example.portfolio2/com/example/portfolio2/Window.java b/src/com.example.portfolio2/com/example/portfolio2/Window.java new file mode 100644 index 0000000..730741a --- /dev/null +++ b/src/com.example.portfolio2/com/example/portfolio2/Window.java @@ -0,0 +1,192 @@ +// SPDX-FileCopyrightText: +// SPDX-FileCopyrightText: +// SPDX-FileCopyrightText: +// SPDX-License-Identifier: GPL-3.0-or-later + +package com.example.portfolio2; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.TextArea; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +import java.io.IOException; +import java.util.List; + +/// Bachelorizer - JavaFX Window view +// Class is final to forbid subclassing, +// because object is passed to controller during instantiation +public final class Window extends Application { + + /// Default constructor + // (declared explicitly only to silence javadoc) + public Window() {} + + /// Label styling + public static final String LABEL_STYLE = + "-fx-font-weight: bold;-fx-font-size: 18;-fx-padding: 10"; + + /// Application model + private Model model = new Model(); + + /// Application controller + private Controller con = new Controller(model,this); + + /// database singleton + MyDB myDB = new MyDB(); + + /* Below is the original implementation of the UI elements with + accompanying, individual calls to setOnAction to specify functionality. + Before changing to a list format, + we made sure methods in controller and model + were generalized to allow for the new structure seamlessly. + private ComboBox programCombo = new ComboBox<>(); + private ComboBox subject1Combo = new ComboBox<>(); + private ComboBox subject2Combo = new ComboBox<>(); + private ComboBox electiveCombo = new ComboBox<>(); + + private ComboBox programSelect = new ComboBox<>(); + private ComboBox subject1Select = new ComboBox<>(); + private ComboBox subject2Select = new ComboBox<>(); + private ComboBox electiveSelect = new ComboBox<>(); + + private TextArea programArea = new TextArea(); + private TextArea subject1Area = new TextArea(); + private TextArea subject2Area = new TextArea(); + private TextArea electiveArea = new TextArea(); + + private Label programEcts = new Label(); + private Label subject1Ects = new Label(); + private Label subject2Ects = new Label(); + private Label electiveEcts = new Label(); + + private VBox program = new VBox(new Label("Program"), programCombo, programSelect, programArea, programEcts); + private VBox subject1 = new VBox(new Label("Subject 1"), subject1Combo, subject1Select, subject1Area, subject1Ects); + private VBox subject2 = new VBox(new Label("Subject 2"), subject2Combo, subject2Select, subject2Area, subject2Ects); + private VBox elective = new VBox(new Label("Elective"), electiveCombo, electiveSelect, electiveArea, electiveEcts); + */ + + @Override + public void start(Stage stage) throws IOException { + // clear old insertions into participation table + con.initialize(); + + // define list of columns based on their names + List columns = List.of( + new ActivityColumn("Program"), + new ActivityColumn("Subject 1"), + new ActivityColumn("Subject 2"), + new ActivityColumn("Elective") + ); + + // define list of subject modules + List subjectModules = List.of("Computer Science", "Informatik", "Astrology"); + + // define button functionality for each activity column + for (ActivityColumn col : columns) { + col.nameLabel.setStyle(LABEL_STYLE); + col.ectsLabel.setStyle(LABEL_STYLE); + col.categoryCombo.setPrefSize(250, 35); + col.activitySelect.setPrefSize(250, 35); + col.area.setPrefWidth(250); + + // all boxes share same activity logic + col.activitySelect.setOnAction(event -> { + con.onActivitySelected(col.categoryCombo, col.activitySelect, col.area); + con.updateEcts(col.ectsLabel, col.categoryCombo); + }); + + // handle each category box + switch (col.name) { + case "Program" -> { + col.categoryCombo.getItems().addAll("HumTek", "NatBach"); + col.categoryCombo.setOnAction(event -> { + con.onComboSelected(col.categoryCombo, col.activitySelect, col.area); + }); + } + // TODO: use the list for filling the box + case "Subject 1" -> { + col.categoryCombo.getItems().addAll("Computer Science", "Informatik", "Astrology"); + col.categoryCombo.setOnAction(event -> { + con.onSubjectModuleSelected(col.categoryCombo, columns.get(2).categoryCombo, subjectModules); + con.onComboSelected(col.categoryCombo, col.activitySelect, col.area); + }); + } + case "Subject 2" -> { + col.categoryCombo.getItems().addAll("Computer Science", "Informatik", "Astrology"); + // TODO: figure out a better way... + col.categoryCombo.setOnAction(event -> { + con.onSubjectModuleSelected(col.categoryCombo, columns.get(1).categoryCombo, subjectModules); + con.onComboSelected(col.categoryCombo, col.activitySelect, col.area); + }); + } + case "Elective" -> { + + // hide useless box + col.categoryCombo.setVisible(false); + + con.fillElective(col.activitySelect); + } + } + } + + // define HBox and scene for columns + HBox root = new HBox(columns.get(0).asVBox(), columns.get(1).asVBox(), columns.get(2).asVBox(), columns.get(3).asVBox()); + Scene scene = new Scene(root, 1000, 500); + stage.setTitle("Course Selector RUC: Ultimate Deluxe Edition"); + stage.setScene(scene); + stage.show(); + } + + /// JVM entry point + /// + /// @param args command-line arguments + public static void main(String[] args) { + launch(); + } + + /// column of activities + private class ActivityColumn { + + /// identifier stored in the text felt + String name; + + /// display text + Label nameLabel; + + /// dropdown list for categories + ComboBox categoryCombo; + + /// dropdown list for activities + ComboBox activitySelect; + + /// descriptionof chosen activities + TextArea area; + + /// text to display ECTS points + Label ectsLabel; + + /// column of activities + /// + /// @param name identifier + ActivityColumn(String name) { + this.name = name; + nameLabel = new Label(name); + categoryCombo = new ComboBox<>(); + activitySelect = new ComboBox<>(); + area = new TextArea(); + ectsLabel = new Label(); + } + + /// activity columne as VBox + /// + /// @return column of activities as VBox + VBox asVBox() { + return new VBox(nameLabel, categoryCombo, activitySelect, area, ectsLabel); + } + } +} -- cgit v1.2.3