# Java-Applet . zwinkernder Smily!



## Gast (4. Jan 2005)

Hallo,

hab für den Informatikunterricht ein Projekt bekommen, dass ich in einem Applet realisieren soll. Und zwar soll ein Smily gemalt werden, der mit Hilfe eines Timers mit dem Auge zwinkert (simpels Auge mal da, mal nicht)... Ichh ab mir es so gedacht, dass eine Zähl-Variable (hier "x") eins weiterzählt alle 500ms und je nach gerade oder ungerade das Auge öffnet oder zulässt. Dazu wird immer der Konstrukter von Zeichnung aufgerufen, und da dann das "x" ausgewertet. Danach wird neu gezeichnet, Zeichnung gelöscht und neu gezeichnet. Aber leider funktioniert das nicht  Kann mir jemand helfen: 

Hier ist mein Code:





```
import java.awt.*;
 import java.awt.event.*;
 import java.applet.Applet;
 import java.util.*; // Timer Klassen



public class KarteA__Timer_Derivate extends Applet {

   private Timer timer;
   public int x=0;

      public void start() {
      timer = new Timer();  //Instanz f. Timer

       timer.schedule(new TimerTask() {
          public void run() {
            x++;
            repaint();
            add("Center", new Zeichnung () );   // Neue Zeichnung erzeugen
            }
       } , 500, 500);
      }


   public void init () {
       setLayout( new BorderLayout());
       setBackground(Color.blue);
   }


 class Zeichnung extends Canvas {

   int hoehe;
   int breite;
   int temp1 = 0, temp2 = 0;


   public void paint (Graphics blatt) {
     breite = 400;
     hoehe = 300;
     blatt.setColor(Color.red);
     blatt.drawRect(0,0,breite,hoehe);
     blatt.drawRect(3,3,breite-6,hoehe-6);
     beschrifteKarte (Color.green, blatt);
     zeichneKopf (breite/4, hoehe/3, Color.yellow, blatt);
   } // paint

   void beschrifteKarte (Color f, Graphics b) {
     b.setColor (f);
     // b.drawString("Info",breite/5,30);
   }

   public void zeichneKopf (int x, int y, Color f, Graphics b) {
     b.setColor (f);
     b.fillOval (x, y, 60, 60);
     b.setColor(Color.black);
     b.drawLine(x+20, y+45, x+40, y+45); // Mund
     b.drawLine(x+30, y+25, x+30, y+35); // Nase
     b.fillRect(x+17, y+23, 3, 3); // rechtes Auge


     temp1 = x / 2;
     temp2 = temp1 * 2;

     if (temp2 == x) {              // Wenn x gerade, dann auge Auf
     b.drawLine(x+37, y+24, x+43, y+24); // linkes Auge
     }
     
     if (temp2 == x) {
     // hier irgendwas zum auge zu machen
     }

    }
 }
}
```
[/code]


----------



## Roar (4. Jan 2005)

"funktiniert nicht" ist ein bsischen dürftig. was funktionirt nicht? copmilerfehelr? oder kommt ne runtimeexception? oder was?


----------



## gast (4. Jan 2005)

Er kompiliert, es läuft aber er zwinkert einfach nicht und er aktualisiert sich immer nur wenn man das applet fenster verscheibt oder die größe ändert. Compilerfehler = 0


----------



## Spacerat (11. Jan 2005)

Versuch' mal das (so ab Zeile 64 ersetzen):


```
boolean auf = ((x % 2) != 1)? true : false;

if (auf) {
    b.fillRect(x+37, y+23, 3, 3);
} else {
    b.drawLine(x+37, y+24, x+43, y+24);
}
```

Ausserdem ist mir aufgefallen, daß für Auge auf und für Auge zu in deinem Code die selben (die gleichen?? Ich kenn' den Unterschied leider immer noch nicht!) Bedingungen abgefragt werden! ["if (temp2 == x)"]. Einmal solte da doch mit Sicherheit ein != stehen, oder sehe ich das falsch?

Achso... Nochetwas (das soll ja 'ne Animation werden...). In deinem Code wird "paint(g)" ganze 1x ausgeführt (und weitere male, wenn du das Applet-Fenster verschiebst usw.). Für Animationen muß das Applet jedoch "Runnable" implementieren, einen neuen "Thread" [Thread th = new Thread(this);] erzeugen und die Methode "public void run()" erhalten, in welcher repaint() aufgerufen wird.

Wenn das jetzt nicht weiterhilft kann ich nur auf Kapitel 39.4 (Animationen in Applets) der 3. Auflage des Java-Handbuches von Guido Krüger verweisen.


----------

