Turtlegrafik mit Java

HomeAufgabenDruckenJava-Online

Maus-Events (Mausgesteuerte Programme)


Mit Mouse-Events können mausgesteuerte Aktionen ausgelöst werden. In Java werden Mausereignisse durch den MouseListener und den MouseMotionListener erfasst.
In der Klasse TurtleFrame aus der Turtle-Klassenbibliothek steht zusätzlich die Methode playgroundPressed(x, y) zur Verfügung. Überschreibt man diese Methode, so wird sie bei einem Mausklick vom System aufgerufen und liefert die Koordinaten des Mausklicks.

Im ersten Beispiel wird die Methode playgroundPressed() verwendet. Es ist ausserdem eine schöne Anwendung zur objektorientierten Programmierung. Bei jedem Mausklick wird nämlich eine neue Turtle erzeugt, die einen Stern zeichnet. Da die Methode playgroundPressed() in neuen Threads aufgerufen wird, zeichnen alles Turtles miteinander.

 


// Tu25.java

import ch.aplu.turtle.*;

public class Tu25
{
  private class MyMouseHitListener implements MouseHitListener
  {
    public void mouseHit(double x, double y)
    {
      Turtle = new Turtle(tf);
      t.setPos(x, y);
      draw(t);
    }
  }

  TurtleFrame tf = new TurtleFrame();

  public Tu25()
  {
    tf.addMouseHitListener(new MyMouseHitListener());
    tf.addStatusBar(20);
    tf.setStatusText("Click to create a new star");
  }

  private void draw(Turtle t)
  {
    t.fillToPoint(t.getX(), t.getY());
    for (int = 0; i < 6; i++)
    {
      t.fd(20);
      t.rt(140);
      t.fd(20);
      t.lt(80);
    }
  }

  public static void main(String[] args)
  {
    new Tu25();
  }
}


Erklärungen zum Programmcode:

class Tu25 extends TurtleFrame
TurtleFrame ist ein Grafikfenster, in dem mehrere Turtles erzeugt werden können
playgroundPressed(double x, double y) Liefert die Turtle-Koordinaten des Mausklicks
Turtle t = new Turtle(this) Erzeugt eine neue Turtle im aktuellen TurtleFrame (deswegen this)

 


Die Verwendung der Methode playgroundPressed() ist insbesondere dann vorteilhaft, wenn mit Mausklick mehrere Turtles erzeugt werden. Im folgenden Beispiel wird bei jedem Mausklick eine neue Turtle erzeugt, die einen Kreis zeichnet.


// Tu26.java

import ch.aplu.turtle.*;
import java.awt.Color;

public class Tu26
{
  private class MyMouseHitListener implements MouseHitListener
  {
    public void mouseHit(double x, double y)
    {
      Turtle = new Turtle(tf);
      t.setPos(x, y);
      draw(t);
    }
  }

  TurtleFrame tf = new TurtleFrame();

  private Tu26()
  {
    tf.addMouseHitListener(new MyMouseHitListener());
    tf.addStatusBar(20);
    tf.setStatusText("Click to create a new turtle!");
  }

  private void draw(Turtle t)
  {
    int = (int)(Math.random() * + 2);
    for (int = 0; i < 60; i++)
      t.forward(a).right(6);
  }

  public static void main(String[] args)
  {
    new Tu26();
  }
}
 

 


Im folgenden Beispiel werden die Methoden aus der Java-Klasse Event verwendet. addMouseListener() registriert den MouseListener. Die Koordinaten des Mausklicks werden mit der Callbackmethode playgroundPressed() erfasst. In diesem Beispiel wird nur eine Turtle erzeugt. Diese kann mit Mausklick an eine neue Position im Turtlefenster versetzt werden. Die Turtle zeichnet dabei eine Spur und füllt die Flächen zwischen den Spuren und Punkt (0, 0) mit zufällig gewählten Farben.


// Tu28.java

import ch.aplu.turtle.*;
import java.awt.Color;
import java.awt.event.*;

public class Tu28 extends Turtle
{
  public Tu28()
  {
    fillToPoint(0, 0);
    hideTurtle();
    addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        double = toTurtleX(e.getX());
        double = toTurtleY(e.getY());
        double = distance(x, y);
        double = towards(x, y);
        heading(w);
        setPenColor(new Color((int)(Math.random() * 255),
                     (int)(Math.random() *255), 255));
        forward(d);
      }
    });

    addStatusBar(20);
    setStatusText("Click and create a picture!");
  }

  public static void main(String[] args)
  {
    new Tu28();
  }
}
 





Erklärungen zum Programmcode:

addMouseListener(new MouseAdapter()
Damit die MouseEvents in einem Turtlefenster aktiviert werden, muss mit der Methode addMouseListener() Ein MouseAdapter() registriert werden. Diese enthält die Methode mousePressed(), die beim Drücken der Maustaste aufgerufen wird
public void mousePressed(MouseEvent e)
{
      double x = toTurtleX(e.getX())
      double y = toTurtleY(e.getY())
}
Die Callbackmethode mousePressed() liefert die Koordinaten des Mausklicks als Bildschirmkoordinaten. Mit den Methoden toTurtleX() und toTurtleY() werden diese in die Turtlefenster-Koordinaten konvertiert
d = distance(x, y) Liefert den Abstand von der Aktuellen Turtleposition zur Position des Mausklicks
w = towards(x, y) Liefert die Richtung von der aktuellen Turtleposition zur Position des Mausklicks
heading(w) Dreht die Turtle in die Richtung w

 


Im folgenden Beispiel werden die Felder eines Schachbretts per Mausklick gefärbt. Zur Erfassung der Koordinaten des Mausklicks werden hier die Methoden aus der java-Klasse Event verwendet:
addMouseListener() registriert den MauseListener. In der Callbackmethode mousePressed() werden die Koordinaten des Mausklicks erfasst.

 

// Tu29.java

import ch.aplu.turtle.*;
import java.awt.event.*;
import java.awt.geom.*;


public class Tu29 extends Turtle
{
  private Point2D.Double pFill;

  public Tu29()
  {
    hideTurtle();

    for (int = -180; x < 190; x = + 40)
    {
      setPos(x, -180);
      forward(360);
    }
    right(90);
    for (int = -180; y < 190; y = + 40)
    {
      setPos(-180, y);
      forward(360);
    }

    addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        setScreenPos(e.getPoint());
        if (getPixelColorStr(== "white")
          fill();
      }
    });

    addStatusBar(20);
    setStatusText("Click to fill some fields!");
  }

  public static void main(String[] args)
  {
    new Tu29();
  }
}
 


Erklärungen zum Programmcode:

setScreenPos(e.getPoint())

Die Callbackmethode mousePressed(MouseEvent e) liefert die Bildschirmkoordinaten des Mausklicks. Die Methode setCreenPos() setzt die Turtle an die neue Position

 


Im folgenden Beispiel wird auch die rechte Maustaste verwendet. Klick auf die linke Maustaste bewegt die rote Turtle, rechter Masklick bewegt die blaue Turtle.


 

// Tu30.java

import ch.aplu.turtle.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class Tu30
{
  private Turtle joe = new Turtle();
  private Turtle lea = new Turtle(joe);
  private Point2D.Double pEnd;

  public Tu30()
  {
    joe.addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {

        if (SwingUtilities.isLeftMouseButton(e))
        {
          pEnd = joe.toTurtlePos(e.getPoint());
          draw(joe);
        }

        if (SwingUtilities.isRightMouseButton(e))
        {
          pEnd = lea.toTurtlePos(e.getPoint());
          draw(lea);
        }
      }
    });

    joe.addStatusBar(20);
    joe.setStatusText("Use left click to move red turtle, 
                       right click to move blue turtle!");
    joe.setColor(Color.red);
    joe.setPenColor(Color.red);
    joe.setPos(-40, 0);
    lea.setPos(40, 0);
  }

  private void draw(Turtle t)
  {
    double = t.distance(pEnd);
    double = t.towards(pEnd);
    t.heading(w);
    t.forward(d);
  }

  public static void main(String[] args)
  {
    new Tu30();
  }
}
 



Erklärungen zum Programmcode:

if ( SwingUtilities . isLeftMouseButton ( e )) Überprüft, ob die linke Maustaste gedrückt wurde.
if ( SwingUtilities . isRightMouseButton ( e )) Überprüft, ob die rechte Maustaste gedrückt wurde.

 


Freihandzeichnen mit gedrückten Maustaste. Zur Erfassung der Mausbewegung werden Methoden aus der Java-API verwendet. Man registiert den MouseM bei gedrückten Maustaste. Um die Turtle an die Stelle des Mausklicks zu setzen. muss die Methode mousePressed() verwendet werden.


 

// Tu31.java

import ch.aplu.turtle.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class Tu31 extends Turtle
{
  private Point2D.Double pEnd;

  public Tu31()
  {
    addMouseListener(new MouseAdapter()
    {
      public void mousePressed(MouseEvent e)
      {
        setScreenPos(e.getPoint());
      }
    });

    addMouseMotionListener(new MouseMotionAdapter()
    {
      public void mouseDragged(MouseEvent e)
      {
        pEnd = toTurtlePos(e.getPoint());
        double = distance(pEnd);
        double = towards(pEnd);
        heading(w);
        forward(d);
       }
    });

    speed(-1);
    setColor(Color.red);
    setPenColor(Color.red);
    addStatusBar(20);
    setStatusText("Drag turtle to paint!");
  }

  public static void main(String[] args)
  {
    new Tu31();
  }
}
 



 

Erklärungen zum Programmcode:

setScreenPos(e.getPoint()) Die Methode mousePressed() liefert die Bildschirmkoordinaten des Mausklicks als Point2D. Die Methode setScreePos() konvertiert die Bildschirmkoordinaten in die Turtlefenster-Koordinaten
mouseDragged(MouseEvent e) Calbackmethode, die bei Mausbewegungen aufgerufen wird. Über den Parameter e können die aktuellen Koordinaten des Mauscursors bezogen werden
distance(pEnd)
Liefert den Abstand von der aktuellen Turtleposition zum Punkt pEnd
towards(pEnd) Liefert die Richtung von der aktuellen Turtleposition zum Punkt pEnd

 

Aufgaben