Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Learning By Doing Ereignissteuerung (Events) prozedural ereignisgesteuert Unterprogrammaufruf an fest codierter Stelle Wann immer der Event auftritt, führe.

Ähnliche Präsentationen


Präsentation zum Thema: "Learning By Doing Ereignissteuerung (Events) prozedural ereignisgesteuert Unterprogrammaufruf an fest codierter Stelle Wann immer der Event auftritt, führe."—  Präsentation transkript:

1 Learning By Doing Ereignissteuerung (Events) prozedural ereignisgesteuert Unterprogrammaufruf an fest codierter Stelle Wann immer der Event auftritt, führe möglichst bald aus... Event kann irgendwo auftreten

2 Learning By Doing TimerEvent (UML-Diagramm) im Delegations-Eventmodell Implementierung der Callbackmethode Zur Registrierung der Callbackmethode Registrierung der Callbackmethode timeElapsed() existiert! Garantieerklärung: timerListener.timeElapsed() Event! Aufruf von Registrierung: Übergeben einer Referenz der Klasse, welche die Callbackmethode enthält, an den Eventhandler, der die Callbackmethode bei jedem Event aufruft.

3 Learning By Doing // DigitalWatch.java import ch.aplu.util.*; import java.awt.Font; public class DigitalWatch implements TimerListener { private int seconds = 0; private boolean isBell = true; private LoResAlarmTimer timer = new LoResAlarmTimer( L); private GPanel panel = new GPanel(); public DigitalWatch() { panel.font(new Font( "Arial", Font.PLAIN, 200)); timer.addTimerListener(this); while (true) { if (isBell) { isBell = false; panel.clear(); panel.text(0.3, 0.4, Integer.toString(seconds)); seconds++; } public boolean timeElapsed() { isBell = true; return true; } public static void main(String[] args) { new DigitalWatch(); } DigitalWatch while (true) { if (isBell) { isBell = false; panel.clear(); panel.text(0.3, 0.4, Integer.toString(seconds)); seconds++; } CallbackmethodeEventloop Registrierung "Dieser TimerListener wird beim Eventhandler registriert" Implementierung "DigitalWatch implementiert einen TimerListener"

4 Learning By Doing // WbzEx11.java import java.awt.event.*; import java.awt.Color; import ch.aplu.util.*; public class WbzEx11 { class MyMouseAdapter extends MouseAdapter { public void mousePressed(MouseEvent evt) { Color c = new Color((float)Math.random(), (float)Math.random(), (float)Math.random()); Stern stern = new Stern(p, 50, c); stern.moveAt((int)p.toWindowX(evt.getX()), (int)p.toWindowY(evt.getY())); stern.showMe(); } private GPanel p = new GPanel(0, 500, 0, 500); public WbzEx11() { p.addMouseListener(new MyMouseAdapter()); } public static void main(String[] args) { new WbzEx11(); } MouseEvents Mausevents Registrie- rung Innere Klasse Callbackmethode hat Zugriff

5 Learning By Doing // WbzEx11a.java import java.awt.event.*; import java.awt.Color; import ch.aplu.util.*; public class WbzEx11a { private GPanel p = new GPanel(0, 500, 0, 500); public WbzEx11a() { p.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent evt) { Color c = new Color((float)Math.random(), (float)Math.random(), (float)Math.random()); Stern stern = new Stern(p, 50, c); stern.moveAt((int)p.toWindowX(evt.getX()), (int)p.toWindowY(evt.getY())); stern.showMe(); } }); } public static void main(String[] args) { new WbzEx11a(); } Anonyme Klassen Registrierung Anonyme Klasse abgeleitet von MouseAdapter

6 Learning By Doing // WbzEx12.java import java.awt.event.*; import javax.swing.*; import ch.aplu.turtle.*; public class WbzEx12 { private class ButtonActionAdapter implements ActionListener { public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if (source == runButton) state = States.RUNNING; if (source == stopButton) state = States.STOPPED; if (source == quitButton) state = States.QUITTING; } private enum States {STOPPED, RUNNING, QUITTING}; private States state = States.STOPPED; private JButton runButton = new JButton("Run"); private JButton stopButton = new JButton("Stop"); private JButton quitButton = new JButton("Quit"); ButtonEvents Buttonevents Zustände (Aufzählungstyp) Innere Klasse, implementiert ActionListener aktueller Zustand Instanzvariablen State switch

7 Learning By Doing ButtonEvents Buttonevents public WbzEx12() { Turtle t = new Turtle(); JPanel jp = t.getPlayground(); jp.add(runButton); jp.add(stopButton); jp.add(quitButton); jp.validate(); ButtonActionAdapter adapter = new ButtonActionAdapter(); runButton.addActionListener(adapter); stopButton.addActionListener(adapter); quitButton.addActionListener(adapter); while (state != States.QUITTING) { switch(state) { case STOPPED: Thread.yield(); break; case RUNNING: t.forward(10).left(10); break; } System.exit(0); } public static void main(String[] args) { new WbzEx12(); } Event loop Buttons in der Komponente anzeigen Registrierung Prozessor freiwillig anderen abgeben

8 Learning By Doing ButtonEvents Buttonevents // WbzEx12a.java import java.awt.event.*; import javax.swing.*; import ch.aplu.turtle.*; public class WbzEx12a { interface State { int QUITTING = 0; int STOPPED = 1; int RUNNING = 2; } private class ButtonActionAdapter implements ActionListener { public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if (source == runButton) state = State.RUNNING; if (source == stopButton) state = State.STOPPED; if (source == quitButton) state = State.QUITTING; } private int state = State.STOPPED; private JButton runButton = new JButton("Run"); private JButton stopButton = new JButton("Stop"); private JButton quitButton = new JButton("Quit"); (J2SE 1.4) Simulation des Enum-Typs state-Variable als "dekorierter" int Verwendung durch Vorstellen des Interface-Bezeichners Schon viel besser als state = 2

9 Learning By Doing ButtonEvents Buttonevents public WbzEx12a() { Turtle t = new Turtle(); JPanel jp = t.getPlayground(); jp.add(runButton); jp.add(stopButton); jp.add(quitButton); jp.validate(); ButtonActionAdapter adapter = new ButtonActionAdapter(); runButton.addActionListener(adapter); stopButton.addActionListener(adapter); quitButton.addActionListener(adapter); while (state != State.QUITTING) { switch(state) { case State.STOPPED: Thread.yield(); break; case State.RUNNING: t.forward(10).left(10); break; } System.exit(0); } public static void main(String[] args) { new WbzEx12a(); } (J2SE 1.4) Verwendung durch Vorstellen des Interface-Bezeichners

10 Learning By Doing GUI Muster GUI-Muster // WbzEx13.java import java.awt.*; import javax.swing.*; import ch.aplu.util.*; public class WbzEx13 extends JPanel { private int count = 0; public WbzEx13() { JFrame f = new JFrame("Frame Window"); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.getContentPane().add(this); f.setBounds(50, 50, 550, 550); f.setVisible(true); } public void paintComponent(Graphics g) { super.paintComponent(g); g.drawOval(0, 0, 500, 500); g.drawString("WBZ-Kurs \"Java im Unterricht\"", 180, 250); Graphics2D g2D = (Graphics2D)g; g2D.setStroke(new BasicStroke(8)); Line2D.Double line = new Line2D.Double(20, 300, 480, 300); g2D.draw(line); System.out.println(count++); } public static void main(String[] args) { Console.init(); new WbzEx13(); } JPanel als Grafik-Fenster paintComponent() wird bei jedem System-Trigger aufgerufen JFrame als umfassendes Fenster Aktion beim Klicken des Close-Buttons Füge das JPanel in das JFrame Position und Grösse des JFrames Zeige das JFrame mit Inhalt Aufruf überschr. Methode aus JPanel Zeichnen mit dem Graphics-Context Hole Graphics2D-Context Text als Grafik Indikator für Aufruf von paintComponent Neue Linieneigenschaft (Dicke) Linie als Objekt Zeichne Grafikobjket


Herunterladen ppt "Learning By Doing Ereignissteuerung (Events) prozedural ereignisgesteuert Unterprogrammaufruf an fest codierter Stelle Wann immer der Event auftritt, führe."

Ähnliche Präsentationen


Google-Anzeigen