commit 6559ef501ddb7c433b97ebd1209b0dcad846ea61 Author: J. Neugebauer Date: Sun Oct 3 22:59:52 2021 +0200 Initial commit diff --git a/+libs/sqlite-jdbc-3.36.0.3.jar b/+libs/sqlite-jdbc-3.36.0.3.jar new file mode 100644 index 0000000..5cc7c44 Binary files /dev/null and b/+libs/sqlite-jdbc-3.36.0.3.jar differ diff --git a/DatabaseConnector.java b/DatabaseConnector.java new file mode 100755 index 0000000..1b0ebda --- /dev/null +++ b/DatabaseConnector.java @@ -0,0 +1,148 @@ +import java.sql.*; + +/** + *

+ * Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018 + *

+ *

+ * Klasse DatabaseConnector + *

+ *

+ * Ein Objekt der Klasse DatabaseConnector ermoeglicht die Abfrage und Manipulation + * einer SQLite-Datenbank. + * Beim Erzeugen des Objekts wird eine Datenbankverbindung aufgebaut, so dass + * anschließend SQL-Anweisungen an diese Datenbank gerichtet werden koennen. + *

+ * + * @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule + * @version 2016-01-24 + */ +public class DatabaseConnector{ + private Connection connection; + private QueryResult currentQueryResult = null; + private String message = null; + + /** + * Ein Objekt vom Typ DatabaseConnector wird erstellt, und eine Verbindung zur Datenbank + * wird aufgebaut. Mit den Parametern pIP und pPort werden die IP-Adresse und die + * Port-Nummer uebergeben, unter denen die Datenbank mit Namen pDatabase zu erreichen ist. + * Mit den Parametern pUsername und pPassword werden Benutzername und Passwort fuer die + * Datenbank uebergeben. + */ + public DatabaseConnector(String pIP, int pPort, String pDatabase, String pUsername, String pPassword){ + //Eine Impementierung dieser Schnittstelle fuer SQLite ignoriert pID und pPort, da die Datenbank immer lokal ist. + //Auch pUsername und pPassword werden nicht verwendet, da SQLite sie nicht unterstuetzt. + try { + //Laden der Treiberklasse + Class.forName("org.sqlite.JDBC"); + + //Verbindung herstellen + connection = DriverManager.getConnection("jdbc:sqlite:"+pDatabase); + + } catch (Exception e) { + message = e.getMessage(); + } + } + + /** + * Der Auftrag schickt den im Parameter pSQLStatement enthaltenen SQL-Befehl an die + * Datenbank ab. + * Handelt es sich bei pSQLStatement um einen SQL-Befehl, der eine Ergebnismenge + * liefert, so kann dieses Ergebnis anschließend mit der Methode getCurrentQueryResult + * abgerufen werden. + */ + public void executeStatement(String pSQLStatement){ + //Altes Ergebnis loeschen + currentQueryResult = null; + message = null; + + try { + //Neues Statement erstellen + Statement statement = connection.createStatement(); + + //SQL Anweisung an die DB schicken. + if (statement.execute(pSQLStatement)) { //Fall 1: Es gibt ein Ergebnis + + //Resultset auslesen + ResultSet resultset = statement.getResultSet(); + + //Spaltenanzahl ermitteln + int columnCount = resultset.getMetaData().getColumnCount(); + + //Spaltennamen und Spaltentypen in Felder uebertragen + String[] resultColumnNames = new String[columnCount]; + String[] resultColumnTypes = new String[columnCount]; + for (int i = 0; i < columnCount; i++){ + resultColumnNames[i] = resultset.getMetaData().getColumnLabel(i+1); + resultColumnTypes[i] = resultset.getMetaData().getColumnTypeName(i+1); + } + + //Queue fuer die Zeilen der Ergebnistabelle erstellen + Queue rows = new Queue(); + + //Daten in Queue uebertragen und Zeilen zaehlen + int rowCount = 0; + while (resultset.next()){ + String[] resultrow = new String[columnCount]; + for (int s = 0; s < columnCount; s++){ + resultrow[s] = resultset.getString(s+1); + } + rows.enqueue(resultrow); + rowCount = rowCount + 1; + } + + //Ergebnisfeld erstellen und Zeilen aus Queue uebertragen + String[][] resultData = new String[rowCount][columnCount]; + int j = 0; + while (!rows.isEmpty()){ + resultData[j] = rows.front(); + rows.dequeue(); + j = j + 1; + } + + //Statement schließen und Ergebnisobjekt erstellen + statement.close(); + currentQueryResult = new QueryResult(resultData, resultColumnNames, resultColumnTypes); + + } else { //Fall 2: Es gibt kein Ergebnis. + //Statement ohne Ergebnisobjekt schliessen + statement.close(); + } + + } catch (Exception e) { + //Fehlermeldung speichern + message = e.getMessage(); + } + } + + /** + * Die Anfrage liefert das Ergebnis des letzten mit der Methode executeStatement an + * die Datenbank geschickten SQL-Befehls als Ob-jekt vom Typ QueryResult zurueck. + * Wurde bisher kein SQL-Befehl abgeschickt oder ergab der letzte Aufruf von + * executeStatement keine Ergebnismenge (z.B. bei einem INSERT-Befehl oder einem + * Syntaxfehler), so wird null geliefert. + */ + public QueryResult getCurrentQueryResult(){ + return currentQueryResult; + } + + /** + * Die Anfrage liefert null oder eine Fehlermeldung, die sich jeweils auf die letzte zuvor ausgefuehrte + * Datenbankoperation bezieht. + */ + public String getErrorMessage(){ + return message; + } + + /** + * Die Datenbankverbindung wird geschlossen. + */ + public void close(){ + try{ + connection.close(); + } catch (Exception e) { + message = e.getMessage(); + } + } + +} diff --git a/Datenbanken.Stundenplan.iml b/Datenbanken.Stundenplan.iml new file mode 100644 index 0000000..c7362bf --- /dev/null +++ b/Datenbanken.Stundenplan.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/QueryResult.java b/QueryResult.java new file mode 100755 index 0000000..cb35dc4 --- /dev/null +++ b/QueryResult.java @@ -0,0 +1,76 @@ +/** + *

+ * Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018 + *

+ *

+ * Klasse QueryResult + *

+ *

+ * Ein Objekt der Klasse QueryResult stellt die Ergebnistabelle einer Datenbankanfrage mit Hilfe + * der Klasse DatabaseConnector dar. Objekte dieser Klasse werden nur von der Klasse DatabaseConnector erstellt. + * Die Klasse verfuegt ueber keinen oeffentlichen Konstruktor. + *

+ * + * @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule + * @version 2015-01-31 + */ +public class QueryResult{ + private String[][] data; + private String[] columnNames; + private String[] columnTypes; + + /** + * Paketinterner Konstruktor. + */ + QueryResult(String[][] pData, String[] pColumnNames, String[] pColumnTypes){ + data = pData; + columnNames = pColumnNames; + columnTypes = pColumnTypes; + } + + /** + * Die Anfrage liefert die Eintraege der Ergebnistabelle als zweidimensionales Feld + * vom Typ String. Der erste Index des Feldes stellt die Zeile und der zweite die + * Spalte dar (d.h. Object[zeile][spalte]). + */ + public String[][] getData(){ + return data; + } + + /** + * Die Anfrage liefert die Bezeichner der Spalten der Ergebnistabelle als Feld vom + * Typ String zurueck. + */ + public String[] getColumnNames(){ + return columnNames; + } + + /** + * Die Anfrage liefert die Typenbezeichnung der Spalten der Ergebnistabelle als Feld + * vom Typ String zurueck. Die Bezeichnungen entsprechen den Angaben in der MySQL-Datenbank. + */ + public String[] getColumnTypes(){ + return columnTypes; + } + + /** + * Die Anfrage liefert die Anzahl der Zeilen der Ergebnistabelle als Integer. + */ + public int getRowCount(){ + if (data != null ) + return data.length; + else + return 0; + } + + /** + * Die Anfrage liefert die Anzahl der Spalten der Ergebnistabelle als Integer. + */ + public int getColumnCount(){ + if (data != null && data.length > 0 && data[0] != null) + return data[0].length; + else + return 0; + } + +} \ No newline at end of file diff --git a/Queue.java b/Queue.java new file mode 100755 index 0000000..5a6ef1f --- /dev/null +++ b/Queue.java @@ -0,0 +1,142 @@ +/** + *

+ * Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018 + *

+ *

+ * Generische Klasse Queue + *

+ *

+ * Objekte der generischen Klasse Queue (Warteschlange) verwalten beliebige + * Objekte vom Typ ContentType nach dem First-In-First-Out-Prinzip, d.h., das + * zuerst abgelegte Objekt wird als erstes wieder entnommen. Alle Methoden haben + * eine konstante Laufzeit, unabhaengig von der Anzahl der verwalteten Objekte. + *

+ * + * @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule + * @version Generisch_02 2014-02-21 + */ +public class Queue { + + /* --------- Anfang der privaten inneren Klasse -------------- */ + + private class QueueNode { + + private ContentType content = null; + private QueueNode nextNode = null; + + /** + * Ein neues Objekt vom Typ QueueNode wird erschaffen. + * Der Inhalt wird per Parameter gesetzt. Der Verweis ist leer. + * + * @param pContent das Inhaltselement des Knotens vom Typ ContentType + */ + public QueueNode(ContentType pContent) { + content = pContent; + nextNode = null; + } + + /** + * Der Verweis wird auf das Objekt, das als Parameter uebergeben wird, + * gesetzt. + * + * @param pNext der Nachfolger des Knotens + */ + public void setNext(QueueNode pNext) { + nextNode = pNext; + } + + /** + * Liefert das naechste Element des aktuellen Knotens. + * + * @return das Objekt vom Typ QueueNode, auf das der aktuelle Verweis zeigt + */ + public QueueNode getNext() { + return nextNode; + } + + /** + * Liefert das Inhaltsobjekt des Knotens vom Typ ContentType. + * + * @return das Inhaltsobjekt des Knotens + */ + public ContentType getContent() { + return content; + } + + } + + /* ----------- Ende der privaten inneren Klasse -------------- */ + + private QueueNode head; + private QueueNode tail; + + /** + * Eine leere Schlange wird erzeugt. + * Objekte, die in dieser Schlange verwaltet werden, muessen vom Typ + * ContentType sein. + */ + public Queue() { + head = null; + tail = null; + } + + /** + * Die Anfrage liefert den Wert true, wenn die Schlange keine Objekte enthaelt, + * sonst liefert sie den Wert false. + * + * @return true, falls die Schlange leer ist, sonst false + */ + public boolean isEmpty() { + return head == null; + } + + /** + * Das Objekt pContentType wird an die Schlange angehaengt. + * Falls pContentType gleich null ist, bleibt die Schlange unveraendert. + * + * @param pContent + * das anzuhaengende Objekt vom Typ ContentType + */ + public void enqueue(ContentType pContent) { + if (pContent != null) { + QueueNode newNode = new QueueNode(pContent); + if (this.isEmpty()) { + head = newNode; + tail = newNode; + } else { + tail.setNext(newNode); + tail = newNode; + } + } + } + + /** + * Das erste Objekt wird aus der Schlange entfernt. + * Falls die Schlange leer ist, wird sie nicht veraendert. + */ + public void dequeue() { + if (!this.isEmpty()) { + head = head.getNext(); + if (this.isEmpty()) { + head = null; + tail = null; + } + } + } + + /** + * Die Anfrage liefert das erste Objekt der Schlange. + * Die Schlange bleibt unveraendert. + * Falls die Schlange leer ist, wird null zurueckgegeben. + * + * @return das erste Objekt der Schlange vom Typ ContentType oder null, + * falls die Schlange leer ist + */ + public ContentType front() { + if (this.isEmpty()) { + return null; + } else { + return head.getContent(); + } + } +} diff --git a/SelectionListener.java b/SelectionListener.java new file mode 100644 index 0000000..4687960 --- /dev/null +++ b/SelectionListener.java @@ -0,0 +1,13 @@ +/** + * Listener-INterface, um auf Änderungen der Auswahlboxen im GUI zu reagieren. + */ +public interface SelectionListener { + + /** + * Wird aufgerufen, wenn sich die Auswahl ändert. + * @param pList Name der Auswahlbox + * @param pNewValue Neuer Wert + */ + public void selectionChanged(String pList, String pNewValue ); + +} diff --git a/Stundenplan.java b/Stundenplan.java new file mode 100644 index 0000000..8d878a3 --- /dev/null +++ b/Stundenplan.java @@ -0,0 +1,100 @@ +import javax.swing.*; +import java.awt.*; + +public class Stundenplan implements SelectionListener { + + /** + * Main-Methode um das Programm (außerhalb von BlueJ) zu starten. + * + * @param args + */ + public static void main(String[] args) { + // Setzen des "Look & Feel" des Programms + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { + } + + // Programm starten + new Stundenplan(); + } + + // Instanz des GUI des Programms + private StundenplanGUI gui; + + // Instanz der Datenbankverbindung + private DatabaseConnector dbc; + + /** + * Konstruktor des Hauptprogramms + */ + public Stundenplan() { + // Erstellen des GUIs + gui = new StundenplanGUI(); + + // Aufbau der Datenbankverbindung + dbc = new DatabaseConnector("", 0, "stundenplan.db", "", ""); + QueryResult r; + + // Lehrer abfragen und ein Auswahlfeld erstellen, dass in der + // GUI angezeigt wird, um den angezeigten Stundenplan anzupassen + dbc.executeStatement("SELECT kuerzel FROM lehrer"); + r = dbc.getCurrentQueryResult(); + String[] teachers = new String[r.getRowCount()]; + for (int i = 0; i < r.getRowCount(); i++) { + teachers[i] = r.getData()[i][0]; + } + gui.addFilter("Lehrer", teachers); + + // GUI anzeigen und Verhalten bei Interaktion festlegen + gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + gui.addSelectionListener(this); // GUI ruft Methode selectionChanged auf, wenn sich eine Auswahlbox ändert. + gui.setLocationRelativeTo(null); + gui.setVisible(true); + } + + /** + * Methode um auf Änderungen in der GUi zu reagieren. Sobald der nutzer die + * Auswahl ändert, wird diese Methode aufgerufen. Der erste Parameter ist der + * Name der Auswahlliste, die sich geändert hat (erster Parameter von + * {@link StundenplanGUI#addFilter(String, String[])} oben) und der zweite ist + * der neue Wert der Auswahl. + * + * @param pList Name der Auswahlliste + * @param pNewValue Neuer Wert der Auswahl + */ + @Override + public void selectionChanged(String pList, String pNewValue) { + if (pList == "Lehrer") { + // Zuerst alle bisherigen Stunden aus der GUI entfernen + gui.removeAllLessons(); + + // Neue Daten aus der Datenbank abfragen. + // Hier gefakte Daten, die Struktur der Datenbank ist nicht vorgegeben. + dbc.executeStatement("SELECT 0,'Q2','405',kuerzel,0,0,'Informatik',-16711936 FROM lehrer WHERE kuerzel = '" + pNewValue + "'"); + QueryResult r = dbc.getCurrentQueryResult(); + + // Falls es ein Ergebnis gibt ... + if (r != null) { + String[][] data = r.getData(); + + // Neue Stunden in die GUI schreiben + for (int i = 0; i < data.length; i++) { + gui.addLesson( + Integer.parseInt(data[i][4]), // Spalte im Plan (0=Montag, ... ,4=Freitag) + Integer.parseInt(data[i][5]), // Zeile im Plan (0=1. Stunde, ... ,9=10. Stunde) + data[i][6], // Titel + "Raum " + data[i][2], // Untertitel + data[i][1], // Beschreibungstext + data[i][3], // Fußzeile + new Color(Integer.parseInt(data[i][7])) // Farbe (Objekt der Klasse Color) + ); + } + + // GUI-Fenster neu zeichnen, um neue Elemente anzuzeigen. + gui.revalidate(); + gui.repaint(); + } + } + } +} diff --git a/StundenplanGUI.java b/StundenplanGUI.java new file mode 100644 index 0000000..85b5380 --- /dev/null +++ b/StundenplanGUI.java @@ -0,0 +1,265 @@ +import javax.swing.*; +import javax.swing.border.LineBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Hashtable; + +/** + * GUI für das Stundenplanprogramm. + */ +public class StundenplanGUI extends JFrame implements ActionListener { + + // Initiale Größe des Fensters + public static final int FRAME_WIDTH = 800; + public static final int FRAME_HEIGHT = 600; + + // Schriftarten + public static Font fHeader = new Font(Font.SANS_SERIF, Font.BOLD, 12); + public static Font fTitle = new Font(Font.SANS_SERIF, Font.BOLD, 11); + public static Font fSubtitle = new Font(Font.SANS_SERIF, Font.PLAIN, 8); + public static Font fText = new Font(Font.SANS_SERIF, Font.PLAIN, 9); + public static Font fFooter = new Font(Font.SANS_SERIF, Font.ITALIC, 8); + + + // Der Listener, der bei Änderungen informiert wird. + private SelectionListener selectionListener; + + // Caches für Stunden und Filter + private Hashtable filters; + private Hashtable lessons; + + // Panels für die Bereiche des GUIs + private JPanel jpPlan, jpSidebar; + + /** + * Erstellt ein neues GUI, zeigt es aber noch nicht an. Das Hauptprogramm + * muss dies explizit mit {@link #setVisible(boolean)} tun. + */ + public StundenplanGUI() { + filters = new Hashtable<>(); + lessons = new Hashtable<>(); + + this.setSize(FRAME_WIDTH, FRAME_HEIGHT); + this.addComponents(); + } + + /** + * Fügt der Seitenleister eine neue Auswahlbox hinzu. Der Name wird bei + * Änderungen an den {@link SelectionListener} übergeben, um verschiedene + * Boxen unterscheiden zu können. + * @param pName Name des Filters + * @param pOptions Mögliche Optionen + */ + public void addFilter(String pName, String[] pOptions) { + JPanel jpFilter = new JPanel(); + jpFilter.setLayout(new BorderLayout()); + jpFilter.setBackground(jpSidebar.getBackground()); + jpFilter.setPreferredSize(new Dimension(jpSidebar.getPreferredSize().width, 50)); + jpFilter.add(makeLabel(pName, fHeader), BorderLayout.NORTH); + + JComboBox jcbFilter = new JComboBox(pOptions); + jcbFilter.setName(pName); + jcbFilter.addActionListener(this); + jpFilter.add(jcbFilter, BorderLayout.CENTER); + + filters.put(pName, jpFilter); + jpSidebar.add(jpFilter); + } + + /** + * Entfernt die Auswahlbox mit dem angegebnen Namen aus der Seitenleiste. + * @param pName + */ + public void removeFilter(String pName) { + if (filters.containsKey(pName)) { + JPanel jpFilter = filters.get(pName); + jpSidebar.remove(jpFilter); + filters.remove(pName); + } + } + + /** + * Entfernt alle Auswahlboxen aus der Seitenleiste. + */ + public void removeAllFilters() { + jpSidebar.removeAll(); + } + + /** + * Fügt eine neue Stunde in den Plan ein. Exisitiert in der angegebenen Zelle + * schon eine Stunde, wird diese entfernt und durch die neue ersetzt. + * + * Eine Stunde in der GUI hat verschiedene Bereiche, in denen Informationen + * (Text) untergebracht werden können, sowie eine Farbe. + * + * Nachdem eine oder mehrere Stunden hinzugefügt wurden, sollte das Fenster mit + * {@link JFrame#revalidate()} und {@link JFrame#repaint()} neu gezeichnet werden. + * + * @param pCol Spaltenindex (0=Montag, ..., 4=Freitag) + * @param pRow Zeilenindex (0=1. Stunde, ..., 9=10. Stunde) + * @param pTitle Überschrift + * @param pSubtitle Untertitel + * @param pText Beschreibung + * @param pFooter Fußzeile + * @param pColor Farbe der Stunde im Plan + */ + public void addLesson(int pCol, int pRow, String pTitle, String pSubtitle, String pText, String pFooter, Color pColor) { + removeLesson(pCol, pRow); + + Color bg = new Color(pColor.getRed(), pColor.getGreen(), pColor.getBlue(), 128); + + JPanel jpLesson = new JPanel(); + jpLesson.setBackground(bg); + jpLesson.setForeground(pColor); + jpLesson.setBorder(new LineBorder(pColor, 2, true)); + jpLesson.setLayout(new BoxLayout(jpLesson, BoxLayout.Y_AXIS)); + + JLabel jlTitle = new JLabel(pTitle); + jlTitle.setFont(fTitle); + jpLesson.add(jlTitle); + + JLabel jlSubtitle = new JLabel(pSubtitle); + jlSubtitle.setFont(fSubtitle); + jpLesson.add(jlSubtitle); + + JLabel jlText = new JLabel(pText); + jlText.setFont(fText); + jpLesson.add(jlText); + + JLabel jlFooter = new JLabel(pFooter); + jlFooter.setFont(fFooter); + jpLesson.add(jlFooter); + + + GridBagConstraints c = new GridBagConstraints(); + c.gridx = pCol + 1; + c.gridy = pRow + 1; + c.weightx = 0.5; + c.weighty = 0.5; + c.insets = new Insets(2, 4, 2, 4); + c.fill = GridBagConstraints.BOTH; + + lessons.put(new Point(pCol, pRow), jpLesson); + jpPlan.add(jpLesson, c); + } + + /** + * Entfernt die Stunde aus der angebenen Zelle. + * @param pCol Spaltenindex (0=Montag, ..., 4=Freitag) + * @param pRow Zeilenindex (0=1. Stunde, ..., 9=10. Stunde) + */ + public void removeLesson(int pCol, int pRow) { + Point key = new Point(pCol, pRow); + JPanel jpLesson = lessons.get(key); + if (jpLesson != null) { + jpPlan.remove(jpLesson); + lessons.remove(key); + } + } + + /** + * Entfernt alle derzeit angezeigten Stunden aus dem GUI. + */ + public void removeAllLessons() { + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 5; j++) { + removeLesson(i, j); + } + } + } + + /** + * Setzt den Listener, der über Änderungen der Auswahlboxen informiert wird. + * @param pSelectionListener + */ + public void addSelectionListener(SelectionListener pSelectionListener) { + this.selectionListener = pSelectionListener; + } + + /** + * Leitet die Änderungen der Auswahlboxen an den {@link SelectionListener} + * weiter. + * @param pActionEvent + */ + public void actionPerformed(ActionEvent pActionEvent) { + if (this.selectionListener != null) { + JComboBox source = ((JComboBox) pActionEvent.getSource()); + + String newValue = (String) source.getSelectedItem(); + String sourceName = source.getName(); + + this.selectionListener.selectionChanged(sourceName, newValue); + } + } + + + /** + * Fügt dem GUI die Standard-Komponenten hinzu. + */ + private void addComponents() { + this.setLayout(new BorderLayout()); + + // Seitenleiste für Filter (Auswahlboxen) + jpSidebar = new JPanel(); + jpSidebar.setBackground(Color.LIGHT_GRAY); + jpSidebar.setPreferredSize(new Dimension(100, FRAME_HEIGHT)); + this.add(jpSidebar, BorderLayout.LINE_START); + + // Hauptbereich für den Stundenplan + jpPlan = new JPanel(); + this.add(jpPlan, BorderLayout.CENTER); + jpPlan.setLayout(new GridBagLayout()); + jpPlan.add(new JPanel()); + + // Überschriften für die Spalten (Wochentage) + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 1; + c.gridy = 0; + c.fill = GridBagConstraints.NONE; + c.weightx = 0.5; + c.weighty = 0.2; + jpPlan.add(makeLabel("Montag", fHeader), c); + c.gridx++; + jpPlan.add(makeLabel("Dienstag", fHeader), c); + c.gridx++; + jpPlan.add(makeLabel("Mittwoch", fHeader), c); + c.gridx++; + jpPlan.add(makeLabel("Donnerstag", fHeader), c); + c.gridx++; + jpPlan.add(makeLabel("Freitag", fHeader), c); + + // Überschriften für die Zeilen (Stunden) + c = new GridBagConstraints(); + c.gridx = 0; + c.fill = GridBagConstraints.NONE; + c.weightx = 0.2; + c.weighty = 0.5; + for (int i = 0; i < 10; i++) { + c.gridy = i + 1; + jpPlan.add(makeLabel((i + 1) + ". Stunde", fHeader), c); + } + } + + /** + * Erzeugt ein Text-Label mit der Standard-Schrift und dem angegebenen Text. + * @param pLabel + * @return + */ + private JLabel makeLabel(String pLabel) { + return makeLabel(pLabel, fText); + } + + /** + * Erzeugt ein Text-Label mit der angegebenen Schrift und dem Text. + * @param pLabel + * @param pFont + * @return + */ + private JLabel makeLabel(String pLabel, Font pFont) { + JLabel jlLabel = new JLabel(pLabel); + jlLabel.setFont(pFont); + return jlLabel; + } + +} diff --git a/klassen.csv b/klassen.csv new file mode 100644 index 0000000..dd531f9 --- /dev/null +++ b/klassen.csv @@ -0,0 +1,25 @@ +bezeichner,jahrgang,zug +05a,5,a +05b,5,b +05c,5,c +05d,5,d +06a,6,a +06b,6,b +06c,6,c +06d,6,d +07a,7,a +07b,7,b +07c,7,c +07d,7,d +08a,8,a +08b,8,b +08c,8,c +08d,8,d +09a,9,a +09b,9,b +09c,9,c +09d,9,d +EFa,10,a +EFb,10,b +EFc,10,c +EFd,10,d diff --git a/lehrer.csv b/lehrer.csv new file mode 100644 index 0000000..4b30e0f --- /dev/null +++ b/lehrer.csv @@ -0,0 +1,98 @@ +Kuerzel,Vorname,Nachname +bar,Barner,Angela +beh,Behlke,Christina +bhz,Buchholz-Neidhardt,Ilka +bmr,Burmeister,Felix +bod,Bodeck,Jörn +brs,Bruns,Maren +bru,Brune,Kerstin +buk,Bukarz,Julia Maria +buo,Bucko,Anna +det,Deters,Svenja +dfe,Diefenbach,Frank +dsl,Diesel,Stefan +est,Ester-Burschel,Barbara +fel,Felsch,Michael +fis,Fischer,Silke +frd,Freund,Sarah +fri,Fricke,Jan Dennis +ger,Gerke,Timo +gor,Gorges,Kristin +göt,Göttner,Wendy +grd,Gradowski von,Thomas +gru,Grube,Viktoria +gry,Generotzky,Constanze +hel,Held,Joachim +hob,Hoberg,Annika +hof,Hofmann,Jonas +hök,Höke,Sandra +hor,Hornig,Manuel +htn,Horstmann,Anne +imm,Immel,Bettina +jka,Jutka,Sabine +kah,Kahrau,Larissa +kch,Koch,Britta +khm,Kuhlmann,Florian +kop,Kropp,Elke +kpp,Knüppel,Christoph +kse,Krause,Kerstin +ksg,Klausing,Susanne +kth,Kreth,Maren +ldr,Linder,Sarah +leh,Lehmann,Daria +lin,Lindemann,Armin +lÜb,Lübbecke,Annika +mab,Maybaum,Regina +mei,Meise-Amthauer,Sylvia +mrg,Müller-Goerke,Ulrike +msl,Müller-Slanitz,Nadja +müh,Mühlenhoff,Paul +ngb,Neugebauer,Jonas +nid,Niedworok,Christian +nkp,Niekamp,Andrea +osm,Ostmeier,Tim +par,Paarmann,Oliver +pie,Pieper,Jennifer +plv,Pehlivan,Dervis +pör,Pörschke-Watt,Inga Kristin +pui,Puissant,Susanne +rak,Raach-Kallmer,Roswitha +rbg,Randenborgh van,Christian +rc,Reckelkamm,Bernd +rde,Rohde,Christine +rdt,Randt,Achim +rix,Rixe,Jeanette +rm,Redmann,Bastian +rup,Rupik,Karolina Beata +rüt,Rüthemann,Gunnar +sar,Sauer,Lisa +sat,Straetmanns,Florian +sdt,Schmidt,Moritz +sei,Seidenberg,Kristina +shz,Scholz,Nicole +sim,Simon-Edsen,Katja +slg,Stölting,Heike +smr,Schollmeier,David +snk,Schöneck,Gudrun-Verena +sön,Schöne,Claudia +spr,Sprenger,René +sra,Schramm,Saskia +stf,Steffen,Wiebke +stm,Strotherm,Janine +sto,Storz,Martin +str,Struwe,Simone +tes,Theessen,Johanna +the,Theeßen,Daniel +tsi,Tsironi,Paraskevi +ulr,Ulrich,Elias +vhs,Viehhauser,Werner +wab,Wabnitz,Sandra +wae,Wagner-Euteneier,Ina +wag,Wagner,Susanne +weh,Wehry,Martin +wel,Welland,Tanja +wen,Wendler,Jessica +wig,Wieling,Petra +wlm,Wiegelmann,Karen +wss,Weiß,David +zuc,Zucchini,Laura diff --git a/raeume.csv b/raeume.csv new file mode 100644 index 0000000..ce3f077 --- /dev/null +++ b/raeume.csv @@ -0,0 +1,101 @@ +nummer,etage +101,1 +102,1 +103,1 +104,1 +105,1 +106,1 +107,1 +108,1 +109,1 +110,1 +111,1 +112,1 +113,1 +114,1 +115,1 +116,1 +117,1 +118,1 +119,1 +120,1 +121,1 +122,1 +123,1 +124,1 +201,2 +202,2 +203,2 +204,2 +205,2 +206,2 +207,2 +208,2 +209,2 +210,2 +211,2 +212,2 +213,2 +214,2 +215,2 +216,2 +217,2 +218,2 +219,2 +220,2 +221,2 +222,2 +223,2 +224,2 +301,3 +302,3 +303,3 +304,3 +305,3 +306,3 +307,3 +308,3 +309,3 +310,3 +311,3 +312,3 +313,3 +314,3 +315,3 +316,3 +317,3 +318,3 +319,3 +320,3 +321,3 +322,3 +323,3 +324,3 +401,4 +402,4 +403,4 +404,4 +405,4 +406,4 +407,4 +408,4 +409,4 +410,4 +411,4 +412,4 +413,4 +414,4 +415,4 +416,4 +417,4 +418,4 +419,4 +420,4 +421,4 +422,4 +423,4 +424,4 +501,5 +033a,0 +033b,0 +025,0 diff --git a/stundenplan.db b/stundenplan.db new file mode 100644 index 0000000..9973b64 Binary files /dev/null and b/stundenplan.db differ diff --git a/stundenplan.sql b/stundenplan.sql new file mode 100644 index 0000000..2e15bc3 --- /dev/null +++ b/stundenplan.sql @@ -0,0 +1,243 @@ +BEGIN TRANSACTION; +DROP TABLE IF EXISTS "klassen"; +CREATE TABLE IF NOT EXISTS "klassen" ( + "bezeichner" TEXT NOT NULL, + "jahrgang" INTEGER, + "zug" TEXT, + PRIMARY KEY("bezeichner") +); +DROP TABLE IF EXISTS "lehrer"; +CREATE TABLE IF NOT EXISTS "lehrer" ( + "Kuerzel" TEXT NOT NULL, + "Vorname" TEXT, + "Nachname" TEXT, + PRIMARY KEY("Kuerzel") +); +DROP TABLE IF EXISTS "raeume"; +CREATE TABLE IF NOT EXISTS "raeume" ( + "nummer" TEXT NOT NULL, + "etage" INTEGER, + PRIMARY KEY("nummer") +); +INSERT INTO "klassen" VALUES ('05a',5,'a'); +INSERT INTO "klassen" VALUES ('05b',5,'b'); +INSERT INTO "klassen" VALUES ('05c',5,'c'); +INSERT INTO "klassen" VALUES ('05d',5,'d'); +INSERT INTO "klassen" VALUES ('06a',6,'a'); +INSERT INTO "klassen" VALUES ('06b',6,'b'); +INSERT INTO "klassen" VALUES ('06c',6,'c'); +INSERT INTO "klassen" VALUES ('06d',6,'d'); +INSERT INTO "klassen" VALUES ('07a',7,'a'); +INSERT INTO "klassen" VALUES ('07b',7,'b'); +INSERT INTO "klassen" VALUES ('07c',7,'c'); +INSERT INTO "klassen" VALUES ('07d',7,'d'); +INSERT INTO "klassen" VALUES ('08a',8,'a'); +INSERT INTO "klassen" VALUES ('08b',8,'b'); +INSERT INTO "klassen" VALUES ('08c',8,'c'); +INSERT INTO "klassen" VALUES ('08d',8,'d'); +INSERT INTO "klassen" VALUES ('09a',9,'a'); +INSERT INTO "klassen" VALUES ('09b',9,'b'); +INSERT INTO "klassen" VALUES ('09c',9,'c'); +INSERT INTO "klassen" VALUES ('09d',9,'d'); +INSERT INTO "klassen" VALUES ('EFa',10,'a'); +INSERT INTO "klassen" VALUES ('EFb',10,'b'); +INSERT INTO "klassen" VALUES ('EFc',10,'c'); +INSERT INTO "klassen" VALUES ('EFd',10,'d'); +INSERT INTO "lehrer" VALUES ('bar','Barner','Angela'); +INSERT INTO "lehrer" VALUES ('beh','Behlke','Christina'); +INSERT INTO "lehrer" VALUES ('bhz','Buchholz-Neidhardt','Ilka'); +INSERT INTO "lehrer" VALUES ('bmr','Burmeister','Felix'); +INSERT INTO "lehrer" VALUES ('bod','Bodeck','Jörn'); +INSERT INTO "lehrer" VALUES ('brs','Bruns','Maren'); +INSERT INTO "lehrer" VALUES ('bru','Brune','Kerstin'); +INSERT INTO "lehrer" VALUES ('buk','Bukarz','Julia Maria'); +INSERT INTO "lehrer" VALUES ('buo','Bucko','Anna'); +INSERT INTO "lehrer" VALUES ('det','Deters','Svenja'); +INSERT INTO "lehrer" VALUES ('dfe','Diefenbach','Frank'); +INSERT INTO "lehrer" VALUES ('dsl','Diesel','Stefan'); +INSERT INTO "lehrer" VALUES ('est','Ester-Burschel','Barbara'); +INSERT INTO "lehrer" VALUES ('fel','Felsch','Michael'); +INSERT INTO "lehrer" VALUES ('fis','Fischer','Silke'); +INSERT INTO "lehrer" VALUES ('frd','Freund','Sarah'); +INSERT INTO "lehrer" VALUES ('fri','Fricke','Jan Dennis'); +INSERT INTO "lehrer" VALUES ('ger','Gerke','Timo'); +INSERT INTO "lehrer" VALUES ('gor','Gorges','Kristin'); +INSERT INTO "lehrer" VALUES ('göt','Göttner','Wendy'); +INSERT INTO "lehrer" VALUES ('grd','Gradowski von','Thomas'); +INSERT INTO "lehrer" VALUES ('gru','Grube','Viktoria'); +INSERT INTO "lehrer" VALUES ('gry','Generotzky','Constanze'); +INSERT INTO "lehrer" VALUES ('hel','Held','Joachim'); +INSERT INTO "lehrer" VALUES ('hob','Hoberg','Annika'); +INSERT INTO "lehrer" VALUES ('hof','Hofmann','Jonas'); +INSERT INTO "lehrer" VALUES ('hök','Höke','Sandra'); +INSERT INTO "lehrer" VALUES ('hor','Hornig','Manuel'); +INSERT INTO "lehrer" VALUES ('htn','Horstmann','Anne'); +INSERT INTO "lehrer" VALUES ('imm','Immel','Bettina'); +INSERT INTO "lehrer" VALUES ('jka','Jutka','Sabine'); +INSERT INTO "lehrer" VALUES ('kah','Kahrau','Larissa'); +INSERT INTO "lehrer" VALUES ('kch','Koch','Britta'); +INSERT INTO "lehrer" VALUES ('khm','Kuhlmann','Florian'); +INSERT INTO "lehrer" VALUES ('kop','Kropp','Elke'); +INSERT INTO "lehrer" VALUES ('kpp','Knüppel','Christoph'); +INSERT INTO "lehrer" VALUES ('kse','Krause','Kerstin'); +INSERT INTO "lehrer" VALUES ('ksg','Klausing','Susanne'); +INSERT INTO "lehrer" VALUES ('kth','Kreth','Maren'); +INSERT INTO "lehrer" VALUES ('ldr','Linder','Sarah'); +INSERT INTO "lehrer" VALUES ('leh','Lehmann','Daria'); +INSERT INTO "lehrer" VALUES ('lin','Lindemann','Armin'); +INSERT INTO "lehrer" VALUES ('lÜb','Lübbecke','Annika'); +INSERT INTO "lehrer" VALUES ('mab','Maybaum','Regina'); +INSERT INTO "lehrer" VALUES ('mei','Meise-Amthauer','Sylvia'); +INSERT INTO "lehrer" VALUES ('mrg','Müller-Goerke','Ulrike'); +INSERT INTO "lehrer" VALUES ('msl','Müller-Slanitz','Nadja'); +INSERT INTO "lehrer" VALUES ('müh','Mühlenhoff','Paul'); +INSERT INTO "lehrer" VALUES ('ngb','Neugebauer','Jonas'); +INSERT INTO "lehrer" VALUES ('nid','Niedworok','Christian'); +INSERT INTO "lehrer" VALUES ('nkp','Niekamp','Andrea'); +INSERT INTO "lehrer" VALUES ('osm','Ostmeier','Tim'); +INSERT INTO "lehrer" VALUES ('par','Paarmann','Oliver'); +INSERT INTO "lehrer" VALUES ('pie','Pieper','Jennifer'); +INSERT INTO "lehrer" VALUES ('plv','Pehlivan','Dervis'); +INSERT INTO "lehrer" VALUES ('pör','Pörschke-Watt','Inga Kristin'); +INSERT INTO "lehrer" VALUES ('pui','Puissant','Susanne'); +INSERT INTO "lehrer" VALUES ('rak','Raach-Kallmer','Roswitha'); +INSERT INTO "lehrer" VALUES ('rbg','Randenborgh van','Christian'); +INSERT INTO "lehrer" VALUES ('rc','Reckelkamm','Bernd'); +INSERT INTO "lehrer" VALUES ('rde','Rohde','Christine'); +INSERT INTO "lehrer" VALUES ('rdt','Randt','Achim'); +INSERT INTO "lehrer" VALUES ('rix','Rixe','Jeanette'); +INSERT INTO "lehrer" VALUES ('rm','Redmann','Bastian'); +INSERT INTO "lehrer" VALUES ('rup','Rupik','Karolina Beata'); +INSERT INTO "lehrer" VALUES ('rüt','Rüthemann','Gunnar'); +INSERT INTO "lehrer" VALUES ('sar','Sauer','Lisa'); +INSERT INTO "lehrer" VALUES ('sat','Straetmanns','Florian'); +INSERT INTO "lehrer" VALUES ('sdt','Schmidt','Moritz'); +INSERT INTO "lehrer" VALUES ('sei','Seidenberg','Kristina'); +INSERT INTO "lehrer" VALUES ('shz','Scholz','Nicole'); +INSERT INTO "lehrer" VALUES ('sim','Simon-Edsen','Katja'); +INSERT INTO "lehrer" VALUES ('slg','Stölting','Heike'); +INSERT INTO "lehrer" VALUES ('smr','Schollmeier','David'); +INSERT INTO "lehrer" VALUES ('snk','Schöneck','Gudrun-Verena'); +INSERT INTO "lehrer" VALUES ('sön','Schöne','Claudia'); +INSERT INTO "lehrer" VALUES ('spr','Sprenger','René'); +INSERT INTO "lehrer" VALUES ('sra','Schramm','Saskia'); +INSERT INTO "lehrer" VALUES ('stf','Steffen','Wiebke'); +INSERT INTO "lehrer" VALUES ('stm','Strotherm','Janine'); +INSERT INTO "lehrer" VALUES ('sto','Storz','Martin'); +INSERT INTO "lehrer" VALUES ('str','Struwe','Simone'); +INSERT INTO "lehrer" VALUES ('tes','Theessen','Johanna'); +INSERT INTO "lehrer" VALUES ('the','Theeßen','Daniel'); +INSERT INTO "lehrer" VALUES ('tsi','Tsironi','Paraskevi'); +INSERT INTO "lehrer" VALUES ('ulr','Ulrich','Elias'); +INSERT INTO "lehrer" VALUES ('vhs','Viehhauser','Werner'); +INSERT INTO "lehrer" VALUES ('wab','Wabnitz','Sandra'); +INSERT INTO "lehrer" VALUES ('wae','Wagner-Euteneier','Ina'); +INSERT INTO "lehrer" VALUES ('wag','Wagner','Susanne'); +INSERT INTO "lehrer" VALUES ('weh','Wehry','Martin'); +INSERT INTO "lehrer" VALUES ('wel','Welland','Tanja'); +INSERT INTO "lehrer" VALUES ('wen','Wendler','Jessica'); +INSERT INTO "lehrer" VALUES ('wig','Wieling','Petra'); +INSERT INTO "lehrer" VALUES ('wlm','Wiegelmann','Karen'); +INSERT INTO "lehrer" VALUES ('wss','Weiß','David'); +INSERT INTO "lehrer" VALUES ('zuc','Zucchini','Laura'); +INSERT INTO "raeume" VALUES ('101',1); +INSERT INTO "raeume" VALUES ('102',1); +INSERT INTO "raeume" VALUES ('103',1); +INSERT INTO "raeume" VALUES ('104',1); +INSERT INTO "raeume" VALUES ('105',1); +INSERT INTO "raeume" VALUES ('106',1); +INSERT INTO "raeume" VALUES ('107',1); +INSERT INTO "raeume" VALUES ('108',1); +INSERT INTO "raeume" VALUES ('109',1); +INSERT INTO "raeume" VALUES ('110',1); +INSERT INTO "raeume" VALUES ('111',1); +INSERT INTO "raeume" VALUES ('112',1); +INSERT INTO "raeume" VALUES ('113',1); +INSERT INTO "raeume" VALUES ('114',1); +INSERT INTO "raeume" VALUES ('115',1); +INSERT INTO "raeume" VALUES ('116',1); +INSERT INTO "raeume" VALUES ('117',1); +INSERT INTO "raeume" VALUES ('118',1); +INSERT INTO "raeume" VALUES ('119',1); +INSERT INTO "raeume" VALUES ('120',1); +INSERT INTO "raeume" VALUES ('121',1); +INSERT INTO "raeume" VALUES ('122',1); +INSERT INTO "raeume" VALUES ('123',1); +INSERT INTO "raeume" VALUES ('124',1); +INSERT INTO "raeume" VALUES ('201',2); +INSERT INTO "raeume" VALUES ('202',2); +INSERT INTO "raeume" VALUES ('203',2); +INSERT INTO "raeume" VALUES ('204',2); +INSERT INTO "raeume" VALUES ('205',2); +INSERT INTO "raeume" VALUES ('206',2); +INSERT INTO "raeume" VALUES ('207',2); +INSERT INTO "raeume" VALUES ('208',2); +INSERT INTO "raeume" VALUES ('209',2); +INSERT INTO "raeume" VALUES ('210',2); +INSERT INTO "raeume" VALUES ('211',2); +INSERT INTO "raeume" VALUES ('212',2); +INSERT INTO "raeume" VALUES ('213',2); +INSERT INTO "raeume" VALUES ('214',2); +INSERT INTO "raeume" VALUES ('215',2); +INSERT INTO "raeume" VALUES ('216',2); +INSERT INTO "raeume" VALUES ('217',2); +INSERT INTO "raeume" VALUES ('218',2); +INSERT INTO "raeume" VALUES ('219',2); +INSERT INTO "raeume" VALUES ('220',2); +INSERT INTO "raeume" VALUES ('221',2); +INSERT INTO "raeume" VALUES ('222',2); +INSERT INTO "raeume" VALUES ('223',2); +INSERT INTO "raeume" VALUES ('224',2); +INSERT INTO "raeume" VALUES ('301',3); +INSERT INTO "raeume" VALUES ('302',3); +INSERT INTO "raeume" VALUES ('303',3); +INSERT INTO "raeume" VALUES ('304',3); +INSERT INTO "raeume" VALUES ('305',3); +INSERT INTO "raeume" VALUES ('306',3); +INSERT INTO "raeume" VALUES ('307',3); +INSERT INTO "raeume" VALUES ('308',3); +INSERT INTO "raeume" VALUES ('309',3); +INSERT INTO "raeume" VALUES ('310',3); +INSERT INTO "raeume" VALUES ('311',3); +INSERT INTO "raeume" VALUES ('312',3); +INSERT INTO "raeume" VALUES ('313',3); +INSERT INTO "raeume" VALUES ('314',3); +INSERT INTO "raeume" VALUES ('315',3); +INSERT INTO "raeume" VALUES ('316',3); +INSERT INTO "raeume" VALUES ('317',3); +INSERT INTO "raeume" VALUES ('318',3); +INSERT INTO "raeume" VALUES ('319',3); +INSERT INTO "raeume" VALUES ('320',3); +INSERT INTO "raeume" VALUES ('321',3); +INSERT INTO "raeume" VALUES ('322',3); +INSERT INTO "raeume" VALUES ('323',3); +INSERT INTO "raeume" VALUES ('324',3); +INSERT INTO "raeume" VALUES ('401',4); +INSERT INTO "raeume" VALUES ('402',4); +INSERT INTO "raeume" VALUES ('403',4); +INSERT INTO "raeume" VALUES ('404',4); +INSERT INTO "raeume" VALUES ('405',4); +INSERT INTO "raeume" VALUES ('406',4); +INSERT INTO "raeume" VALUES ('407',4); +INSERT INTO "raeume" VALUES ('408',4); +INSERT INTO "raeume" VALUES ('409',4); +INSERT INTO "raeume" VALUES ('410',4); +INSERT INTO "raeume" VALUES ('411',4); +INSERT INTO "raeume" VALUES ('412',4); +INSERT INTO "raeume" VALUES ('413',4); +INSERT INTO "raeume" VALUES ('414',4); +INSERT INTO "raeume" VALUES ('415',4); +INSERT INTO "raeume" VALUES ('416',4); +INSERT INTO "raeume" VALUES ('417',4); +INSERT INTO "raeume" VALUES ('418',4); +INSERT INTO "raeume" VALUES ('419',4); +INSERT INTO "raeume" VALUES ('420',4); +INSERT INTO "raeume" VALUES ('421',4); +INSERT INTO "raeume" VALUES ('422',4); +INSERT INTO "raeume" VALUES ('423',4); +INSERT INTO "raeume" VALUES ('424',4); +INSERT INTO "raeume" VALUES ('501',5); +INSERT INTO "raeume" VALUES ('033a',0); +INSERT INTO "raeume" VALUES ('033b',0); +INSERT INTO "raeume" VALUES ('025',0); +COMMIT;