CuP - Java Achzehnte (und LETZTE!) Vorlesung : 1.Teil: Vergleiche Skriptum Kapitel 8.1 2.Teil:...

Preview:

Citation preview

CuP - Java

Achzehnte (und LETZTE!) Vorlesung : 1.Teil: Vergleiche Skriptum Kapitel 8.12.Teil: WIEDERHOLUNG .

Montag, 9. Dezember 2002

9. Dezember 2002

CuP WS 2002/2003 2

Threads

Ein Thread ist ein Programmteil der eigenständig laufen kann während zur selben Zeit noch andere Aufgaben erledigt werden können (Multitasking!)

Ein Thread verlangt das Runnable-Interface und somit die Implementierung der Methode run( )

Die Methode run( ) kann Interrupt-Exceptions produzieren und verlangt daher ein Exception-Handling

Zum Abfangen der Interrupt-Exception verwendet man die Kontrollstruktur

try{ ... }

catch(InterruptedException e){ ... }

9. Dezember 2002

CuP WS 2002/2003 3

Threads Generierung mit Hilfe des Interface Runnable Implementierung:

... implements Runnable{ .... }

Deklaration:

Thread thread1;

Initialisierung (in der Methode start( )): thread1=new Thread(this);

Start:

thread1.start( );

Aktivierung durch die Methode:

void run( ){ ... }

9. Dezember 2002

CuP WS 2002/2003 4

Implementierung eines Threads (1/2)

import java.awt.*;

import java.applet.Applet;

public class AThread extends Applet

implements Runnable{ // Interface

private Thread meinThread; // Deklaration des Threads

private int t=0; // Sekundenzähler

public void start(){

meinThread=new Thread(this); // Initialisierung des Threads

meinThread.start(); // Start des Threads

}

9. Dezember 2002

CuP WS 2002/2003 5

Implementierung eines Threads (2/2)

public void run(){ // Aktivierung des Threads

while (true)

{

try

{

Thread.currentThread().sleep(1000);

}

catch(InterruptedException e){}

t++;

repaint();

}

}

public void paint(Graphics g){

g.drawString("Thread ist seit ” + t + " Sekunden aktiv!", 100,100);

}

}

9. Dezember 2002

CuP WS 2002/2003 6

Ein komplexeres Beispiel zu Threadsimport java.awt.event.*; import java.awt.*; import java.applet.Applet;

public class Reflexionen1 extends Applet implements ActionListener{

private Button start, stop;

private Ball [] ball =new Ball[20];

int anzahl=0;

public void init(){

setSize(500,500);

start = new Button("Start");

add(start);

start.addActionListener(this);

stop = new Button("Stop");

add(stop);

stop.addActionListener(this);

}

9. Dezember 2002

CuP WS 2002/2003 7

public void actionPerformed(ActionEvent e){

Graphics g=getGraphics();

g.setColor(Color.white);

g.drawString("Anzahl der Baelle: "+anzahl,50,470);

if(e.getSource() == start && anzahl < 20){

ball[anzahl]=new Ball(g);

ball[anzahl].start();

anzahl++;

}

if (e.getSource() == stop && anzahl > 0)

{

anzahl--;

ball[anzahl].stirb();

}

g.setColor(Color.black);

g.drawString("Anzahl der Baelle: "+anzahl,50,470);

}

}

9. Dezember 2002

CuP WS 2002/2003 8

class Ball extends Thread{

private Graphics g;

private boolean springe;

private int x, y;

private String dirX="links", dirY="hinauf”;

private int sizeX=400, sizeY=400;

public Ball(Graphics h){

g=h;

springe=true;

x=(int)(Math.random()*380 + 50);

y=(int)(Math.random()*380 + 50);

}

public void stirb(){

springe=false;

g.setColor(Color.white);

g.fillOval(x,y,20,20);

}

9. Dezember 2002

CuP WS 2002/2003 9

public void run(){

while (springe)

{

g.setColor(Color.white);

g.fillOval(x,y,20,20);

if (dirX.equals("rechts")) x++; else x--;

if (dirY.equals("hinunter")) y++; else y--;

if(x == sizeX+30) dirX = "links";

if(x == 50) dirX = "rechts";

if(y == sizeY+30) dirY = "hinauf";

if(y == 50) dirY = "hinunter";

g.setColor(Color.black); g.drawRect(50,50,sizeX,sizeY);

g.setColor(Color.red); g.fillOval(x,y,20,20);

try {

Thread.sleep(10);

}

catch (InterruptedException e){

System.err.println("sleep exception");

} } } }

9. Dezember 2002

CuP WS 2002/2003 10

Wiederholung des Beispiels aus der 16. Vorlesung: Eine Klasse SchneeFall erweitert die Klasse Applet

Instanzvariable:

Tabelle schneeDaten;

TextField wert;

Methoden:

init: erzeugt ein Objekt der Klasse Tabelle schneeDaten erzeugt ein Objekt der Klasse Label markierung

mit Beschriftung “Zahl eingeben und Komponente anklicken”

und fügt dieses dem Applet hinzu erzeugt ein Objekt der Klasse TextField wert

und fügt dieses dem Applet hinzu aktiviert den ActionListener für das Textfeld aktiviert den MouseListener für das Applet

9. Dezember 2002

CuP WS 2002/2003 11

paint: ruft eine Instanzmethode zeigen auf (ist in der Klasse Tabelle zu

deklarieren) der Parameter g der Klasse Graphics wird nur weitergereicht

Für den ActionListener und MouseListener sind noch folgende Methoden zu implementieren:

actionPerformed: übernimmt einen Wert aus dem Textfeld wert und initialisiert damit

die Instanzvariable neuerWert des Objekts schneeDaten

mouseClicked: bestimmt die y-Koordinate des letzten Maus-Klicks und ruft eine

Instanzmethode waehleKomponente mit diesem Pixelwert als Parameter auf (ist in der Klasse Tabelle zu deklarieren)

führt die Methode repaint aus

9. Dezember 2002

CuP WS 2002/2003 12

mouseReleased,

mousePressed,

mouseEntered,

mouseExited

sind weitere Methoden, die vom Interface MouseListener verlangtwerden und daher (wenn auch ohne Funktion) implementiertwerden müssen

9. Dezember 2002

CuP WS 2002/2003 13

Die Klasse Tabelle

Instanzvariable:

int [ ] schnee;

int index, neuerWert, summe;

für die Schneewerte, den Feldindex, den aus dem Textfeld zu

übernehmenden Wert, die Summe aller Schneewerte sowie

tabellenGroesse, startX, startY, feldHoehe, feldBreite zur Vereinbarung von Konstanten

Methoden:

zeigen: hat ein Graphics-Objekt g als Parameter, das benötigt wird um die

Zeichenmethoden drawRect und drawString verwenden zu können zeichnet 7 Rechtecke der Breite 60 und Höhe 20 untereinander übernimmt die Werte aus dem Feld schnee und schreibt sie in die

Rechtecke ruft die Methode addiereWerte auf und gibt Wochenschneefall aus

9. Dezember 2002

CuP WS 2002/2003 14

waehleKomponente: hat die y-Koordinate eines Maus-Klicks als Parameter berechnet den zu dieser y-Koordinate gehörigen index

eines Feldelements von schnee schreibt den Wert der Instanzvariablen neuerWert in das

Feldelement schnee[index]

setzeWert: weist der Instanzvariablen neuerWert jenen Wert zu, der als

Parameter übergeben wird

addiereWerte: berechnet den aktuellen Wert der Instanzvariablen summe durch

Summation der 7 Feldelemente von schnee

9. Dezember 2002

CuP WS 2002/2003 15

Übungsbeispiel für den 2. KNW: Angabe: Schreiben Sie ein Applet zur graphischen Darstellung einer

Analoguhr unter Verwendung des Timers.

Das Ziffernblatt soll ein Kreis mit Mittelpunkt (200,150) und Radius 100

Pixel sein.

Der Sekundenzeiger - eine Linie vom Mittelpunkt des Kreises zu einem

am Kreis befindlichen Punkt (Länge 100 Pixel) - soll im Sekundentakt

um 6° (also eine Sekunde) weiterhüpfen.

Der Minutenzeiger soll die Länge 80 Pixel haben und einmal pro Minute

um 6° weiterhüpfen.

Den Stundenzeiger der Länge 70 Pixel lassen Sie der Einfachheit halber

einmal pro Stunde um 30° weiterhüpfen.

Verwenden Sie eine Hilfsklasse namens Uhr,

welche die Methoden zum Zeichnen des Ziffernblatts und der drei Zeiger

bereitstellt. Eine weitere Methode zum Mitzählen der verstrichenen

Sekunden, Minuten und Stunden könnte sich als praktisch erweisen.

9. Dezember 2002

CuP WS 2002/2003 16

import java.awt.event.*; import java.awt.*; import java.applet.Applet;

import javax.swing.*;

public class Analoguhr extends Applet implements ActionListener{

private Timer timer;

Uhr meineUhr=new Uhr();

public void init(){

timer = new Timer(1000,this); timer.start();

}

public void paint(Graphics g){

meineUhr.tick();

meineUhr.ziffernblatt(g);

meineUhr.sekundenzeiger(g);

meineUhr.minutenzeiger(g);

meineUhr.stundenzeiger(g);

}

public void actionPerformed(ActionEvent e){

if(e.getSource() == timer) repaint();

}

}

9. Dezember 2002

CuP WS 2002/2003 17

class Uhr{

int sek=0,min,std;

public void tick(){

sek++;

if (sek==60)

{

min++; sek=0;

}

if (min==60)

{

std++; min=0;

}

if (std==12) std=0;

}

public void ziffernblatt(Graphics g){

g.drawOval(100,50,200,200);

}

9. Dezember 2002

CuP WS 2002/2003 18

public void sekundenzeiger(Graphics g){ int xSek=(int)(200.0 + 100.0*Math.sin(2.0*Math.PI*sek/60.0)); int ySek=(int)(150.0 - 100.0*Math.cos(2.0*Math.PI*sek/60.0)); g.drawLine(200,150,xSek,ySek); }

public void minutenzeiger(Graphics g){ int xMin=(int)(200.0 + 80.0*Math.sin(2.0*Math.PI*min/60.0)); int yMin=(int)(150.0 - 80.0*Math.cos(2.0*Math.PI*min/60.0)); g.drawLine(200,150,xMin,yMin); }

public void stundenzeiger(Graphics g){ int xStd=(int)(200.0 + 70.0*Math.sin(2.0*Math.PI*std/12.0)); int yStd=(int)(150.0 - 70.0*Math.cos(2.0*Math.PI*std/12.0)); g.drawLine(200,150,xStd,yStd); }}

9. Dezember 2002

CuP WS 2002/2003 19

Ein weiteres Beispiel:Angabe: Schreiben Sie ein Applet, welches ein Spiel mit einem einarmigen

Banditen simuliert.

Über ein Textfeld soll der einzuwerfende Geldbetrag - dieser betrage einen

Euro - eingelesen werden, sobald ein Button “Neues Spiel” gedrückt wird.

Drei weitere nebeneinander plazierte Schaltflächen sollen die Bedienung

des (virtuellen) Spielautomaten erlauben. Beim Einwurf von einem Euro

sind 3 Knopfdrucke erlaubt.

Beim Drücken jedes der drei Buttons soll eine Zufallszahl im Bereich

1 bis 7 generiert werden und jeweils unterhalb der entsprechenden

Schaltfläche ausgegeben werden.

Bei drei gleichen Zufallszahlen ergibt sich ein Gewinn von 10 Euro, bei

zwei gleichen ein Gewinn von 2 Euro. Der Gewinn (oder Verlust) soll in

Form eines Antworttextes ausgegeben werden.

Eine Hilfsklasse Automat soll die Methoden des Spielautomaten

bereitstellen.

9. Dezember 2002

CuP WS 2002/2003 20

import java.awt.event.*; import java.awt.*; import java.applet.Applet;

public class Bandit extends Applet implements ActionListener{ private TextField eingabe; private Button k1, k2, k3, neuesSpiel; String muenze; int gespielt=0; Automat a=new Automat();

public void init(){eingabe=new TextField(2); add(eingabe);k1=new Button("Zahl 1"); add(k1); k1.addActionListener(this);k2=new Button("Zahl 2"); add(k2); k2.addActionListener(this);k3=new Button("Zahl 3"); add(k3); k3.addActionListener(this);neuesSpiel=new Button("Neues Spiel"); add(neuesSpiel);neuesSpiel.addActionListener(this);

} public void actionPerformed(ActionEvent e){ Graphics g=getGraphics(); if (e.getSource() == k1 && !a.gameOver){ a.zufallszahl(g,1); gespielt++; }

9. Dezember 2002

CuP WS 2002/2003 21

if (e.getSource() == k2 && !a.gameOver){ a.zufallszahl(g,2); gespielt++; } if (e.getSource() == k3 && !a.gameOver){ a.zufallszahl(g,3); gespielt++; } if (e.getSource() == neuesSpiel){ gespielt=0; muenze=eingabe.getText(); if (muenze.equals("1")){ a.gameOver=false; a.spiel(g); } else{ a.gameOver=true; g.clearRect(100,90,200,100); g.drawString("Bitte 1 Euro einwerfen!!!",100,150); } } if (gespielt==3){ a.gameOver=true; a.gewinnausgabe(g); } }}

9. Dezember 2002

CuP WS 2002/2003 22

class Automat{ int [] zahl=new int[3]; boolean gameOver = true;

public void spiel(Graphics g){ zahl[0]=8; zahl[1]=9; zahl[2]=10; g.clearRect(100,90,200,100); } public void zufallszahl(Graphics g, int i){ zahl[i-1]=(int)(Math.random()*7+1); g.clearRect(100+i*40,90,20,20); g.drawString(Integer.toString(zahl[i-1]),100+i*40,100); } public void gewinnausgabe(Graphics g){ if (zahl[0]==zahl[1] && zahl[1]==zahl[2]) g.drawString("Sie haben 10 Euro gewonnen!!!",100,150); else if (zahl[0]==zahl[1] || zahl[0]==zahl[2] || zahl[1]==zahl[2]) g.drawString("Sie haben 2 Euro gewonnen!!!",100,150); else g.drawString("Sie haben verloren!!!",100,150); }}

9. Dezember 2002

CuP WS 2002/2003 23

Kontrollfragen

Was ist event-handling?

Welches Paket muss fürs event-handling importiert werden?

Welche Steuerflächen verlangen nach der Schnittstelle ActionListener?

Wie wird ein Textfeld deklariert und instanziert?

Wie heißt die Methode, die Veränderungen in einem Listenfeld detektieren kann?

9. Dezember 2002

CuP WS 2002/2003 24

Was ist bei der Verwendung eines Interface zu beachten?

Welche Schritte sind für die Implementierung eines Timers nötig?

Nennen Sie drei Methoden, die bei der Ausführung eines Java-Applets automatisch aufgerufen werden?

Was bedeutet Vererbung?

Erklären Sie die Begriffe Überschreiben und Überladen.

Frohe Weihnachtenund

einen Guten Rutsch ins Neue Jahr!

... und geniessen Sie die Ferien,

Sie haben sie verdient :)

JK

Recommended