In diesem Abschnitt wird eine einfache grafische Anwendung vorgestellt, in der eine Zahl per Knopfdruck wahlweise hoch- oder runtergezählt und sowohl numerisch als auch per Slider angezeigt wird. Diese Anwendung wird zum Einen als eigenständige Applikation und zum Anderen als Applet, welches in einem Webbrowser zu betrachten ist, realisiert.
Die Anwendung besteht aus fünf Klassen. Der Kern mit dem grafischen User-Interface und dem Eventhandling ist gemäß der Model-View-Controller-Architektur in den Klassen Zustand (Model), RaufRunter(View) und KnopfKontrollierer (Controller) implementiert. Die Klassen RaufRunterApp und RaufRunterApplet stellen die Top-Level Container dar, in denen die Anwendung als Application bzw. als Applet ausgeführt wird.
package raufrunter; import java.util.*; import java.awt.*; import javax.swing.*; public class RaufRunter extends JPanel implements Observer { private JButton rauf; // Button zum raufzaehlen private JButton runter; // Button zum runterzaehlen private Zustand z; // Zustand private JLabel ergebnis; // Label zur Anzeige private JSlider schieber; // Slider zur Visualisierung private Font font; // Font fuer Label public RaufRunter() { // Konstruktor setLayout(new GridLayout(4,1)); // einspaltiges Gridlayout rauf = new JButton("Addiere"); // Knopf rauf anlegen runter = new JButton("Subtrahiere"); // Knopf runter anlegen schieber = new JSlider(0,100,50); // Slide von 0 bis 100 ergebnis = new JLabel("50",JLabel.CENTER); // JLabel ergebnis anlegen font = new Font("SansSerif",Font.BOLD,30); // Schriftgroesse einstellen ergebnis.setFont(font); // an Label uebergeben add(rauf); // JButton rauf einfuegen add(ergebnis); // JLabel ergebnis einfuegen add(schieber); // Slider einfuegen add(runter); // JButton runter einfuegen z = new Zustand(50); // Zustand initialisieren z.addObserver(this); // dort als Observer eintragen KnopfKontrollierer raufK; // fuer rauf-Eventhandling raufK = new KnopfKontrollierer(z,+1); // soll hochzaehlen rauf.addActionListener(raufK); // Listener an rauf haengen KnopfKontrollierer runterK; // fuer runter-Eventhandling runterK = new KnopfKontrollierer(z,-1); // soll runterzaehlen runter.addActionListener(runterK); // Listener an runter haengen } public void update(Observable z, Object dummy){ // wird aufgerufen bei notify ergebnis.setText(((Zustand)z).get() + ""); // Zaehlerstand anzeigen schieber.setValue(((Zustand)z).get()); // Zaehlerstand visualisieren } } |
Die Klasse RaufRunter stellt die View dar und stammt von JPanel ab. Bei der Instanziierung wird zunächst das Layout festgelegt und im weiteren werden die benötigten Komponenten erstellt. Für das Programm wird ein JButton zum Hochzählen, ein JButton zum Runterzählen, ein JLabel zur Anzeige und ein JSlider zur Visualisierung des Zahlenwerts benötigt. Alle Komponenten werden innerhalb des einspaltigen Gridlayouts auf dieselbe Größe gesetzt. Diese ist nicht fest und kann sich ggf. durch die Größe des Top-Level Containers (das Applet oder die Applikation) ändern. Diese vier Komponenten werden dem JPanel hinzugefügt, welches in den jeweiligen Top-Level Container eingefügt werden kann.
Weiterhin wird eine Instanz der Klasse Zustand initialisiert, welche die Rolle des Model übernimmt, sowie zwei Instanzen des KnopfKontrollierer, welche als ActionListener beim jeweiligen Knopf eingehängt werden.
Schließlich wird mit der Methode update das Interface Observer implementiert, wodurch auf eine Zustandsänderung reagiert werden kann, die vom Observable per notify gemeldet wird.
package raufrunter; import java.util.Observer; import java.util.Observable; public class Zustand extends Observable{ // Zustand private int zaehler; // Zaehler public Zustand(int zaehler){ // Konstruktor this.zaehler=zaehler; // initialisiere Zaehler } int get(){return zaehler;} // Zaehler abfragen void aendern(int delta){ // Zaehlerstand aendern zaehler = zaehler + delta; // erhoehen oder erniedrigen setChanged(); // notiere Aenderung notifyObservers(); // Observer benachrichtigen } } |
Die Klasse Zustand stellt das Model dar und beinhaltet den aktuellen Zählerstand. Sie ist von der Klasse Observable abgeleitet und verfügt daher über Methoden setChanged und notifyObservers, durch die beim Observer die Methode update gestartet wird. Durch den Konstruktor erhält der Zähler seinen initialen Wert und mit der Methode get() kann der aktuelle Zählerstand in Erfahrung gebracht werden.
Die Klasse KnopfKontrollierer stellt den Controller dar und ist für das Eventhandlung zuständig. Dazu wird das Interface ActionListener implementiert, welches aus der einzigen Methode actionPerformed besteht. Dieser Listener wird in unterschiedlichen Instanziierungen den beiden JButtons übergeben. Bei einem klick auf einen Button wird dieser Event an den Listener übergeben und dort die Methode actionPerformed aufgerufen.
package raufrunter; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class KnopfKontrollierer implements ActionListener { private Zustand z; // Verweis auf Zustand private int delta; // spezifischer Inkrement public KnopfKontrollierer(Zustand z, int delta) { this.z = z; // merke Zustand this.delta = delta; // merke Inkrement } public void actionPerformed(ActionEvent e) { // bei Knopfdruck z.aendern(delta); // Zustand aendern } } |
Es fehlem noch die beiden Top-Level Container, welche den Rahmen für die Anwendung bilden, in dem die Instanz der Klasse RaufRunter ausgeführt wird.
package raufrunter; import java.awt.BorderLayout; import javax.swing.JFrame; public class RaufRunterApp { public static void main(String args[]) { JFrame rahmen = new JFrame("RaufRunter-Applikation"); rahmen.getContentPane().add(new RaufRunter(), BorderLayout.CENTER); rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); rahmen.pack(); rahmen.setVisible(true); } } |
In RaufRunterApp wird ein JFrame erzeugt und in dessen ContentPane wird die RaufRunter-Komponente eingefügt. Mit der Methode setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) wird festgelegt, dass die Applikation beim Schließen des Fensters endet, sonst würde sie weiterlaufen und wäre lediglich unsichtbar.
Mit der Methode pack() wird die Größe der einzelnen Componenten bestimmt und dem Top-Level Container mitgeteilt. Zuletzt muss das JFrame mit der Methode setVisible sichtbar gemacht werden.
Um die Anwendung als Applet im Browser zu betrachten wird die Klasse RaufRunterApplet benötigt:
package raufrunter; import java.awt.BorderLayout; import javax.swing.JApplet; public class RaufRunterApplet extends JApplet { public void init() { getContentPane().add(new RaufRunter(), BorderLayout.CENTER); } } |
Beim Start als Applet instanziiert der Appletviever (oder Browser) eine Instanz der Klasse RaufRunterApplet und ruft dort die init-Methode auf. In dieser Methode wird eine neue Instanz der Klasse RaufRunter erzeugt und der ContentPane des Applets hinzugefügt.
Das Applet wird dann in eine HTML-Seite eingebunden:
<HTML> <HEAD> <TITLE>RaufRunter-Applet</TITLE></HEAD> <BODY> <CENTER> <H1>RaufRunterApplet</H1> <APPLET width=200 height=150 code ="raufrunter.RaufRunterApplet.class" archive ="raufrunter.jar"> </APPLET> </CENTER> </BODY> </HTML> |
Achtung: Da das Applet Swing-Klassen benutzt, kann es notwendig sein, ein aktuelles Java Plugin zu installieren.