From 770fa86998347bd0ef7c9d2bf0e1e4048ca12b7f Mon Sep 17 00:00:00 2001 From: tiko Date: Fri, 27 Feb 2026 12:42:45 +0100 Subject: [PATCH] Refactor components for improved instantiation and error handling --- grades.storage | 2 +- .../com/github/victorpyra/calc/ExamCalcApp.java | 2 +- .../github/victorpyra/calc/grading/Grading.java | 5 +++++ .../com/github/victorpyra/calc/result/Exam.java | 7 ------- .../victorpyra/calc/result/ExamRecord.java | 2 +- .../victorpyra/calc/result/ExamResult.java | 2 +- .../victorpyra/calc/storage/LocalStorage.java | 2 +- .../github/victorpyra/calc/ui/MainFrame.java | 10 +++------- .../calc/ui/component/ButtonComponent.java | 17 ++++++++++++++++- .../calc/ui/component/CardComponent.java | 6 +----- .../calc/ui/component/InputComponent.java | 11 +++++++++-- .../ui/component/WindowClosingComponent.java | 6 +++++- 12 files changed, 44 insertions(+), 28 deletions(-) diff --git a/grades.storage b/grades.storage index 3903776..d9b4304 100644 --- a/grades.storage +++ b/grades.storage @@ -1,5 +1,5 @@ #IHK Calc Auto-Save -#Thu Feb 26 09:21:47 CET 2026 +#Fri Feb 27 12:33:57 CET 2026 AP1=3 AP2_DOCUMENTATION=1 AP2_PART_1=4 diff --git a/src/main/java/com/github/victorpyra/calc/ExamCalcApp.java b/src/main/java/com/github/victorpyra/calc/ExamCalcApp.java index c009d06..8fa6aaf 100644 --- a/src/main/java/com/github/victorpyra/calc/ExamCalcApp.java +++ b/src/main/java/com/github/victorpyra/calc/ExamCalcApp.java @@ -26,7 +26,7 @@ public final class ExamCalcApp { * @param args Die beim Programmstart übergebenen Argumente (werden nicht verwendet). */ public static void main(String[] args) { - // Erstellt eine neue Instant des MainFrames mit dem Titel "IHK-Notenberechner" und öffnet diesen Frame von alleine. + // Erstellt eine neue Instanz der Klasse "MainFrame" mit dem Titel "IHK-Notenberechner" und öffnet diesen Frame von alleine. new MainFrame("IHK-Notenberechner", true); } } \ No newline at end of file diff --git a/src/main/java/com/github/victorpyra/calc/grading/Grading.java b/src/main/java/com/github/victorpyra/calc/grading/Grading.java index 4f8f442..e0892da 100644 --- a/src/main/java/com/github/victorpyra/calc/grading/Grading.java +++ b/src/main/java/com/github/victorpyra/calc/grading/Grading.java @@ -23,6 +23,11 @@ public record Grading(ExamRecord examRecord) { */ public static final int NEEDED_EXAM_RESULTS = 7; + /** + * Die Note, die zur automatischen "Nicht-Bestehung" der Prüfung führt. + */ + public static final double TERMINATION_GRADE = 6.0; + /** * Der Schwellenwert für die Note, bis zu dem eine Prüfung als bestanden gilt */ diff --git a/src/main/java/com/github/victorpyra/calc/result/Exam.java b/src/main/java/com/github/victorpyra/calc/result/Exam.java index 251dbdb..b5fce04 100644 --- a/src/main/java/com/github/victorpyra/calc/result/Exam.java +++ b/src/main/java/com/github/victorpyra/calc/result/Exam.java @@ -17,32 +17,26 @@ public enum Exam { * Die erste Abschlussprüfung (Teil 1), gewichtet mit 20 %. */ AP1("Abschlussprüfung 1", 0.2), - /** * Der erste schriftliche Teil der Abschlussprüfung 2, gewichtet mit 10 %. */ AP2_PART_1("AP2 Teil 1 (Schriftlich)", 0.1), - /** * Der zweite schriftliche Teil der Abschlussprüfung 2, gewichtet mit 10 %. */ AP2_PART_2("AP2 Teil 2 (Schriftlich)", 0.1), - /** * Der dritte schriftliche Teil der Abschlussprüfung 2 (WiSo), gewichtet mit 10 %. */ AP2_PART_3("AP2 Teil 3 (Wirtschafts- und Sozialkunde)", 0.1), - /** * Die Dokumentation der praktischen Arbeit in AP2, gewichtet mit 25 %. */ AP2_DOCUMENTATION("AP2 Dokumentation (Praktisch)", 0.25), - /** * Die Präsentation der praktischen Arbeit in AP2, gewichtet mit 12,5 %. */ AP2_PRESENTATION("AP2 Präsentation (Praktisch)", 0.125), - /** * Das fachliche Gespräch zur praktischen Arbeit in AP2, gewichtet mit 12,5 %. */ @@ -50,7 +44,6 @@ public enum Exam { private final String localizedName; private final double gradeTotal; - /** * Erstellt einen neuen Prüfungsbestandteil. * diff --git a/src/main/java/com/github/victorpyra/calc/result/ExamRecord.java b/src/main/java/com/github/victorpyra/calc/result/ExamRecord.java index 69e3900..0f7d423 100644 --- a/src/main/java/com/github/victorpyra/calc/result/ExamRecord.java +++ b/src/main/java/com/github/victorpyra/calc/result/ExamRecord.java @@ -79,7 +79,7 @@ public final class ExamRecord { * @return {@code true}, wenn mindestens eine Note 6.0 enthalten ist. */ public boolean terminated() { - return results.stream().anyMatch(entry -> entry.grade() == 6.0); + return results.stream().anyMatch(entry -> entry.grade() == Grading.TERMINATION_GRADE); } /** diff --git a/src/main/java/com/github/victorpyra/calc/result/ExamResult.java b/src/main/java/com/github/victorpyra/calc/result/ExamResult.java index ce81730..8ed9043 100644 --- a/src/main/java/com/github/victorpyra/calc/result/ExamResult.java +++ b/src/main/java/com/github/victorpyra/calc/result/ExamResult.java @@ -34,7 +34,7 @@ public record ExamResult( */ private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat( "0", - DecimalFormatSymbols.getInstance(Locale.GERMAN) + DecimalFormatSymbols.getInstance(Locale.ROOT) ); /* diff --git a/src/main/java/com/github/victorpyra/calc/storage/LocalStorage.java b/src/main/java/com/github/victorpyra/calc/storage/LocalStorage.java index 2f36697..4de6c96 100644 --- a/src/main/java/com/github/victorpyra/calc/storage/LocalStorage.java +++ b/src/main/java/com/github/victorpyra/calc/storage/LocalStorage.java @@ -45,7 +45,7 @@ public final class LocalStorage { try (BufferedWriter writer = Files.newBufferedWriter(STORAGE_PATH)) { data.store(writer, "IHK Calc Auto-Save"); } catch (IOException exception) { - System.err.println("Exception occured while saving data to storage: " + exception.getMessage()); + System.err.println("Exception occurred while saving data to storage: " + exception.getMessage()); } } diff --git a/src/main/java/com/github/victorpyra/calc/ui/MainFrame.java b/src/main/java/com/github/victorpyra/calc/ui/MainFrame.java index 91f928e..a00b503 100644 --- a/src/main/java/com/github/victorpyra/calc/ui/MainFrame.java +++ b/src/main/java/com/github/victorpyra/calc/ui/MainFrame.java @@ -88,7 +88,7 @@ public final class MainFrame extends JFrame { setAppIcon(); initFrame(); - addWindowListener(new WindowClosingComponent(examInputFields)); + addWindowListener(WindowClosingComponent.hook(examInputFields)); } /** @@ -145,7 +145,7 @@ public final class MainFrame extends JFrame { Properties savedData = LocalStorage.load(); for (Exam exam : Exam.values()) { - InputComponent inputComponent = new InputComponent(); + InputComponent inputComponent = InputComponent.create(); String savedValue = savedData.getProperty(exam.name()); if (savedValue != null) { @@ -166,11 +166,7 @@ public final class MainFrame extends JFrame { resultTextArea.setBackground(Theme.RESULT_BG); resultTextArea.setBorder(new EmptyBorder(10, 12, 10, 12)); - new ButtonComponent( - calcButton, - resultTextArea, - examInputFields - ); + ButtonComponent.place(calcButton, resultTextArea, examInputFields); } /** diff --git a/src/main/java/com/github/victorpyra/calc/ui/component/ButtonComponent.java b/src/main/java/com/github/victorpyra/calc/ui/component/ButtonComponent.java index b450de8..e02dd5e 100644 --- a/src/main/java/com/github/victorpyra/calc/ui/component/ButtonComponent.java +++ b/src/main/java/com/github/victorpyra/calc/ui/component/ButtonComponent.java @@ -58,7 +58,7 @@ public final class ButtonComponent implements ActionListener { * @param resultTextArea Der Textbereich zur Anzeige der Ergebnisse oder Fehlermeldungen. * @param examInputFields Eine Map, die jedem Prüfungsteil sein entsprechendes Eingabefeld zuordnet. */ - public ButtonComponent( + private ButtonComponent( JButton calcButton, JTextArea resultTextArea, Map examInputFields @@ -70,6 +70,21 @@ public final class ButtonComponent implements ActionListener { styleCalcButton(); } + /** + * Erstellt eine neue {@code CalcButtonComponent} und verknüpft sie mit der UI. + * + * @param calcButton Der Button, der die Berechnung auslösen soll. + * @param resultTextArea Der Textbereich zur Anzeige der Ergebnisse oder Fehlermeldungen. + * @param examInputFields Eine Map, die jedem Prüfungsteil sein entsprechendes Eingabefeld zuordnet. + */ + public static void place( + JButton calcButton, + JTextArea resultTextArea, + Map examInputFields + ) { + new ButtonComponent(calcButton, resultTextArea, examInputFields); + } + /** * Konfiguriert das visuelle Erscheinungsbild des Buttons basierend auf dem globalen Theme. * diff --git a/src/main/java/com/github/victorpyra/calc/ui/component/CardComponent.java b/src/main/java/com/github/victorpyra/calc/ui/component/CardComponent.java index bb958ba..f13ed44 100644 --- a/src/main/java/com/github/victorpyra/calc/ui/component/CardComponent.java +++ b/src/main/java/com/github/victorpyra/calc/ui/component/CardComponent.java @@ -49,11 +49,7 @@ public final class CardComponent { Theme.TEXT_MUTED ); - card.setBorder(new CompoundBorder( - titled, - new EmptyBorder(8, 10, 10, 10) - )); - + card.setBorder(new CompoundBorder(titled, new EmptyBorder(8, 10, 10, 10))); content.setBackground(Theme.PANEL_BG); card.add(content, BorderLayout.CENTER); diff --git a/src/main/java/com/github/victorpyra/calc/ui/component/InputComponent.java b/src/main/java/com/github/victorpyra/calc/ui/component/InputComponent.java index 62772c2..66a37a6 100644 --- a/src/main/java/com/github/victorpyra/calc/ui/component/InputComponent.java +++ b/src/main/java/com/github/victorpyra/calc/ui/component/InputComponent.java @@ -31,7 +31,6 @@ public final class InputComponent extends JTextField { new LineBorder(Theme.BORDER_COL, 2, true), new EmptyBorder(6, 10, 6, 10) ); - /** * Der Rahmen der Komponente, wenn sie den Tastaturfokus erhält. */ @@ -40,6 +39,14 @@ public final class InputComponent extends JTextField { new EmptyBorder(6, 10, 6, 10) ); + /** + * Erstellt einen InputComponent mit einem statischen Constructor. + * @return eine Instanz eines InputComponents. + */ + public static InputComponent create() { + return new InputComponent(); + } + /** * Erstellt eine neue {@code InputComponent} und initialisiert das visuelle Erscheinungsbild. * @@ -50,7 +57,7 @@ public final class InputComponent extends JTextField { *

* */ - public InputComponent() { + private InputComponent() { super(); setFont(Theme.FONT_FIELD); diff --git a/src/main/java/com/github/victorpyra/calc/ui/component/WindowClosingComponent.java b/src/main/java/com/github/victorpyra/calc/ui/component/WindowClosingComponent.java index 00a708c..9ce838a 100644 --- a/src/main/java/com/github/victorpyra/calc/ui/component/WindowClosingComponent.java +++ b/src/main/java/com/github/victorpyra/calc/ui/component/WindowClosingComponent.java @@ -31,10 +31,14 @@ public class WindowClosingComponent extends WindowAdapter { * * @param examInputFields Die Map, die den Zugriff auf die aktuellen Noteneingaben ermöglicht. */ - public WindowClosingComponent(Map examInputFields) { + private WindowClosingComponent(Map examInputFields) { this.examInputFields = examInputFields; } + public static WindowClosingComponent hook(Map examInputFields) { + return new WindowClosingComponent(examInputFields); + } + /** * Wird aufgerufen, wenn das Fenster geschlossen wird. *