Die SpiderBox wird um Threads erweitert
Quellcode [spider-v1_2_bluej/SpiderBox.java ] import java.awt.* ;
import javax.swing.* ;
import java.util.* ;
import java.awt.event.* ;
/**
* Title: spider - SpiderBox
* Description: Projekt zur Einfuehrung der Objektorientierten Programmierung
* Copyright: Copyright (c) 2021
* Company: mezdata
* @author Oliver Mezger
* @version 1.2
*/
public class SpiderBox extends JFrame {
private MyPanel mPan = new MyPanel( ) ;
public SpiderBox( ) {
getContentPane( ) .add ( mPan) ;
addWindowListener( new WindowAdapter ( ) { // Objekt soll beendet werden koennen
public void windowClosing( WindowEvent e) {
System .exit ( 0 ) ;
}
} ) ;
}
}
class MyPanel extends JPanel implements Runnable { // zusaetzliche Schnittstelle Runnable
private JLabel versi = new JLabel ( "Spider 1.2 (c) Oliver Mezger" ) ;
private JButton exit = new JButton ( "Exit" ) ;
private int ortX= 50 ,ortY= 50 ;
private Spider anna = new Spider( 100 ,100 ,50 ,Color .red ) ;
private Spider bert = new Spider( 200 ,200 ,40 ,Color .green ) ;
public MyPanel( ) {
setBackground( Color .yellow ) ;
setLayout( new FlowLayout ( ) ) ;
add( versi) ;
add( exit) ;
exit.addMouseListener ( new java.awt .event .MouseAdapter ( ) {
public void mouseClicked( MouseEvent e) {
System .exit ( 0 ) ;
}
} ) ;
addMouseListener( new java.awt .event .MouseAdapter ( ) {
public void mousePressed( MouseEvent e) {
canvas_mousePressed( e) ;
}
} ) ;
Thread liveDaemon = new Thread ( this ) ; // neuen Thread erzeugen
liveDaemon.start ( ) ; // Thread starten
}
public void paintComponent( Graphics g) {
super .paintComponent ( g) ;
g.setColor ( Color .blue ) ;
g.fillOval ( ortX- 6 , ortY- 6 , 12 , 12 ) ;
anna.malen ( g) ;
bert.malen ( g) ;
}
public void canvas_mousePressed( MouseEvent e) {
ortX= e.getX ( ) ;
ortY= e.getY ( ) ;
anna.gehezu ( ortX,ortY) ;
bert.gehezu ( ortX,ortY) ;
repaint( ) ;
}
public void run( ) { // das ist der Thread, hier steckt das Leben drin
while ( true ) { // solange immer
anna.leben ( ) ; // anna leben lassen
bert.leben ( ) ; // bert leben lasssen
repaint( ) ; // neu zeichnen
try {
Thread .sleep ( 500 ) ; // ein wenig schlafen
}
catch ( InterruptedException ex) {
}
}
}
}
Ergebnis erleben: spider-v1.2.jar
Funktionsweise Threads
Ein Thread ist ein Kind-Prozess, der in dem selben Speicherbereich abläuft wie sein Vater.
In unserem Fall ist es ein Hintergrunds-Prozess der die leben() -Methode der Spinnen aufruft und sich dann für 500 ms schlafen legt. Damit können sich die Spinnen auch ohne Eingaben selbständig bewegen.
Implementieren Sie den Thread und erweitern Sie die Spider-Klasse um die Methode leben(). Die Spinnen sollen auf den blauen Punkt zulaufen. Lösung anzeigen..
Quellcode [spider-v1_2_bluej/Spider.java ]import java.awt.* ;
import java.util.* ;
import java.awt.event.* ;
/**
* @author Oliver Mezger
* @version 1.2
*/
public class Spider {
private int ortX,ortY,groesse,zielX,zielY;
private Color farbe;
public Spider( int x,int y,int gr, Color fa) {
ortX= x;
ortY= y;
groesse= gr;
farbe = fa;
zielX= 100 ;
zielY= 100 ;
}
public void gehezu( int x, int y) {
zielX= x;
zielY= y;
}
public void leben( ) {
if ( zielX < ortX) ortX -= groesse/ 4 ; else ortX += groesse/ 4 ;
if ( zielY < ortY) ortY -= groesse/ 4 ; else ortY += groesse/ 4 ;
}
public void malen( Graphics g) {
g.setColor ( farbe) ;
g.fillOval ( ortX- groesse/ 2 , ortY- groesse/ 2 , groesse, groesse) ;
g.setColor ( Color .black ) ;
g.drawString ( "Viech" ,ortX- 5 ,ortY- groesse/ 2 + 10 ) ;
}
}
Projekt-Lösungen: [spider-v1_2_bluej.zip ] [spider-v1_2_intellij.zip ]
Beispiel-Sequenzdiagramm für den Thread
Erstellt mit Umlet: [https://www.umlet.com ] [Spider12-Sequenzdiagramm.uxf ]