Compare commits

...

4 Commits

Author SHA1 Message Date
d4c77fef1c package-info.java ausgefüllt 2025-07-25 13:16:03 +02:00
22f5d6d57d gui Folder entfernt 2025-07-25 13:00:46 +02:00
ac4f45159d 4.3 f) fertig und Abgabebereit 2025-07-25 12:57:12 +02:00
7054e41f3b DHStudent.java und Person.java debugged
TestKlasse.java fertig bis zu Aufgabe 4.3 c)
2025-07-25 12:03:40 +02:00
12 changed files with 129 additions and 1153 deletions

View File

@ -1,207 +0,0 @@
/**
* Klasse für die Darstellung von Angestellten.
*/
package gui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import personen.Angestellter;
import personen.Person;
/**
* Diese Klasse ist für die Darstellung der Angestellten
* zuständig.
*
* @author konrad
*/
public class AngestellterGui extends InternalFrameElternklasse {
/** Referenz auf das Feld der Angestellten. */
private Angestellter angestelltenFeld[];
// Graphische Elemente der Oberfläche
private JTable table;
private DefaultTableModel model;
private JPanel panel;
private JScrollPane scrollPane;
/**
* @param title Titel im Kopf des Fensters.
* @param angestelltenFeld Referenz auf das Feld der Angestellten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public AngestellterGui(String title, Angestellter angestelltenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, true, angestelltenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param angestelltenFeld Referenz auf das Feld der Angestellten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public AngestellterGui(String title, boolean resizable,
Angestellter angestelltenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, resizable, true, angestelltenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param angestelltenFeld Referenz auf das Feld der Angestellten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public AngestellterGui(String title, boolean resizable, boolean closable,
Angestellter angestelltenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, resizable, closable, true, angestelltenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param maximizable Flag, ob das Fenster maximiert werden kann.
* @param angestelltenFeld Referenz auf das Feld der Angestellten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public AngestellterGui(String title, boolean resizable, boolean closable, boolean maximizable,
Angestellter angestelltenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, resizable, closable, maximizable, true, angestelltenFeld, desktop, gui);
}
/**
* Umfangreichster Konstruktor zum Erzeugen eines Fensters
* für Angestellte, das als JInternalFrame einem JDesktop
* hinzugefügt werden kann.
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param maximizable Flag, ob das Fenster maximiert werden kann.
* @param iconifiable Flag, ob das Fenster zum Icon minimiert werden kann.
* @param angestelltenFeld Referenz auf das Feld der Angestellten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public AngestellterGui(String title, boolean resizable, boolean closable, boolean maximizable,
boolean iconifiable,
Angestellter angestelltenFeld[],
JDesktopPane desktop, Gui gui) {
super(title, resizable, closable, maximizable, iconifiable,
desktop, gui);
this.angestelltenFeld = angestelltenFeld;
this.model = new DefaultTableModel();
this.table = new JTable(this.model);
// Erstellen eines Panels für den Inhalt des internen Frames
this.panel = new JPanel(new BorderLayout());
this.scrollPane = new JScrollPane(this.table);
panel.add(scrollPane, BorderLayout.CENTER);
// Knopf zum Speichern von Änderungen erstellen
JButton speichernButton = new JButton("Änderungen speichern");
speichernButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aenderungenSpeichern();
}
});
panel.add(speichernButton, BorderLayout.SOUTH);
this.add(panel);
// x, y, breite, hoehe
this.setBounds(33, 47, 192, 202);
this.setVisible(true);
String spaltenNamen[] = { "Name", "Personalnummer" };
erzeugeTabelle(angestelltenFeld, spaltenNamen);
}
/**
* Implementierung der abstrakten Methode aus InternalFrameElternklasse.
* Diese Methode wird aufgerufen, wenn das Fenster geschlossen wird.
* Sie ist dafür zuständig, die spezifische Referenz in der Gui-Klasse
* auf null zu setzen.
*/
@Override
protected void handleFrameClosed() {
if (mainGuiRef != null) { // mainGuiRef kommt von InternalFrameElternklasse
mainGuiRef.setAngestelltenGuiToNull();
}
}
/**
* Das Datenmodell der Tabelle mit Daten befüllen.
* @param datenQuelle 1D-Feld mit Angestellten-Objekten.
* @param spaltenNamen 1D-Feld mit den Namen bzw.
* Überschriften der Spalten.
*/
private void erzeugeTabelle(Object datenQuelle[], String spaltenNamen[]) {
// Erstellen der Daten für die Tabelle
Object[][] daten = new Object[datenQuelle.length][spaltenNamen.length];
for(int zeile = 0; zeile < datenQuelle.length; zeile++) {
int spalte = 0;
daten[zeile][spalte] = ((Person)datenQuelle[zeile]).getName();
spalte++;
daten[zeile][spalte] = ((Angestellter)datenQuelle[zeile]).getPersonalNr();
}
this.model.setRowCount(datenQuelle.length);
this.model.setDataVector(daten, spaltenNamen);
this.setVisible(true);
}
/**
* Die interaktiven Änderungen in der Tabelle
* im Feld der Angestellten speichern.
*/
private void aenderungenSpeichern() {
int zeilenN = this.model.getRowCount();
int spaltenN = this.model.getColumnCount();
String name;
int personalNr;
for(int zeile = 0; zeile < zeilenN; zeile++) {
name = (String)(this.model.getValueAt(zeile, 0));
Object o = this.model.getValueAt(zeile, 1);
personalNr = 0;
// Greift, sobald einmal eine Zelle geändert worden ist
if(o instanceof String) {
String text = (String)o;
personalNr = Integer.parseInt(text);
}
// Greift, solange eine Zelle noch nicht geändert worden ist
if(o instanceof Integer) {
personalNr = (Integer)(this.model.getValueAt(zeile, 1));
}
angestelltenFeld[zeile].setName(name);
angestelltenFeld[zeile].setPersonalNr(personalNr);
}
}
}

View File

@ -1,212 +0,0 @@
/**
* Klasse für die Darstellung von DH-Studenten.
*/
package gui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import personen.Person;
import personen.studenten.DHStudent;
import personen.studenten.Student;
/**
* Diese Klasse ist für die Darstellung der DH-Studenten
* zuständig.
*
* @author konrad
*/
public class DHStudentGui extends InternalFrameElternklasse {
/** Referenz auf das Feld der DH-Studenten. */
private DHStudent dhStudentenFeld[];
// Graphische Elemente der Oberfläche
private JTable table;
private DefaultTableModel model;
private JPanel panel;
private JScrollPane scrollPane;
/**
* @param title Titel im Kopf des Fensters.
* @param angestelltenFeld Referenz auf das Feld der DH-Studenten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public DHStudentGui(String title, DHStudent dhStudentenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, true, dhStudentenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param angestelltenFeld Referenz auf das Feld der DH-Studenten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public DHStudentGui(String title, boolean resizable,
DHStudent dhStudentenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, resizable, true, dhStudentenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param angestelltenFeld Referenz auf das Feld der DH-Studenten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public DHStudentGui(String title, boolean resizable, boolean closable,
DHStudent dhStudentenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, resizable, closable, true, dhStudentenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param maximizable Flag, ob das Fenster maximiert werden kann.
* @param angestelltenFeld Referenz auf das Feld der DH-Studenten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public DHStudentGui(String title, boolean resizable, boolean closable, boolean maximizable,
DHStudent dhStudentenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, resizable, closable, maximizable, true,
dhStudentenFeld, desktop, gui);
}
/**
* Umfangreichster Konstruktor zum Erzeugen eines Fensters
* für DH-Studenten, das als JInternalFrame einem JDesktop
* hinzugefügt werden kann.
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param maximizable Flag, ob das Fenster maximiert werden kann.
* @param iconifiable Flag, ob das Fenster zum Icon minimiert werden kann.
* @param angestelltenFeld Referenz auf das Feld der Angestellten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public DHStudentGui(String title, boolean resizable, boolean closable, boolean maximizable,
boolean iconifiable,
DHStudent dhStudentenFeld[],
JDesktopPane desktop, Gui gui) {
super(title, resizable, closable, maximizable, iconifiable,
desktop, gui);
this.dhStudentenFeld = dhStudentenFeld;
this.model = new DefaultTableModel();
this.table = new JTable(this.model);
// Erstellen eines Panels für den Inhalt des internen Frames
this.panel = new JPanel(new BorderLayout());
this.scrollPane = new JScrollPane(this.table);
panel.add(scrollPane, BorderLayout.CENTER);
// Knopf zum Speichern von Änderungen erstellen
JButton speichernButton = new JButton("Änderungen speichern");
speichernButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aenderungenSpeichern();
}
});
panel.add(speichernButton, BorderLayout.SOUTH);
this.add(panel);
// x, y, breite, hoehe
this.setBounds(180, 250, 400, 250);
this.setVisible(true);
String spaltenNamen[] = { "Name", "Semester", "Kurs" };
erzeugeTabelle(dhStudentenFeld, spaltenNamen);
}
/**
* Implementierung der abstrakten Methode aus InternalFrameElternklasse.
* Diese Methode wird aufgerufen, wenn das Fenster geschlossen wird.
* Sie ist dafür zuständig, die spezifische Referenz in der Gui-Klasse
* auf null zu setzen.
*/
@Override
protected void handleFrameClosed() {
if (mainGuiRef != null) { // mainGuiRef kommt von InternalFrameElternklasse
mainGuiRef.setDhStudentGuiToNull();
}
}
/**
* Das Datenmodell der Tabelle mit Daten befüllen.
* @param datenQuelle 1D-Feld mit DH-Studenten-Objekten.
* @param spaltenNamen 1D-Feld mit den Namen bzw.
* Überschriften der Spalten.
*/
private void erzeugeTabelle(Object datenQuelle[], String spaltenNamen[]) {
// Erstellen der Daten für die Tabelle
Object[][] daten = new Object[datenQuelle.length][spaltenNamen.length];
for(int zeile = 0; zeile < datenQuelle.length; zeile++) {
int spalte = 0;
daten[zeile][spalte++] = ((Person)datenQuelle[zeile]).getName();
daten[zeile][spalte++] = ((Student)datenQuelle[zeile]).getSemester();
daten[zeile][spalte] = ((DHStudent)datenQuelle[zeile]).getKurs();
}
this.model.setRowCount(datenQuelle.length);
this.model.setDataVector(daten, spaltenNamen);
this.setVisible(true);
}
/**
* Die interaktiven Änderungen in der Tabelle
* im Feld der DH-Studenten speichern.
*/
private void aenderungenSpeichern() {
int zeilenN = this.model.getRowCount();
int spaltenN = this.model.getColumnCount();
String name;
int semester;
String kurs;
for(int zeile = 0; zeile < zeilenN; zeile++) {
name = (String)(this.model.getValueAt(zeile, 0));
Object o = this.model.getValueAt(zeile, 1);
semester = 0;
// Greift, sobald einmal eine Zelle geändert worden ist
if(o instanceof String) {
String text = (String)o;
semester = Integer.parseInt(text);
}
// Greift, solange eine Zelle noch nicht geändert worden ist
if(o instanceof Integer) {
semester = (Integer)(this.model.getValueAt(zeile, 1));
}
kurs = (String)(this.model.getValueAt(zeile, 2));
dhStudentenFeld[zeile].setName(name);
dhStudentenFeld[zeile].setSemester(semester);
dhStudentenFeld[zeile].setKurs(kurs);
}
}
}

View File

@ -1,274 +0,0 @@
/**
* Zentrale Klassee für das Erstellen des GUI.
*/
package gui;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import personen.Angestellter;
import personen.IKlausurSchreiber;
import personen.IMitarbeiter;
import personen.Lehrbeauftragter;
import personen.studenten.DHStudent;
import personen.studenten.Student;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.beans.PropertyVetoException;
/**
* Diese Klasse ist die zentrale Klasse zum Erstellen des GUI
*
* @author konrad
*/
public class Gui extends JFrame {
private IMitarbeiter mitarbeiterFeld[];
private Lehrbeauftragter lehrbeauftragtenFeld[];
private IKlausurSchreiber prueflinge[];
private DHStudent dhStudentenFeld[];
private Student studentenFeld[];
private JDesktopPane desktop;
private JMenuBar menuBar;
private AngestellterGui angestellterGui;
private StudentGui studentGui;
private DHStudentGui dhStudentGui;
// Instanzen der Klasse InternalFrameHilfsklasseZumOeffnen für jeden Fenstertyp
private InternalFrameHilfsklasseZumOeffnen<StudentGui> studentenOpener;
private InternalFrameHilfsklasseZumOeffnen<DHStudentGui> dhStudentenOpener;
private InternalFrameHilfsklasseZumOeffnen<AngestellterGui> angestelltenOpener;
/**
* Konstruktor.
*
* @param angestelltenFeld
* @param mitarbeiterFeld
* @param lehrbeauftragtenFeld
* @param prueflinge
* @param studentenFeld
* @param dhStudentenFeld
*/
public Gui(
Angestellter angestelltenFeld[],
IMitarbeiter mitarbeiterFeld[],
Lehrbeauftragter lehrbeauftragtenFeld[],
IKlausurSchreiber prueflinge[],
Student studentenFeld[],
DHStudent dhStudentenFeld[]) {
// Konstruktor von JFrame mit Fenstertitel
super("TINF24CS1");
this.mitarbeiterFeld = mitarbeiterFeld;
this.lehrbeauftragtenFeld = lehrbeauftragtenFeld;
this.prueflinge = prueflinge;
this.studentenFeld = studentenFeld;
this.dhStudentenFeld = dhStudentenFeld;
// Erstellen des Fensters
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(800, 600);
// Erstellen der Menüleiste
this.menuBar = new JMenuBar();
// Erstellen des "Datei"-Menüs
JMenu fileMenu = new JMenu("Datei");
JMenuItem newMenuItem = new JMenuItem("Neu");
JMenuItem openMenuItem = new JMenuItem("Öffnen");
JMenuItem saveMenuItem = new JMenuItem("Speichern");
JMenuItem exitMenuItem = new JMenuItem("Beenden");
// Hinzufügen der Menüelemente zum "Datei"-Menü
fileMenu.add(newMenuItem);
fileMenu.add(openMenuItem);
fileMenu.add(saveMenuItem);
fileMenu.addSeparator();
fileMenu.add(exitMenuItem);
// Erstellen des "Bearbeiten"-Menüs
JMenu editMenu = new JMenu("Bearbeiten");
JMenuItem cutMenuItem = new JMenuItem("Ausschneiden");
JMenuItem copyMenuItem = new JMenuItem("Kopieren");
JMenuItem pasteMenuItem = new JMenuItem("Einfügen");
// Hinzufügen der Menüelemente zum "Bearbeiten"-Menü
editMenu.add(cutMenuItem);
editMenu.add(copyMenuItem);
editMenu.add(pasteMenuItem);
// Erstellen des "Anzeigen"-Menüs
JMenu anzeigeMenu = new JMenu("Anzeigen");
JMenuItem angestelltenMenuItem = new JMenuItem("Angestellte");
JMenuItem mitarbeiterMenuItem = new JMenuItem("Mitarbeiter");
JMenuItem lehrbeauftragterMenuItem = new JMenuItem("Lehrbeauftragte");
JMenuItem prueflingeMenuItem = new JMenuItem("Prüflinge");
JMenuItem studentenMenuItem = new JMenuItem("Studenten");
JMenuItem dhStudentenMenuItem = new JMenuItem("DH-Studenten");
// Hinzufügen der Menüelemente zum "Anzeigen"-Menü
anzeigeMenu.add(angestelltenMenuItem);
anzeigeMenu.add(mitarbeiterMenuItem);
anzeigeMenu.add(lehrbeauftragterMenuItem);
anzeigeMenu.add(prueflingeMenuItem);
anzeigeMenu.add(studentenMenuItem);
anzeigeMenu.add(dhStudentenMenuItem);
// Hinzufügen der Menüs zur Menüleiste
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(anzeigeMenu);
// Hinzufügen der Menüleiste zum JFrame
this.setJMenuBar(menuBar);
// Desktop-Fläche für die "JInternalFrame"-Fenster erstellen
this.desktop = new JDesktopPane();
setContentPane(desktop);
// Erzeuge die 3 Instanzen der InternalFrameHilfsklasseZumOeffnen
studentenOpener = new InternalFrameHilfsklasseZumOeffnen<>(desktop, this, () -> {
String title = "Studenten (KEINE DH!)";
boolean resizable = true;
boolean closable = true;
boolean maximizable = true;
boolean iconifiable = true;
StudentGui newStudentGui = new StudentGui(
title, resizable, closable, maximizable,
iconifiable, studentenFeld, desktop, this);
// Referenz in Gui.java aktualisieren
this.studentGui = newStudentGui;
return newStudentGui;
});
dhStudentenOpener = new InternalFrameHilfsklasseZumOeffnen<>(desktop, this, () -> {
String title = "DHBW-Studenten";
boolean resizable = true;
boolean closable = true;
boolean maximizable = true;
boolean iconifiable = true;
DHStudentGui newDhStudentGui = new DHStudentGui(
title, resizable, closable, maximizable,
iconifiable, dhStudentenFeld, desktop, this);
// Referenz in Gui.java aktualisieren
this.dhStudentGui = newDhStudentGui;
return newDhStudentGui;
});
angestelltenOpener = new InternalFrameHilfsklasseZumOeffnen<>(desktop, this, () -> {
String title = "Angestellte";
boolean resizable = true;
boolean closable = true;
boolean maximizable = true;
boolean iconifiable = true;
AngestellterGui newAngestellterGui = new AngestellterGui(
title, resizable, closable, maximizable,
iconifiable, angestelltenFeld, desktop, this);
// Referenz in Gui.java aktualisieren
this.angestellterGui = newAngestellterGui;
return newAngestellterGui;
});
// Hinzufügen der ActionListener zu den Menüelementen
exitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
newMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Gui.this, "Neu ausgewählt");
}
});
openMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Gui.this, "Öffnen ausgewählt");
}
});
saveMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Gui.this, "Speichern ausgewählt");
}
});
cutMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Gui.this, "Ausschneiden ausgewählt");
}
});
copyMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Gui.this, "Kopieren ausgewählt");
}
});
pasteMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(Gui.this, "Einfügen ausgewählt");
}
});
// Hier ganz kurzer Quelltext dank der Hilfsklassenobjekte!
angestelltenMenuItem.addActionListener(angestelltenOpener);
// Hier ganz kurzer Quelltext dank der Hilfsklassenobjekte!
studentenMenuItem.addActionListener(studentenOpener);
// Hier ganz kurzer Quelltext dank der Hilfsklassenobjekte!
dhStudentenMenuItem.addActionListener(dhStudentenOpener);
// Anzeigen des Fensters
this.setVisible(true);
}
/**
* Dient zum Informieren des Openers.
*/
public void setStudentGuiToNull() {
this.studentGui = null;
// Sicherstellen, dass der Opener schon initialisiert ist
if (studentenOpener != null) {
studentenOpener.clearManagedFrame();
}
}
/**
* Dient zum Informieren des Openers.
*/
public void setDhStudentGuiToNull() {
this.dhStudentGui = null;
if (dhStudentenOpener != null) {
dhStudentenOpener.clearManagedFrame();
}
}
/**
* Dient zum Informieren des Openers.
*/
public void setAngestelltenGuiToNull() {
this.angestellterGui = null;
if (angestelltenOpener != null) {
angestelltenOpener.clearManagedFrame();
}
}
}

View File

@ -1,85 +0,0 @@
/**
* Elternklasse für die einzelnen Fenster auf dem Desktop
* der Anwendung.
*/
package gui;
/**
*
*/
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
/**
* Elternklasse für die einzelnen Fenster auf dem Desktop
* der Anwendung.
*/
public abstract class InternalFrameElternklasse extends JInternalFrame {
/** Referenz auf den Desktop. */
protected JDesktopPane desktopRef;
/** Referenz zur Haupt-GUI-Klasse */
protected Gui mainGuiRef;
/**
* Konstruktor.
*
* @param title
* @param resizable
* @param closable
* @param maximizable
* @param iconifiable
* @param desktop
* @param mainGui
*/
public InternalFrameElternklasse(String title, boolean resizable, boolean closable,
boolean maximizable, boolean iconifiable,
JDesktopPane desktop, Gui mainGui) {
super(title, resizable, closable, maximizable, iconifiable);
this.desktopRef = desktop;
this.mainGuiRef = mainGui;
// Füge den Listener für das Schließen des Fensters hinzu
this.addInternalFrameListener(new InternalFrameAdapter() {
@Override
public void internalFrameClosed(InternalFrameEvent e) {
// Diese Methode muss in der abgeleiteten Klasse implementiert
// oder überschrieben werden, oder man verlässt sich darauf, dass
// mainGuiRef die entsprechende setXxxGuiToNull aufruft.
handleFrameClosed();
// Allgemeine Desktop-Aktualisierung nach dem Schließen
if (desktopRef != null) {
SwingUtilities.invokeLater(() -> {
desktopRef.revalidate();
desktopRef.repaint();
});
}
}
});
// Füge den ComponentListener für das Beseitigen von möglichem
// "Pixel-Schmutz" beim Verschieben hinzu
this.addComponentListener(new ComponentAdapter() {
@Override
public void componentMoved(ComponentEvent e) {
if (desktopRef != null) {
SwingUtilities.invokeLater(() -> desktopRef.repaint());
}
}
});
}
/**
* Abstrakte Methode, die von den Unterklassen implementiert werden muss,
* um die spezifische Referenz in der Gui-Klasse auf null zu setzen.
*/
protected abstract void handleFrameClosed();
}

View File

@ -1,139 +0,0 @@
/**
* Hilfsklasse zum Öffnen der einzelnen Fenster.
*/
package gui;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
/**
* Hilfsklasse zum Öffnen der einzelnen Fenster.
*
* Die Handhabung der Fenster ist besonders dadurch kompliziert,
* weil sie in diesem Programm alle Optionen haben:
* - Erstmals ganz neu nach Programmstart öffnen.
* - Erneut öffnen nach vorherigem Schließen.
* - Öffnen nach voherigem Umwandeln in Icon und Klicken auf das Icon.
* - Öffnen über das Menü nach voherigem Umwandeln in Icon.
*/
public class InternalFrameHilfsklasseZumOeffnen<T extends JInternalFrame> implements ActionListener {
private boolean DEBUG = false;
private JDesktopPane desktop;
/** Die Referenz zum spezifischen JInternalFrame (z.B. studentGui) */
private T frameToManage;
/** Referenz zur Haupt-GUI-Klasse */
private Gui mainGui;
/** Funktionales Interface zum Erzeugen der JInternalFrame-Instanzen */
@FunctionalInterface
public interface InternalFrameFactory<F extends JInternalFrame> {
F create();
}
private InternalFrameFactory<T> frameFactory;
/**
* Konstruktor.
*
* @param desktop
* @param mainGui
* @param factory
*/
public InternalFrameHilfsklasseZumOeffnen(JDesktopPane desktop, Gui mainGui, InternalFrameFactory<T> factory) {
this.desktop = desktop;
this.mainGui = mainGui;
this.frameFactory = factory;
}
/**
* Diese Methode MUSS von der Gui-Klasse aufgerufen werden,
* nachdem der Opener ein neues Fenster erzeugt hat.
* Das ist nicht mehr direkt notwendig, da der Lambda-Ausdruck
* in Gui.java die Referenz direkt aktualisiert.
* Diese Methode dient hauptsächlich dazu, die
* frameToManage-Referenz in diesem Opener zu setzen.
* @param frame
*/
public void setManagedFrame(T frame) {
this.frameToManage = frame;
}
/**
* Methode, um die Instanz auf null zu setzen, wenn das Fenster geschlossen
* wird. Wird von den setXXXGuiToNull() Methoden in Gui.java aufgerufen.
*/
public void clearManagedFrame() {
this.frameToManage = null;
}
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Prüfen, ob das Fenster bereits im Desktop ist (inkl. minimierter Zustand)
boolean frameFound = false;
if (frameToManage != null) {
JInternalFrame[] allFrames = desktop.getAllFrames();
for (JInternalFrame frame : allFrames) {
if (frame == frameToManage) {
frameFound = true;
break;
}
}
}
if (!frameFound) {
// Wenn das Fenster NICHT gefunden wurde
if(DEBUG) System.out.println("DEBUG (Opener): Neues Fenster wird erzeugt.");
// Fenster über die Factory-Methode erstellen
T newFrame = frameFactory.create();
// Referenz im Opener aktualisieren
// (optional, aber zur Klarstellung)
setManagedFrame(newFrame);
desktop.add(newFrame);
// Optional: Feste Startposition für neue Fenster.
if(false) newFrame.setLocation(50, 50);
try {
// Direkt in den Vordergrund bringen
newFrame.setSelected(true);
} catch (PropertyVetoException pve) {
System.err.println(
"Fehler beim Setzen des neuen Fensters in den Vordergrund: "+
pve.getMessage());
}
} else {
// Fenster existiert bereits im Desktop
if(DEBUG) System.out.println(
"DEBUG (Opener): Bestehendes Fenster wird behandelt.");
try {
if (frameToManage.isIcon()) {
if(DEBUG) System.out.println(
"DEBUG (Opener): Fenster war minimiert, wird wiederhergestellt.");
frameToManage.setIcon(false);
}
frameToManage.setVisible(true);
frameToManage.setSelected(true);
} catch (PropertyVetoException pve) {
System.err.println(
"Fehler beim Setzen des bestehenden Fensters in den Vordergrund: " +
pve.getMessage());
}
}
desktop.revalidate();
desktop.repaint();
}
});
}
}

View File

@ -1,218 +0,0 @@
/**
* Klasse für die Darstellung von Studenten.
*/
package gui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import personen.Person;
import personen.studenten.Student;
/**
* Diese Klasse ist für die Darstellung der Studenten
* zuständig.
*
* @author konrad
*/
public class StudentGui extends InternalFrameElternklasse {
/** Referenz auf das Feld der Studenten. */
private Student studentenFeld[];
// Graphische Elemente der Oberfläche
private JTable table;
private DefaultTableModel model;
private JPanel panel;
private JScrollPane scrollPane;
/**
* @param title Titel im Kopf des Fensters.
* @param angestelltenFeld Referenz auf das Feld der Studenten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public StudentGui(String title, Student studentenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, true, studentenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param angestelltenFeld Referenz auf das Feld der Studenten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public StudentGui(String title, boolean resizable,
Student studentenFeld[], JDesktopPane desktop, Gui gui) {
this(title, resizable, true, studentenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param angestelltenFeld Referenz auf das Feld der Studenten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public StudentGui(String title, boolean resizable, boolean closable,
Student studentenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, resizable, closable, true, studentenFeld, desktop, gui);
}
/**
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param maximizable Flag, ob das Fenster maximiert werden kann.
* @param angestelltenFeld Referenz auf das Feld der Studenten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public StudentGui(String title, boolean resizable, boolean closable, boolean maximizable,
Student studentenFeld[],
JDesktopPane desktop, Gui gui) {
this(title, resizable, closable, maximizable, true,
studentenFeld, desktop, gui);
}
/**
* Umfangreichster Konstruktor zum Erzeugen eines Fensters
* für Studenten, das als JInternalFrame einem JDesktop
* hinzugefügt werden kann.
* @param title Titel im Kopf des Fensters.
* @param resizable Flag, ob die Größe des Fensters änderbar ist.
* @param closable Flag, ob das Fenster ganz geschlossen werden kann.
* @param maximizable Flag, ob das Fenster maximiert werden kann.
* @param iconifiable Flag, ob das Fenster zum Icon minimiert werden kann.
* @param angestelltenFeld Referenz auf das Feld der Angestellten.
* @param desktop Referenz auf die Arbeitsfläche.
* @param gui Referenz auf die zentrale GUI-Klasse.
*/
public StudentGui(String title, boolean resizable, boolean closable, boolean maximizable,
boolean iconifiable,
Student studentenFeld[],
JDesktopPane desktop, Gui gui) {
super(title, resizable, closable, maximizable, iconifiable,
desktop, gui);
this.studentenFeld = studentenFeld;
this.model = new DefaultTableModel();
this.table = new JTable(this.model);
// Erstellen eines Panels für den Inhalt des internen Frames
this.panel = new JPanel(new BorderLayout());
this.scrollPane = new JScrollPane(this.table);
panel.add(scrollPane, BorderLayout.CENTER);
// Knopf zum Speichern von Änderungen erstellen
JButton speichernButton = new JButton("Änderungen speichern");
speichernButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
aenderungenSpeichern();
}
});
panel.add(speichernButton, BorderLayout.SOUTH);
this.add(panel);
// x, y, breite, hoehe
this.setBounds(250, 20, 300, 200);
this.setVisible(true);
String spaltenNamen[] = { "Name", "Semester", "BAföG-Schulden [€]" };
erzeugeTabelle(studentenFeld, spaltenNamen);
}
/**
* Implementierung der abstrakten Methode aus InternalFrameElternklasse.
* Diese Methode wird aufgerufen, wenn das Fenster geschlossen wird.
* Sie ist dafür zuständig, die spezifische Referenz in der Gui-Klasse
* auf null zu setzen.
*/
@Override
protected void handleFrameClosed() {
if (mainGuiRef != null) { // mainGuiRef kommt von InternalFrameElternklasse
mainGuiRef.setStudentGuiToNull();
}
}
/**
* Das Datenmodell der Tabelle mit Daten befüllen.
* @param datenQuelle 1D-Feld mit Studenten-Objekten.
* @param spaltenNamen 1D-Feld mit den Namen bzw.
* Überschriften der Spalten.
*/
private void erzeugeTabelle(Object datenQuelle[], String spaltenNamen[]) {
// Erstellen der Daten für die Tabelle
Object[][] daten = new Object[datenQuelle.length][spaltenNamen.length];
for(int zeile = 0; zeile < datenQuelle.length; zeile++) {
int spalte = 0;
daten[zeile][spalte++] = ((Person)datenQuelle[zeile]).getName();
daten[zeile][spalte++] = ((Student)datenQuelle[zeile]).getSemester();
daten[zeile][spalte] = ((Student)datenQuelle[zeile]).getBafoegSchulden();
}
this.model.setRowCount(datenQuelle.length);
this.model.setDataVector(daten, spaltenNamen);
this.setVisible(true);
}
/**
* Die interaktiven Änderungen in der Tabelle
* im Feld der Studenten speichern.
*/
private void aenderungenSpeichern() {
int zeilenN = this.model.getRowCount();
int spaltenN = this.model.getColumnCount();
String name;
int semester;
double bafoegSchulden;
for(int zeile = 0; zeile < zeilenN; zeile++) {
name = (String)(this.model.getValueAt(zeile, 0));
Object o = this.model.getValueAt(zeile, 1);
semester = 0;
// Greift, sobald einmal eine Zelle geändert worden ist
if(o instanceof String) {
String text = (String)o;
semester = Integer.parseInt(text);
}
// Greift, solange eine Zelle noch nicht geändert worden ist
if(o instanceof Integer) {
semester = (Integer)(this.model.getValueAt(zeile, 1));
}
o = this.model.getValueAt(zeile, 2);
bafoegSchulden = 0.0;
if(o instanceof String) {
String text = (String)o;
bafoegSchulden = Double.parseDouble(text);
}
if(o instanceof Double) {
bafoegSchulden = (double)(this.model.getValueAt(zeile, 2));
}
studentenFeld[zeile].setName(name);
studentenFeld[zeile].setSemester(semester);
studentenFeld[zeile].setBafoegSchulden(bafoegSchulden);
}
}
}

View File

@ -1,9 +0,0 @@
/**
*
*/
/**
* @author konrad
*
*/
package gui;

View File

@ -71,14 +71,6 @@ public class DHStudent extends Student implements IMitarbeiter {
return this.kurs + " " + this.name + " " + this.semester + ".Sem.";
}
/**
* Implementierung der default-Methode inKantineEssen aus IMitarbeiter
*/
@Override
public void inKantineEssen() {
System.out.println("Wie lecker doch das Essen bei meiner Ausbildungsfirma schmeckt!");
}
/**
* Innere Klasse für Sortierung nach Kurs und Name
*/

View File

@ -56,4 +56,13 @@ public class Lehrbeauftragter {
pruefling.klausurSchreiben();
}
}
/**
* Überschreibt die toString-Methode der Klasse Object
* @return Der Name des Lehrbeauftragten
*/
@Override
public String toString() {
return this.name;
}
}

View File

@ -9,7 +9,7 @@ public abstract class Person {
/**
* Klassenvariable zur Zählung aller erstellten Personen
*/
private static int anzahl = 0;
protected static int anzahl = 0;
/**
* Name der Person

View File

@ -1 +1,13 @@
/**
* Dieses Paket enthält alle Klassen und Schnittstellen für das
* objektorientierte Java-Projekt zum Thema Personen.
*
* Das Paket umfasst:
* - Abstrakte Basisklasse Person
* - Konkrete Klassen: Student, DHStudent, Angestellter, Lehrbeauftragter, Firma
* - Schnittstellen: IKlausurSchreiber, IMitarbeiter
*
* @author Marcel Fix
* @version 1.0
*/
package personen;

107
src/test/TestKlasse.java Normal file
View File

@ -0,0 +1,107 @@
package test;
import personen.*;
import java.util.Arrays;
/**
* TestKlasse für die Programmieraufgabe TINF24CS1
* Diese Klasse testet alle erstellten Klassen und Schnittstellen
*/
public class TestKlasse {
// Testdaten fuer Studenten
static Student[] studentenFeld = {
new Student("Emil"),
new Student("Emil"),
new Student("Armin"),
new Student("Fritz"),
new Student("Ernst"),
new Student("Erna")
};
// Testdaten fuer DH-Studenten
static DHStudent[] dhStudentenFeld = {
new DHStudent("Anton", "TINF23CS1"),
new DHStudent("Michael", "TINF23CS1"),
new DHStudent("Uwe", "TINF23CS1"),
new DHStudent("Christian", "TINF23CS1"),
new DHStudent("Christian", "TINF24CS1"),
new DHStudent("Christiane", "TINF24CS1"),
new DHStudent("Uwe", "TINF24CS1"),
new DHStudent("Michaela", "TINF24CS1")
};
// Testdaten fuer Angestellte
static Angestellter[] angestelltenFeld = {
new Angestellter("Meier", 101000),
new Angestellter("Schulze", 101351),
new Angestellter("Hartmann", 102605),
new Angestellter("Grosskopf", 103731),
new Angestellter("Haudegen", 104566)
};
// Testdaten fuer Lehrbeauftragter
static Lehrbeauftragter[] lehrbeauftragtenFeld = {
new Lehrbeauftragter("Dr. Schlau"),
new Lehrbeauftragter("Prof. Einfallsreich"),
new Lehrbeauftragter("Dipl.-Ing. Pfiffikus"),
new Lehrbeauftragter("OStR Lehrreich")
};
/**
* Konstruktor der TestKlasse
* Hier wird der gesamte Testcode ausgeführt
*/
public TestKlasse() {
// 4.3a
System.out.println("=== 4.3a ===");
Person.druckeAnzahl();
System.out.println("Erklärung: Es sind 19 Personen, weil alle statischen Felder bereits beim Laden der Klasse initialisiert werden.");
System.out.println("Das passiert vor der Ausführung der main-Methode.");
System.out.println();
// 4.3b - HIER EINFÜGEN:
System.out.println("=== 4.3b ===");
Firma firma = new Firma("DH-Partnerfirma GmbH");
firma.druckeName();
System.out.println();
// 4.3c)
System.out.println("=== 4.3c ===");
int mitarbeiterZahl = angestelltenFeld.length + dhStudentenFeld.length;
System.out.println("Mitarbeiterzahl: " + mitarbeiterZahl);
System.out.println();
// 4.3d)
IMitarbeiter[] mitarbeiterFeld = new IMitarbeiter[angestelltenFeld.length + dhStudentenFeld.length];
// Alle Angestellten in das Mitarbeiterfeld kopieren
for (int i = 0; i < angestelltenFeld.length; i++) {
mitarbeiterFeld[i] = angestelltenFeld[i];
}
// Alle DH-Studenten in das Mitarbeiterfeld kopieren
for (int i = 0; i < dhStudentenFeld.length; i++) {
mitarbeiterFeld[angestelltenFeld.length + i] = dhStudentenFeld[i];
}
//4.3e
System.out.println("=== 4.3e ===");
System.out.println("Alle Mitarbeiter arbeiten:");
for (IMitarbeiter mitarbeiter : mitarbeiterFeld) {
mitarbeiter.arbeitenOhneMurren();
}
System.out.println();
// 4.3f
System.out.println("=== 4.3f ===");
System.out.println(Arrays.asList(lehrbeauftragtenFeld));
}
/**
* main-Methode
* Erstellt eine Instanz der TestKlasse
*/
public static void main(String[] args) {
new TestKlasse();
}
}