// SPDX-FileCopyrightText: // SPDX-FileCopyrightText: // SPDX-FileCopyrightText: 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; public class HelloApplication extends Application { // Initializing model, controller and database objects private Model model = new Model(); private Controller con = new Controller(model,this); 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 { // Clears old insertions into the participation table con.initialize(); // Defines a 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") ); // Defines a list of subject modules List subjectModules = List.of("Computer Science", "Informatik", "Astrology"); // Loop for defining button funtionality for each activity column for (ActivityColumn col : columns) { col.nameLabel.setStyle("-fx-font-size: 18px; -fx-padding: 10px;"); // Styling col.ectsLabel.setStyle("-fx-font-size: 18px; -fx-padding: 10px"); col.categoryCombo.setPrefSize(250, 35); col.activitySelect.setPrefSize(250, 35); col.area.setPrefWidth(250); // All boxes share the same activity logic col.activitySelect.setOnAction(event -> { con.onActivitySelected(col.categoryCombo, col.activitySelect, col.area); con.updateEcts(col.ectsLabel, col.categoryCombo); }); switch (col.name) { // Switch statement handles different category boxes case "Program" -> { col.categoryCombo.getItems().addAll("HumTek", "NatBach"); col.categoryCombo.setOnAction(event -> { con.onComboSelected(col.categoryCombo, col.activitySelect, col.area); }); } case "Subject 1" -> { // We considered using the list for filling the box but couldn't figure it out 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"); col.categoryCombo.setOnAction(event -> { // We figured we have to specify // the second column like this but reckon there's a better way. con.onSubjectModuleSelected(col.categoryCombo, columns.get(1).categoryCombo, subjectModules); con.onComboSelected(col.categoryCombo, col.activitySelect, col.area); }); } case "Elective" -> { col.categoryCombo.setVisible(false); // Hide useless box con.fillElective(col.activitySelect); } } } // Define an HBox based on the columns and define the scene based on it. 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(); } public static void main(String[] args) { launch(); } // Class for each column of activities private class ActivityColumn { // Each column contains these elements String name; Label nameLabel; ComboBox categoryCombo; ComboBox activitySelect; TextArea area; Label ectsLabel; ActivityColumn(String name) { this.name = name; nameLabel = new Label(name); categoryCombo = new ComboBox<>(); activitySelect = new ComboBox<>(); area = new TextArea(); ectsLabel = new Label(); // new column, "this.name" to define and saved in the text felt, // new "nameLabel" to show visual text. // CategoryCombo creat a dropdown list // activitySelect creat one more dropdown list with Combobox, possible to choose activity. // area = new TextArea helps create a text felt to describe the chosen activity // ectsLabel = new Label shows text for ects points } VBox asVBox() { return new VBox(nameLabel, categoryCombo, activitySelect, area, ectsLabel); } } }