Zielsetzung
Dieser Abschnitt 11.3 gehört nicht zum eigentlichen Stoff des Kurses, Java-Anwendungen sind in den Richtlinien der gymnasialen Oberstufe nicht vorgesehen, und auch im Informatik-Studium verzichtet man in den ersten beiden Semestern auf Graphik-Anwendungen.
Dieser Abschnitt richtet sich daher an besonders neugierige oder engagierte Schüler(innen) und Erst- und Zweitsemster im Informatik-Studium.
Die eigentliche Graphik-Anwendung lassen wir uns von ChatGPT erstellen, wie sehen dann zu, dass wir die Klasse Vokabelliste, die wir in den Folgen 11.1 und 11.2 entwickelt hatten, sinnvoll in diese Graphikanwendung integrieren.
Ich formuliere die Zielsetzung für diese Folge 11.3 einmal so, dass ich sie direkt als Promt an ChatGPT übergeben kann.
Das Anwendungsfenster soll eine feste Größe von 1280 x 800 Pixeln haben.
Am unteren Rand der Anwendung sollen sich folgende Buttons befinden:
- Vokabel eingeben
- Vokabeln auflisten
- Vokabeln sortieren
- Vokabel suchen
Wenn man "Vokabeln eingeben" anklickt, soll ein kleines Fenster mit zwei Editboxen und einem OK-Button erscheinen. In die einzeiligen Editboxen werden der deutsche und der englische Begriff eingegeben. Wenn der OK-Button betätigt wurde, wird die Vokabel in die ArrayList der Klasse Vokabelliste aufgenommen und hinten angehängt.
Bei "Vokabel auflisten" soll im Bereich über den Buttons eine Auflistung der Vokabeln erscheinen, schön formatiert Deutsch / Englisch mit einer senkrechten Trennlinie in der Mitte. Sind in der Liste mehr Vokabeln enthalten als in den Bereich des Fensters hineinpassen, soll ganz rechts ein Scrollbalken erscheinen, mit dem man durch die Liste scrollen kann.
Bei "Vokabeln sortieren" soll der implementierte Bubblesort ausgeführt werden, dann wird die Liste neu angezeigt.
Bei "Vokabel suchen" erscheint wieder ein kleines Fenster mit zwei Editboxen und einem OK-Button. In die linke Editbox kann ein deutscher Begriff eingegeben werden, nach Betätigung des OK-Buttons erscheint in der rechten Editbox der passende englische Begriff. Umgekehrt kann in die rechte Editbox der englische Begriff eingegeben werden, dann erscheint entsprechend der deutsche in der linken Box. Wenn die Vokabel nicht in der Liste enthalten ist, erscheint in der anderen Editbox eine entsprechende Meldung wie "Vokabel nicht gefunden".
So, jetzt bin ich mal gespannt, was ChatGPT uns dazu liefert.
Vorbemerkung von ChatGPT
Ich würde die Anwendung mit Java Swing realisieren. Damit lässt sie sich direkt in BlueJ starten und benötigt keine zusätzlichen Bibliotheken.
Die bisherigen Klassen Vokabel und Vokabelliste können weitgehend unverändert bleiben. Wir benötigen lediglich zwei zusätzliche Suchmethoden in Vokabelliste und eine neue Klasse VokabelApp für die grafische Benutzeroberfläche.
Ich habe die Anwendung bewusst so aufgebaut, dass der Java-Code auch für Schüler(innen) der EF nachvollziehbar bleibt.
Die grafische Anwendung greift ausschließlich über öffentliche Methoden auf die Vokabelliste zu. Die interne ArrayList muss daher nicht öffentlich zugänglich gemacht werden.
Die Graphik-Anwendung von ChatGPT
Die grafische Oberfläche besteht aus einem JFrame, einem zentralen Anzeigebereich und vier Buttons.
Für die Vokabelliste verwenden wir eine JTable. Diese Swing-Komponente ist besonders geeignet, weil sie bereits eine tabellarische Darstellung mit zwei Spalten ermöglicht.
Ein JScrollPane sorgt automatisch dafür, dass bei längeren Listen ein vertikaler Scrollbalken erscheint.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class VokabelApp extends JFrame
{
private Vokabelliste vokabelliste;
private JTable tabelle;
private DefaultTableModel tabellenModell;
private JButton eingeben;
private JButton auflisten;
private JButton sortieren;
private JButton suchen;
public VokabelApp()
{
vokabelliste = new Vokabelliste();
setTitle("Vokabeltrainer Deutsch - Englisch");
setSize(1280, 800);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initTabelle();
initButtons();
setLocationRelativeTo(null);
setVisible(true);
}
// --------------------------------------------------
// Tabelle erzeugen
// --------------------------------------------------
private void initTabelle()
{
String[] spalten = {"Deutsch", "Englisch"};
tabellenModell = new DefaultTableModel(spalten, 0)
{
public boolean isCellEditable(int zeile, int spalte)
{
return false;
}
};
tabelle = new JTable(tabellenModell);
tabelle.setFont(new Font("SansSerif", Font.PLAIN, 20));
tabelle.setRowHeight(32);
tabelle.getTableHeader().setFont(
new Font("SansSerif", Font.BOLD, 22));
tabelle.setShowVerticalLines(true);
tabelle.setGridColor(Color.GRAY);
tabelle.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane = new JScrollPane(tabelle);
add(scrollPane, BorderLayout.CENTER);
}
// --------------------------------------------------
// Buttons erzeugen
// --------------------------------------------------
private void initButtons()
{
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(
FlowLayout.CENTER, 25, 15));
eingeben = new JButton("Vokabel eingeben");
auflisten = new JButton("Vokabeln auflisten");
sortieren = new JButton("Vokabeln sortieren");
suchen = new JButton("Vokabel suchen");
Font schrift = new Font("SansSerif", Font.PLAIN, 18);
eingeben.setFont(schrift);
auflisten.setFont(schrift);
sortieren.setFont(schrift);
suchen.setFont(schrift);
buttonPanel.add(eingeben);
buttonPanel.add(auflisten);
buttonPanel.add(sortieren);
buttonPanel.add(suchen);
add(buttonPanel, BorderLayout.SOUTH);
// Aktionen der Buttons festlegen
eingeben.addActionListener(e -> vokabelEingeben());
auflisten.addActionListener(e -> vokabelnAnzeigen());
sortieren.addActionListener(e -> vokabelnSortieren());
suchen.addActionListener(e -> vokabelSuchen());
}
// --------------------------------------------------
// Vokabel eingeben
// --------------------------------------------------
private void vokabelEingeben()
{
JTextField deutsch = new JTextField(20);
JTextField englisch = new JTextField(20);
JPanel panel = new JPanel(new GridLayout(2, 2, 10, 10));
panel.add(new JLabel("Deutsch:"));
panel.add(deutsch);
panel.add(new JLabel("Englisch:"));
panel.add(englisch);
int ergebnis = JOptionPane.showConfirmDialog(
this,
panel,
"Neue Vokabel eingeben",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
if (ergebnis == JOptionPane.OK_OPTION)
{
String d = deutsch.getText().trim();
String e = englisch.getText().trim();
if (!d.isEmpty() && !e.isEmpty())
{
vokabelliste.hinzufuegen(d, e);
vokabelnAnzeigen();
}
else
{
JOptionPane.showMessageDialog(
this,
"Bitte beide Begriffe eingeben!");
}
}
}
// --------------------------------------------------
// Alle Vokabeln anzeigen
// --------------------------------------------------
private void vokabelnAnzeigen()
{
// Alte Tabellenzeilen entfernen
tabellenModell.setRowCount(0);
// Vokabeln in die Tabelle eintragen
for (int i = 0; i < vokabelliste.getAnzahl(); i++)
{
Vokabel v = vokabelliste.getVokabel(i);
Object[] zeile = {
v.getDeutsch(),
v.getEnglisch()
};
tabellenModell.addRow(zeile);
}
}
// --------------------------------------------------
// Vokabeln sortieren
// --------------------------------------------------
private void vokabelnSortieren()
{
vokabelliste.sortierenDeutsch();
vokabelnAnzeigen();
}
// --------------------------------------------------
// Vokabel suchen
// --------------------------------------------------
private void vokabelSuchen()
{
JTextField deutsch = new JTextField(20);
JTextField englisch = new JTextField(20);
JPanel panel = new JPanel(new GridLayout(2, 2, 10, 10));
panel.add(new JLabel("Deutsch:"));
panel.add(deutsch);
panel.add(new JLabel("Englisch:"));
panel.add(englisch);
// Eigenen Dialog erzeugen
JDialog dialog = new JDialog(
this, "Vokabel suchen", true);
JButton ok = new JButton("OK");
ok.addActionListener(e ->
{
String d = deutsch.getText().trim();
String en = englisch.getText().trim();
Vokabel v = null;
if (!d.isEmpty() &&
!d.equals("Vokabel nicht gefunden"))
{
v = vokabelliste.sucheDeutsch(d);
if (v != null)
englisch.setText(v.getEnglisch());
else
englisch.setText("Vokabel nicht gefunden");
}
else if (!en.isEmpty() &&
!en.equals("Vokabel nicht gefunden"))
{
v = vokabelliste.sucheEnglisch(en);
if (v != null)
deutsch.setText(v.getDeutsch());
else
deutsch.setText("Vokabel nicht gefunden");
}
});
JPanel unten = new JPanel();
unten.add(ok);
dialog.setLayout(new BorderLayout(10, 10));
dialog.add(panel, BorderLayout.CENTER);
dialog.add(unten, BorderLayout.SOUTH);
dialog.setSize(450, 160);
dialog.setLocationRelativeTo(this);
dialog.setVisible(true);
}
}
Damit diese App funktioniert, müssen wir die Klasse Vokabelliste um drei Methoden ergänzen:
public int getAnzahl()
{
return liste.size();
}
public Vokabel sucheDeutsch(String deutsch)
{
for (int i = 0; i < liste.size(); i++)
{
Vokabel v = liste.get(i);
if (v.getDeutsch().equalsIgnoreCase(deutsch))
return v;
}
return null;
}
public Vokabel sucheEnglisch(String englisch)
{
for (int i = 0; i < liste.size(); i++)
{
Vokabel v = liste.get(i);
if (v.getEnglisch().equalsIgnoreCase(englisch))
return v;
}
return null;
}
Dann sollte das Programm fehlerfrei funktionieren. Hier ein Screenshot der Anwendung, nachdem eine Reihe von Vokabeln eingegeben wurde:
Text
Autor: Ulrich Helmich 2024, Lizenz: Public Domain
Dieses Bild zeigt die App mit sieben Vokabeln, und die achte Vokabel wird gerade eingegeben.