Initial commit

This commit is contained in:
ngb 2021-10-03 22:59:52 +02:00
commit 6559ef501d
13 changed files with 1223 additions and 0 deletions

Binary file not shown.

148
DatabaseConnector.java Executable file
View File

@ -0,0 +1,148 @@
import java.sql.*;
/**
* <p>
* Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018
* </p>
* <p>
* Klasse DatabaseConnector
* </p>
* <p>
* 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.
* </p>
*
* @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<String[]> rows = new Queue<String[]>();
//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();
}
}
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="sqlite-jdbc-3.36.0.3" level="project" />
</component>
</module>

76
QueryResult.java Executable file
View File

@ -0,0 +1,76 @@
/**
* <p>
* Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018
* </p>
* <p>
* Klasse QueryResult
* </p>
* <p>
* 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.
* </p>
*
* @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;
}
}

142
Queue.java Executable file
View File

@ -0,0 +1,142 @@
/**
* <p>
* Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2018
* </p>
* <p>
* Generische Klasse Queue<ContentType>
* </p>
* <p>
* 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.
* </p>
*
* @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule
* @version Generisch_02 2014-02-21
*/
public class Queue<ContentType> {
/* --------- Anfang der privaten inneren Klasse -------------- */
private class QueueNode {
private ContentType content = null;
private QueueNode nextNode = null;
/**
* Ein neues Objekt vom Typ QueueNode<ContentType> 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();
}
}
}

13
SelectionListener.java Normal file
View File

@ -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 );
}

100
Stundenplan.java Normal file
View File

@ -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();
}
}
}
}

265
StundenplanGUI.java Normal file
View File

@ -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<String, JPanel> filters;
private Hashtable<Point, JPanel> 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<String> jcbFilter = new JComboBox<String>(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<String> source = ((JComboBox<String>) 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;
}
}

25
klassen.csv Normal file
View File

@ -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
1 bezeichner jahrgang zug
2 05a 5 a
3 05b 5 b
4 05c 5 c
5 05d 5 d
6 06a 6 a
7 06b 6 b
8 06c 6 c
9 06d 6 d
10 07a 7 a
11 07b 7 b
12 07c 7 c
13 07d 7 d
14 08a 8 a
15 08b 8 b
16 08c 8 c
17 08d 8 d
18 09a 9 a
19 09b 9 b
20 09c 9 c
21 09d 9 d
22 EFa 10 a
23 EFb 10 b
24 EFc 10 c
25 EFd 10 d

98
lehrer.csv Normal file
View File

@ -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
1 Kuerzel Vorname Nachname
2 bar Barner Angela
3 beh Behlke Christina
4 bhz Buchholz-Neidhardt Ilka
5 bmr Burmeister Felix
6 bod Bodeck Jörn
7 brs Bruns Maren
8 bru Brune Kerstin
9 buk Bukarz Julia Maria
10 buo Bucko Anna
11 det Deters Svenja
12 dfe Diefenbach Frank
13 dsl Diesel Stefan
14 est Ester-Burschel Barbara
15 fel Felsch Michael
16 fis Fischer Silke
17 frd Freund Sarah
18 fri Fricke Jan Dennis
19 ger Gerke Timo
20 gor Gorges Kristin
21 göt Göttner Wendy
22 grd Gradowski von Thomas
23 gru Grube Viktoria
24 gry Generotzky Constanze
25 hel Held Joachim
26 hob Hoberg Annika
27 hof Hofmann Jonas
28 hök Höke Sandra
29 hor Hornig Manuel
30 htn Horstmann Anne
31 imm Immel Bettina
32 jka Jutka Sabine
33 kah Kahrau Larissa
34 kch Koch Britta
35 khm Kuhlmann Florian
36 kop Kropp Elke
37 kpp Knüppel Christoph
38 kse Krause Kerstin
39 ksg Klausing Susanne
40 kth Kreth Maren
41 ldr Linder Sarah
42 leh Lehmann Daria
43 lin Lindemann Armin
44 lÜb Lübbecke Annika
45 mab Maybaum Regina
46 mei Meise-Amthauer Sylvia
47 mrg Müller-Goerke Ulrike
48 msl Müller-Slanitz Nadja
49 müh Mühlenhoff Paul
50 ngb Neugebauer Jonas
51 nid Niedworok Christian
52 nkp Niekamp Andrea
53 osm Ostmeier Tim
54 par Paarmann Oliver
55 pie Pieper Jennifer
56 plv Pehlivan Dervis
57 pör Pörschke-Watt Inga Kristin
58 pui Puissant Susanne
59 rak Raach-Kallmer Roswitha
60 rbg Randenborgh van Christian
61 rc Reckelkamm Bernd
62 rde Rohde Christine
63 rdt Randt Achim
64 rix Rixe Jeanette
65 rm Redmann Bastian
66 rup Rupik Karolina Beata
67 rüt Rüthemann Gunnar
68 sar Sauer Lisa
69 sat Straetmanns Florian
70 sdt Schmidt Moritz
71 sei Seidenberg Kristina
72 shz Scholz Nicole
73 sim Simon-Edsen Katja
74 slg Stölting Heike
75 smr Schollmeier David
76 snk Schöneck Gudrun-Verena
77 sön Schöne Claudia
78 spr Sprenger René
79 sra Schramm Saskia
80 stf Steffen Wiebke
81 stm Strotherm Janine
82 sto Storz Martin
83 str Struwe Simone
84 tes Theessen Johanna
85 the Theeßen Daniel
86 tsi Tsironi Paraskevi
87 ulr Ulrich Elias
88 vhs Viehhauser Werner
89 wab Wabnitz Sandra
90 wae Wagner-Euteneier Ina
91 wag Wagner Susanne
92 weh Wehry Martin
93 wel Welland Tanja
94 wen Wendler Jessica
95 wig Wieling Petra
96 wlm Wiegelmann Karen
97 wss Weiß David
98 zuc Zucchini Laura

101
raeume.csv Normal file
View File

@ -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
1 nummer etage
2 101 1
3 102 1
4 103 1
5 104 1
6 105 1
7 106 1
8 107 1
9 108 1
10 109 1
11 110 1
12 111 1
13 112 1
14 113 1
15 114 1
16 115 1
17 116 1
18 117 1
19 118 1
20 119 1
21 120 1
22 121 1
23 122 1
24 123 1
25 124 1
26 201 2
27 202 2
28 203 2
29 204 2
30 205 2
31 206 2
32 207 2
33 208 2
34 209 2
35 210 2
36 211 2
37 212 2
38 213 2
39 214 2
40 215 2
41 216 2
42 217 2
43 218 2
44 219 2
45 220 2
46 221 2
47 222 2
48 223 2
49 224 2
50 301 3
51 302 3
52 303 3
53 304 3
54 305 3
55 306 3
56 307 3
57 308 3
58 309 3
59 310 3
60 311 3
61 312 3
62 313 3
63 314 3
64 315 3
65 316 3
66 317 3
67 318 3
68 319 3
69 320 3
70 321 3
71 322 3
72 323 3
73 324 3
74 401 4
75 402 4
76 403 4
77 404 4
78 405 4
79 406 4
80 407 4
81 408 4
82 409 4
83 410 4
84 411 4
85 412 4
86 413 4
87 414 4
88 415 4
89 416 4
90 417 4
91 418 4
92 419 4
93 420 4
94 421 4
95 422 4
96 423 4
97 424 4
98 501 5
99 033a 0
100 033b 0
101 025 0

BIN
stundenplan.db Normal file

Binary file not shown.

243
stundenplan.sql Normal file
View File

@ -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);