AUFGABE 1 Ein Wagen dargestellt durch ein Rechteck
AUFGABE 1: Ein Wagen (dargestellt durch ein Rechteck) soll sich von links nach rechts bewegen. Tipp: Timer benutzen AUFGABE 2: Zusätzlich zu Aufgabe 1 soll sich der Wagen, wenn er am rechten Rand ankommt, wieder von links nach rechts bewegen. AUFGABE 3: Zusätzlich zu Aufgabe 2 soll jedesmal beim Anklicken des Buttos "schneller" der Wagen schneller fahren.
AUFGABE: Ein Wagen (dargestellt durch ein Rechteck) soll sich immer wieder von links nach rechts bewegen. Zusätzlich soll jedesmal beim Anklicken des Buttos "schneller" der Wagen schneller fahren. Außerdem muß das Entwurfsmuster MVC (Model - View - Control) benutzt werden. Hier das UML. . .
Animation. Controller - animation. View : Animation. View - animation. Model : Animation. Model - Wagen : wagen schwarzer Pfeil: Assoziation roter, gestrichelter geschwungener Pfeil: zeigt vom Ereignis (fire) zur Wanze (Lauscher)
Animation. Controller - animation. View : Animation. View - animation. Model : Animation. Model Anwender feuert in der View. Einfangende Methode im Controller verändert Daten im Model Animation. Model - Wagen : wagen Timer feuert im Controller. Einfangende Methode im Controller verändert Daten im Model feuert (weil Daten im Model geändert wurden). Einfangende Methode in der View veranlaßt Bildschirmausgabe.
Animation. Controller - animation. View : Animation. View - animation. Model : Animation. Model - Wagen : wagen Wie siehe eine Kette der Informationsverarbeitung aus , d. h: Wer beginnt zu feuern ? Welche Wanzen treten dann in Aktion und auf welche Daten greifen diese dann zu? Es gibt zwei Möglichkeiten, von denen gefeuert werden kann:
1. Möglichkeit: View feuert
Animation. Controller - animation. View : Animation. View - animation. Model : Animation. Model - Wagen : wagen Button "schneller" wird betätigt --> Feuer Einfangende Methode des Controllers verändert die Daten ("schrittweite") des Model, also Zugriff auf Model, also. . . --> Feuer Einfangende Methode der View greift auf die Daten (" schrittweite ") des Model zu (für Bildschirmausgabe).
Animation. Controller - animation. View : Animation. View - animation. Model : Animation. Model - Wagen : wagen II) View feuert (nochmals zusammengefasst): Durch das Klicken des Buttons "schneller" wird Feuer ausgelöst. Dadurch wird in der einfangenden Methode des Controllers die Daten (das Attribut "wagen", also Schrittweite beim Bewegen) im Model geändert (Wagen fährt schneller). Diese Änderung veranlaßt das Model zu feuern. Dadurch wird in der einfangenden Methode der View die Daten (das Attribut "wagen", also Schrittweite beim Bewegen) des Models ausgelesen und auf dem Bildschirm ausgegeben (Anwender sieht wie der Wagen schneller fährt).
2. Möglichkeit: Timer feuert
Animation. Controller - animation. View : Animation. View - animation. Model : Animation. Model - Wagen : wagen Timer feuert --> Feuer Einfangende Methode des Controllers verändert die Daten (Koordinaten) des Model, also Zugriff auf Model, also. . . --> Feuer Einfangende Methode der View greift auf die Daten (" schrittweite ") des Model zu (für Bildschirmausgabe).
Animation. Controller - animation. View : Animation. View - animation. Model : Animation. Model - Wagen : wagen I) Timer feuert (nochmals zusammengefasst): Dadurch wird in der einfangenden Methode des Controllers die Daten (das Attribut "wagen") im Model geändert (Wagen fährt). Diese Änderung veranlaßt das Model zu feuern. Dadurch wird in der einfangenden Methode der View die Daten (das Attribut "wagen") des Models ausgelesen und auf dem Bildschirm ausgegeben (Anwender sieht wie der Wagen fährt).
Implementieren Sie - soweit dies mit Ihrem bisherigen Wissen möglich ist M, V und C der obigen Animation (zuerst ohne den Button "schneller". Danach mit dem Button "schneller". Beachten Sie. . .
Der Button schneller soll unten (South) im Border. Layout angebracht werden. Die Bewegungen des Wagens müssen im Center Border-Layout angebracht werden
Border-Layout: CENTER SOUTH EAST WEST NORTH
In der folgenden Implementierung wird (aus Gründen der Vereinfachung) noch nicht das Border-Layout verwendet.
package wagenanimationmvc 11; import java. awt. *; import java. awt. event. Action. Event; import java. awt. event. Action. Listener; import java. util. Observable; import java. util. Observer; import javax. swing. *; public class Main. Wagen. Animation. MVC 11 { public static void main(String[] args){ Animation. Controller animation. Controller = new Animation. Controller(); } }
package wagenanimationmvc 11; import java. awt. event. Action. Event; import java. awt. event. Action. Listener; import javax. swing. Timer; class Animation. Controller { private Animation. View animation. View; private Animation. Model animation. Model; public Animation. Controller() { Timer timer; animation. Model = new Animation. Model(); animation. View = new Animation. View(animation. Model); Timer. Action. Listener tal; tal=new Timer. Action. Listener(animation. Model); timer = new Timer(2, tal); timer. start(); } } public Animation. View get. Animation. View() { return animation. View; }
class Timer. Action. Listener implements Action. Listener { private Animation. Model animation. Model; public Timer. Action. Listener(Animation. Model animation. Model){ this. animation. Model=animation. Model; } public void action. Performed(Action. Event ae) { animation. Model. updaten(); } }
package wagenanimationmvc 11; import java. awt. Color; import java. awt. Graphics; class Animation. JPanel extends javax. swing. JPanel { private Wagen wagen; public void set. Wagen(Wagen wagen){ this. wagen=wagen; } public Animation. JPanel(Wagen wagen) { this. wagen=wagen; } } public void paint. Component(Graphics g) { super. paint. Component(g); g. set. Color(Color. red); g. fill. Rect(wagen. get. X(), wagen. get. Y(), 30, 25); }
package wagenanimationmvc 11; import java. util. Observable; class Animation. Model extends Observable{ private Wagen wagen; public Wagen get. Wagen(){ return wagen; } public void updaten() { wagen. fahren(); set. Changed(); notify. Observers(); } public Animation. Model() { wagen=new Wagen(); } }
package wagenanimationmvc 11; import java. awt. Container; import java. util. Observable; import java. util. Observer; import javax. swing. JFrame; class Animation. View extends javax. swing. JFrame implements Observer{ private Animation. JPanel animation. JPanel; private Animation. Model animation. Model; public Animation. View(Animation. Model animation. Model) { Container mycont; this. animation. Model = animation. Model; this. animation. Model. add. Observer(this); mycont = get. Content. Pane(); this. set. Size(500, 500); animation. JPanel = new Animation. JPanel(animation. Model. get. Wagen()); mycont. add(animation. JPanel); this. set. Visible(true); set. Default. Close. Operation(JFrame. EXIT_ON_CLOSE); }
public Animation. JPanel get. Animation. JPanel(){ return animation. JPanel; } public void update(Observable m, Object o) { if (m == animation. Model) { animation. JPanel. repaint(); } } }
package wagenanimationmvc 11; class Wagen{ private int x; private int y; private int schritt; public Wagen(){ x=0; y=0; schritt = 1; } public void set. X(int p. X){ x = p. X; } public int get. X(){ return x; }
public void set. Y(int p. Y){ y = p. Y; } public int get. Y(){ return y; } void fahren(){ if(x <= 400){ x = x + schritt; } else{ x=0; } } } void set. Schritt(int p. Schritt){ schritt = p. Schritt; }
- Slides: 24