Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Beispiel aus der Übung: Model-View-Controller
- package bier.model;
- import java.util.NoSuchElementException;
- import java.util.Observable;
- /*
- * Model/Geschaeftslogik der Applikation. Observer
- * (View und evtl. Controller) koennen auf Aenderungen an dem Model horchen.
- */
- public class Biertheke extends Observable {
- private int bier;
- private int groesse;
- public Biertheke(int groesse) {
- this.groesse = groesse;
- this.bier = 0;
- }
- public void zapfen() {
- if (istVoll()) {
- throw new IllegalStateException("Theke ist voll!");
- }
- bier++;
- /*
- * Wenn sich das Model aendert, benachrichtigt es seine Observer. Wichtig:
- * Nur wenn setChanged() aufgerufen wurde, werden die Observer durch
- * notifyObservers() benachrichtigt.
- */
- this.setChanged();
- this.notifyObservers();
- }
- public void verkaufen() {
- if (istLeer()) {
- throw new NoSuchElementException("Wir liegen trocken!");
- }
- bier--;
- this.setChanged();
- this.notifyObservers();
- }
- public int getAnzahlBiere() {
- return this.bier;
- }
- public int getThekengroesse() {
- return this.groesse;
- }
- public boolean istVoll() {
- return bier == groesse;
- }
- public boolean istLeer() {
- return bier == 0;
- }
- }
- package bier.view;
- import bier.controller.ThekenController;
- import bier.model.Biertheke;
- import javax.swing.*;
- import java.awt.*;
- import java.util.Observable;
- import java.util.Observer;
- /*
- * View als spezieller Container. Hier JPanel, damit ein bestimmtes Layout zum
- * Anordnen der Elemente vorgegeben werden kann. Anderer Ansatz: Eine Klasse
- * 'baut' die View zusammen und liefert sie als ganzes zurueck.
- */
- public class BierView extends JPanel implements Observer {
- private JButton bier;
- private JLabel counter;
- private Biertheke model;
- public BierView(Biertheke model) {
- /*
- * die View an das Model anhaengen
- */
- this.model = model;
- this.model.addObserver(this);
- /*
- * die View bekommt ein Layout zugewiesen. andere interessante Layouts
- * sind CardLayout GridLayout FlowLayout
- */
- this.setLayout(new BorderLayout());
- /*
- * einen button mit bevorzugter Groesse erstellen
- */
- this.bier = new JButton("Bier!");
- this.bier.setPreferredSize(new Dimension(100, 100));
- /*
- * Hiermit kann der Button ausgegraut werden
- */
- this.bier.setEnabled(true);
- /*
- * View erzeugt Controller und haengt ihn ein
- */
- ThekenController c = new ThekenController(this.model);
- this.bier.addMouseListener(c);
- /*
- * Label zur Darstellung erzeugen
- */
- this.counter = new JLabel("Anzahl der Biere: ");
- /*
- * untergeordnete Elemente in dieser View nach den Moeglichkeiten des
- * Layouts anordnen.
- */
- this.add(this.bier, BorderLayout.SOUTH);
- this.add(this.counter, BorderLayout.NORTH);
- }
- /*
- * Wird aufgerufen, wenn sich das Model aendert. o waere in diesem Fall das
- * Model arg die Nachricht, dies es mit notifyObservers uebergeben hat
- */
- @Override
- public void update(Observable o, Object arg) {
- /*
- * Aendere View nach den Vorgaben des Models
- */
- this.counter.setText("Anzahl der Biere: " + this.model.getAnzahlBiere());
- }
- }
- package bier.controller;
- import bier.model.Biertheke;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- /*
- * horcht auf Benutzereingaben und verstaendigt das Model
- */
- public class ThekenController extends MouseAdapter {
- private Biertheke model;
- public ThekenController(Biertheke model) {
- this.model = model;
- }
- @Override
- public void mouseClicked(MouseEvent e) {
- /*
- * Wenn Theke voll bzw. leer soll nicht mehr geklickt werden koennen. -
- * Oder gehoert das in die Geschaeftslogik?
- */
- switch (e.getButton()) {
- case MouseEvent.BUTTON1:
- if (!this.model.istVoll()) {
- this.model.zapfen();
- }
- break;
- case MouseEvent.BUTTON3:
- if (!this.model.istLeer()) {
- this.model.verkaufen();
- }
- break;
- }
- }
- }
- package bier;
- import bier.model.Biertheke;
- import bier.view.BierView;
- import javax.swing.*;
- public class Bier {
- public static void main(String[] args) {
- /*
- * Erzeugt und verbindet Model und View.
- */
- Biertheke model = new Biertheke(5);
- BierView view = new BierView(model);
- /*
- * starte View
- */
- JFrame frame = new JFrame("Biertheke");
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setContentPane(view);
- frame.pack();
- frame.setVisible(true);
- }
- }
Add Comment
Please, Sign In to add comment