Applet Frage (Animation) Double Buffer?

Status
Nicht offen für weitere Antworten.
J

JavaEc

Gast
Möchte in Java eine Analoguhr programmieren, jedoch weiß ich nicht so genau wie ich die Bewegungen der Zeiger realisieren soll. Nachdem ich das Ziffernblatt entworfen hatte (g.drawArc (0,0,400,400,360,0) und alle drei Zeiger eingezeichnet waren (die Markierungen für die Minutenschritte und Fünfminutenschritte sind auch schon implementiert worden) muss ich jetzt noch die Zeiger irgendwie in Bewegung bekommen. Also z.B. der Sekundenzeiger muss jede Sekunde vorwärts springen und nach sechzig Sekungen muss der Minutenzieger eine Minute weiter...
Was könnte ich zur Realisierung machen?

Wie kann ich bei Java eigendlich die aktuelle Uhrzeit in das Applet implementieren?
 
R

Roar

Gast
mit einem javax.swing.Timer kannst du deine uhr aktualisieren, für das datum schau dir java.util.Calendar und GregorianCalendar an-
 

Maks

Aktives Mitglied
um den Uhrzeiger vorwärts zu bewegen kannst Du immer eine Linie vom Mittelpunkt des Uhrkreises zum Kreisbogen ziehen.
einzelne Punkte auf dem Uhrkreis kann man mit dem Satz von Pythagoras ausrechnen (sinus/cosinus Berechungen in Java solltest Du auch mal probiert haben)

Dann kann man den 360 grad Kreis einfach in 60 Teile einteilen 360/60=6, also hast Du dann für alle 6 Grad eine Linie zu zeichnen, die einfach wieder gelöscht werden muß, wenn der Zeiger weiterspringt.
 
G

Guest

Gast
Die Minutenstriche und die Fünfminutenstriche habe ich in das Ziffernbalatt schon implementiert. Die Ausrichtung der einzelnnen Zeiger auf eine bestimmte Stelle funktioniert ebenfalls.
Wie kann ich den die Position des Zeigers löschen? Muss ich da nicht festlegen, das der Zeiger jede Sekunde gelöscht werden soll und jede Sekunde wieder auf einer anderen Stelle dargestellt werden soll?
 
G

Guest

Gast
Wie genau geht das ?


Habe auf der Javaseite mal geschaut und das hier gefunden:

Code:
int delay = 1000; //milliseconds 
  ActionListener taskPerformer = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
          //...Perform a task... 
      } 
  }; 
  new Timer(delay, taskPerformer).start();


Bei Preform a task habe ich mal
Code:
g..drawLine (200,200,400,50);

eingetragen, aber wenn ich das Applet starte wir der Strich nicht angezeigt.

Wie mach ich das jetzt nun genau, dass der Strich 1 Sekunde angezeigt wird und dann nicht?
 

L-ectron-X

Gesperrter Benutzer
Hast Du es schon mit
Code:
repaint();
versucht?
Damit wird die paint()-Methode aufgerufen und alle Änderungen werden neu gezeichnet. Bevor Du die Uhr neu zeichnest, zeichnest Du den Hintergrund neu. Entweder in dem Du mit
Code:
clearRect(int x, int y, int width, int height)
einen bestimmten Bereich des Applets löscht, oder in der paint()-Methode, in der Du den Hintergrund jedesmal zu aller erst zeichnest.
 
G

Guest

Gast
Danke für deine Antwort!

Wenn ich "repaint" benutze fängt meine Uhr stark an zu flackern. Kann ich da irgendwie noch einen Parameter angeben der Festlegt wie viel mal in der Sekunde die Uhr aktualisiert werden soll?

Ich weiß nicht genau wie das Applet abgearbeitet wird. Habe zuerst eine Methode paint erstellt, wenn ich gedoch jetzt eine andere Methode erstelle wird diese nicht beachtet. Es wird immer nur die erste Methode ausfegührt. Wenn ich ohne Applets programmiere kann ich ja in der main - Methode die anderen aufrufen. Wie funktioniert das bei Applets?
 

L-ectron-X

Gesperrter Benutzer
Hm ja, das Flackern kommt zustande, weil jedes Mal vor dem Zeichnen der Uhr der Hintergrund gezeichnet wird, und somit die Uhr komplett gelöscht wird. Man kann das etwas beeinflussen, in dem man die update()-Methode überschreibt und sich die paint()-Methode möglichst nur auf's Zeichnen konzentriert. Das heißt, keinerlei Berechnungen in der paint()-Methode, sie muss sehr schnell sein. Manchmal liegt es auch nur einfach an der Reihenfolge, des Zeichnens. Außerdem ist der Einsatz eines Puffers zu empfehlen.
Die update()-Methode ist die Reaktion auf repaint(). Also füge sie doch mal ins Applet ein und experimentiere etwas mit paint() und update().
Code:
private Graphics offscreen; // Speicher internes "Zeichenblatt"
private Image buffer; // Pufferbild
...

public void init() {
  buffer = createImage(width, height); //
  offscreen = buffer.getGraphics();
...
}

public void start() {
  repaint() //kann u. U. nötig sein
}

public void update(Graphics g) {
  offscreen.setColor(getBackground());
  offscreen.fillRect(0, 0, width, height); //Hintergrund mit Hintergrundfarbe füllen
  //an dieser Stelle alles auf das offscreen image zeichen und damit das
  //Bild im Hintergrund zum Zeichnen vorbereiten.
  ...

  offscreen.setColor(getForeground()); //Fordergrundfarbe einstellen
  //Texte auf's offscreen image schreiben
  offscreen.drawString("Text", 20, 50);
  ...

  //zum Schluss fertiges Bild auf den Bildschirm kopieren
  g.drawImage(buffer, 0, 0, this);
  
  paint(g);
}
So etwas in der Art könnte helfen. Diese Methode nenn man Double Buffering, also das schreiben in ein Speicher internes Bild (Offscreen Image).

Bei Applets wird in der init()-Methode zunächst erst mal alles initialisiert. Sie kommt dann der main()-Methode von Applikationen in ihrer Funktion recht nahe. Die eigentliche Ausführung des Applets kann dann auch in der start()-Methode erfolgen, die ihrerseits wieder private Methoden oder Objekte aufrufen und benutzen kann. Möglich ist es auch mit Threads zu arbeiten.


Edit: Am 21.07.2004 modifiziert. Code vom Double Buffering verbessert.
Noch ein paar Suchbegriffe für die Forum-Suchfunktion: Applet flackern, Grafik, Image, Bilder, Buffer, bewegen, verschieben
 
G

Guest

Gast
Danke !!!

Jetzt müsste ich nur noch wissen, wie ich einstellen kann das ein Appletupdate jede Sekunde oder jede zweite Sekunde erfolgt. Der Zeider muss ja eine Sekunde lang stehen bleiben und dann verschwinden. Dann sollte 6° später der nächste Zeiger eine Sekunde lang stehn bleiben und dann wieder verschwinden...

Wie könnte ich das jetzt festlegen?
 

L-ectron-X

Gesperrter Benutzer
Um das für Deine Zeiger zu programmieren, brauchst Du auf jeden Fall einen Thread, der jede Sekunde die aktuelle Zeit besorgt und an eine Methode weiter reicht, die das Ergebnis für Deine Zeigerstellung berechnet. Danach zeichnest Du die aktuelle Zeigerstellung.
 
G

Guest

Gast
Mit Threads kanne ich mich nicht so gut aus. Es müsste aber auch ohne irgendwie funktionieren.

Auf der Javaseite gibt es diese Beispiel:

Code:
int delay = 1000; //milliseconds 
  ActionListener taskPerformer = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
          //...Perform a task... 
      } 
  }; 
  new Timer(delay, taskPerformer).start();



Dort kann man doch die Sekunden einstellen. Wie könnte ich das jetzt lösen? Beim Beispiel bedarf es noch an Erklärungshilfe!
 

L-ectron-X

Gesperrter Benutzer
Hm, mag funktionieren, weiß ich nicht. Du kannst aber folgende Klasse rein theoretisch in Dein Applet als innere Klasse programmieren. Also einfach in den Klassenrumpf des Applet einfügen. Ob's funktioniert, weiß ich jetzt aber auch nicht, ist nur so 'ne Idee.
Code:
ZeitGeber zg;
...

class ZeitGeber extends Thread {
  public void run() {
    while(!isInterrupt()) {
      ...
      repaint();
      try {
        Thread.sleep(1000);
      }
      catch(InterruptedException e) {
         interrupt();
      }
    }
  }
}

public void init() {
...
  zg = new ZeitGeber();
}

public void start() {
...
  if(zg == null) {
    zg = new ZeitGeber();
  }
  zg.start();
}

public void stop() {
  zg.interrupt();
  zg = null;
}
Kannst Du ja mal probieren, könnte funktionieren.
 
G

Guest

Gast
Danke, aber mit deiner Lösung habe ich Probleme.

Ich habe mich mal ein bisschen mit dem TimerTask auseinander gesetzt.

Code:
public class TimerTaskDemo extends Applet
{
  public void init ()
  {
    Timer timer = new Timer();
    // nach 2 Sek geht's los
    timer.schedule( new Task(), 2000 );
    // nach 1 Sek geht's los und dann alle 5 Sekunden
    timer.schedule( new Task(), 1000, 5000 );
  }
}


class Task extends TimerTask
{
  public void run()
  {
    System.out.println( "Ausgabe" );
  }
}

Ausgegeben wir immer "Ausgabe" jede 5 Sekunden...


Ich weiß jetzt jedoch nicht genau wie ich die Methode Paint implementieren muss.



Code:
public void paint (Graphics g)
{
g.drawLine (200,200,400,50)
}




Wie kann ich jetzt nun die Methode paint implementieren, anstelle von System.out.println ?
 

Illuvatar

Top Contributor
Die paint-Methode wird ständig vom Betriebssystem (oder so) aufgerufen, d.h. du musst in der run-Methode ein Objekt verändern, dass in der paint-Methode gezeichnet wird bzw. eine Variable hochzählen wo ein Strich gezeichnet wird.
 

L-ectron-X

Gesperrter Benutzer
Illuvatar hat gesagt.:
Die paint-Methode wird ständig vom Betriebssystem (oder so) aufgerufen
paint() ist eine "automatische" Methode, die von der VM aufgerufen wird. Z.B. wenn man die Fenstergröße ändert, oder die Maus über das Applet bewegt.
Eigentlich sollte das Ganze funktionieren, wenn Du in der run()-Methode die repaint()-Methode aufrufst.
Die run()-Methode enthält den Code, den der Thread abzuarbeiten hat.
 
G

Guest

Gast
Danke für eure Antworten!

Repaint() einfach in die run-Methode einfügen geht nicht.

Wie mache ich das jetzt genau was Illuvatar vorgeschlagen hat?
Gibt es vielleicht noch andere Lösungsvorschläge?
 

Illuvatar

Top Contributor
Du machst drei int-Variablen, in denen die Stellung der Zeiger beschrieben wird, und jenachdem zeichnest du das ganze dann in der paint-Methode.
 
G

Guest

Gast
Muss ich nicht vier Variablen anlegen?

Wo muss ich die drei/vier Variablen paltzieren? Static int -Variablen oder in der init Methode oder...?

Ich muss ja die Stellung der Zeiger irgendwie in die Task Klasse bekommen...
 

L-ectron-X

Gesperrter Benutzer
Hier noch mal die ganz einfache, komplette Applet-Klasse, die eine Digitaluhr simuliert. Vielleicht kannst Du ja auch was für Deine analoge Variante gebrauchen.
Code:
import java.awt.*;
import java.applet.*;
import java.util.*;
import java.text.*;

public class DigitalUhrApplet extends Applet {
  ZeitGeber zg;
  String zeit;
  Font schriftart;
  
  class ZeitGeber extends Thread {
    public void run() {
      while(!isInterrupt()) {
        DateFormat df = DateFormat.getTimeInstance();
        zeit = df.format(new Date());
        repaint();
        try {
          Thread.sleep(1000);
        }
        catch(InterruptedException e) {
           interrupt();
        }
      }
    }
  }

  public void init() {
    zg = new ZeitGeber();
    schriftart = new Font("Arial", Font.BOLD, 20);
  }
  
  public void start() {

    if(zg == null) {
      zg = new ZeitGeber();
    }
    zg.start();
  }
  
  public void stop() {
    zg.interrupt();
    zg = null;
  }
  
  public void paint(Graphics g) {
    g.setFont(schriftart);
    g.drawString(zeit, 0, 20);
  }
}
 
G

Guest

Gast
Gibt es sonst noch irgend welche Lösungsmöglichkeiten mit der ich die Zeiger einer Analoguhr in Bewegung setzten könnte?
Am besten ohnen Threads.
 

L-ectron-X

Gesperrter Benutzer
Eine Lösung ohne Threads würde die Maschine zu 100% auslasten, das ist nicht Sinn und Zweck der Sache.
 
G

Guest

Gast
Die CPU-Auslastung ist erst mal nebensächlich. Wenn das Applet läuft kann ich mich an Verbesserungen wagen und mich mit Threads auseinandersetzen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Applet Frage Tools - Maven, Gradle, Ant & mehr 4
deetee Applet Frage Tools - Maven, Gradle, Ant & mehr 2
M Kurze Frage - Applet in Applet starten? Tools - Maven, Gradle, Ant & mehr 10
U Newbie-Frage: Applet "fernsteuern"? Tools - Maven, Gradle, Ant & mehr 4
T Frage wegen Chat-Applet signieren Tools - Maven, Gradle, Ant & mehr 11
S JAVA APPLET While Schleife Frage! Tools - Maven, Gradle, Ant & mehr 3
P allgemeine applet performance frage bezügl. jar Tools - Maven, Gradle, Ant & mehr 2
B Applet: com.sun.deploy.security.BlockedException :-( Tools - Maven, Gradle, Ant & mehr 0
M Applet Applet legt Browser lahm Tools - Maven, Gradle, Ant & mehr 3
J Applet Aus anderer Browserinstanz Applet abfragen Tools - Maven, Gradle, Ant & mehr 2
P Linux Applet/Webstart Schriftunterschiede Tools - Maven, Gradle, Ant & mehr 3
E JMol -Applet Einbindung Tools - Maven, Gradle, Ant & mehr 0
T Applet Applet und IText wirft Incompatible magic value 1008813135 Fehler Tools - Maven, Gradle, Ant & mehr 6
P Applet Java Applet läuft im Browser nicht mehr (HTTPClient - NoClassDefFoundError) Tools - Maven, Gradle, Ant & mehr 3
P Applet Applet Signatur auf Server mit SSL-Zertifikat? Tools - Maven, Gradle, Ant & mehr 7
H Applet Applet wird nicht angezeigt Tools - Maven, Gradle, Ant & mehr 2
M Applet Applet funktioniert in Google Chrome nicht Tools - Maven, Gradle, Ant & mehr 2
O Applet "Anwendung kann nicht ausgeführt werden" Tools - Maven, Gradle, Ant & mehr 6
Q Applet Fehlermeldung bei Applet-Wechsel Tools - Maven, Gradle, Ant & mehr 4
T Daten per POST-Methode aus Java-Applet nach php-Script senden Tools - Maven, Gradle, Ant & mehr 3
R Applet friert Adresszeile des Firefox ein Tools - Maven, Gradle, Ant & mehr 2
K Applet als Jar-Datei in HTML einbinden Tools - Maven, Gradle, Ant & mehr 14
H Applet-Fehlermeldung Tools - Maven, Gradle, Ant & mehr 10
H Applet läuft nicht im Browser Tools - Maven, Gradle, Ant & mehr 3
Q Applet Applet läuft nicht im Browser Tools - Maven, Gradle, Ant & mehr 14
J Applet URL mittels TTS als Applet lesen lassen Tools - Maven, Gradle, Ant & mehr 40
F Applet verwischt, wenn Seite gescrollt wird Tools - Maven, Gradle, Ant & mehr 16
S Applet Applet mit C# öffnen: java.lang.SecurityException: Permission denied (WinXP) Tools - Maven, Gradle, Ant & mehr 8
J Applet-Quellcode einsehen Tools - Maven, Gradle, Ant & mehr 6
E Applet Applet und Datenbank Konzept Tools - Maven, Gradle, Ant & mehr 4
A Applet: Html Datei und Class Datei nicht im selben Verzeichnis Tools - Maven, Gradle, Ant & mehr 2
S Applet soll Textdatei von fremdem Server öffnen Tools - Maven, Gradle, Ant & mehr 8
E Java Applet bearbeiten Tools - Maven, Gradle, Ant & mehr 8
Quasar Wie signiere ich mein Applet richtig? Tools - Maven, Gradle, Ant & mehr 6
M mit Applet Javascript Aufrufen Tools - Maven, Gradle, Ant & mehr 2
S Applet and stop() method und gui blocked Tools - Maven, Gradle, Ant & mehr 4
A Applet Applet startet nach Einbinden auf Website nicht Tools - Maven, Gradle, Ant & mehr 4
A Applet, xxx.jar und hsqldb Tools - Maven, Gradle, Ant & mehr 4
T Webstart oder Applet Tools - Maven, Gradle, Ant & mehr 2
H Applet applet neu laden im browser Tools - Maven, Gradle, Ant & mehr 10
M Applet neustart Tools - Maven, Gradle, Ant & mehr 5
S Applet request unter Linux Tools - Maven, Gradle, Ant & mehr 14
S Applet GUI nicht im Webbrowser sichtbar Tools - Maven, Gradle, Ant & mehr 5
S Mittel Applet Datei an ein Webserver übertragen Tools - Maven, Gradle, Ant & mehr 2
M Applet in ClientServer J2EE Anwendung debugen Tools - Maven, Gradle, Ant & mehr 6
H Java Applet Problem beim einbinden in HTML Tools - Maven, Gradle, Ant & mehr 3
M Java3D Applet flackert wenn ein Button(HTML) gedrückt wird Tools - Maven, Gradle, Ant & mehr 11
S Policy mit Signiertem Applet verteilen Tools - Maven, Gradle, Ant & mehr 9
F Applet findet include nicht Tools - Maven, Gradle, Ant & mehr 15
L PHP + Java Applet Kommunikation Tools - Maven, Gradle, Ant & mehr 9
C Probleme mit Applet mit SQL im Browser Tools - Maven, Gradle, Ant & mehr 4
G Java-Applet Probleme beim Browser Tools - Maven, Gradle, Ant & mehr 14
G Textfile in Applet laden möglich? Tools - Maven, Gradle, Ant & mehr 2
A Java-Applet Sandbox deaktiviren? Tools - Maven, Gradle, Ant & mehr 2
B Java-Applet geht nicht (auf dem Webserver) Tools - Maven, Gradle, Ant & mehr 9
P Applet läuft nicht in Browser Tools - Maven, Gradle, Ant & mehr 21
V JAR-Datei eines (J)Applet funktioniert nicht - Help! Tools - Maven, Gradle, Ant & mehr 19
S Java Applet per Klick starten? Tools - Maven, Gradle, Ant & mehr 6
S Applet geht nicht Tools - Maven, Gradle, Ant & mehr 25
J Applet signieren Tools - Maven, Gradle, Ant & mehr 2
H Applet - Geschicklichkeitsspiel programmieren Tools - Maven, Gradle, Ant & mehr 16
U Jar funktioniert nicht als Applet Tools - Maven, Gradle, Ant & mehr 3
M Java Applet - enforce use of older JRE Tools - Maven, Gradle, Ant & mehr 3
N Wie Java-Programm zu Applet machen?! Tools - Maven, Gradle, Ant & mehr 2
W Webseite aus Applet öffnen Tools - Maven, Gradle, Ant & mehr 3
lumo Applet - resize Tools - Maven, Gradle, Ant & mehr 7
Icewind Applet reagiert nach neu laden der Webseite nicht mehr verlässlich auf KeyEvents Tools - Maven, Gradle, Ant & mehr 6
R Applet mit MySQL Tools - Maven, Gradle, Ant & mehr 3
A jar datei trotz zertifikat nich aus applet ausführbar Tools - Maven, Gradle, Ant & mehr 4
F Fehlende Applet Rechte Tools - Maven, Gradle, Ant & mehr 12
N [Applet] Button wir nach 5 secs Unsichtbar Tools - Maven, Gradle, Ant & mehr 2
N jar -> applet wie setzt man das am leichtesten um Tools - Maven, Gradle, Ant & mehr 7
V applet Java 1.6 -> 1.5 Problem ... wie mit Ant zu lösen? Tools - Maven, Gradle, Ant & mehr 7
F applet als JAR -> AccessControlException Tools - Maven, Gradle, Ant & mehr 3
grudge File in Applet laden Tools - Maven, Gradle, Ant & mehr 4
E Java Applet - Double Buffering Problem (Flackern) Tools - Maven, Gradle, Ant & mehr 6
R Applet mit bestimmter JRE ausführen Tools - Maven, Gradle, Ant & mehr 9
traysa Wie binde ich ein applet in eine jsp Tools - Maven, Gradle, Ant & mehr 3
D Mit dem Applet das DOM manipulieren? Tools - Maven, Gradle, Ant & mehr 3
ABstraCT Applet getCodeBase() Zugriff auf darüberliegendenden Ordner ? Tools - Maven, Gradle, Ant & mehr 1
S Java-Applet Steuerung IO Karte am Drucker-Port Tools - Maven, Gradle, Ant & mehr 4
P URL aus Applet öffnen? Tools - Maven, Gradle, Ant & mehr 7
ABstraCT Mit Applet in ne Datei auf seinem Server schreiben. Tools - Maven, Gradle, Ant & mehr 10
E Verzögerung beim Refresh (F5) mit einem Applet verursachen Tools - Maven, Gradle, Ant & mehr 16
S Fehler in einem Upload - Applet (nicht gelöst!!) Tools - Maven, Gradle, Ant & mehr 2
G Variable an zweites Applet übergeben Tools - Maven, Gradle, Ant & mehr 3
M Dringend: Sehr kompliziertes Applet Problem Tools - Maven, Gradle, Ant & mehr 4
O Javascript kommuniziert mit Applet? Tools - Maven, Gradle, Ant & mehr 2
H Spracherkennung mit Applet / Policy bzw. Security Fehler Tools - Maven, Gradle, Ant & mehr 2
zilti Nerviger Hinweis bei Applet- und WS-Fenstern - wieso? Tools - Maven, Gradle, Ant & mehr 3
S Datei-/Verzeichniszugriff von signiertem Applet Tools - Maven, Gradle, Ant & mehr 6
G Signiertes Applet installieren? Tools - Maven, Gradle, Ant & mehr 3
G Applet mit Parameter aus JavaScript Tools - Maven, Gradle, Ant & mehr 5
A Applet Maus Koordinaten ohne MouseMotionListener Tools - Maven, Gradle, Ant & mehr 3
K Applet in Eclipse funktioniert, im Browser nicht Tools - Maven, Gradle, Ant & mehr 7
T Applet soll Java Programm starten Tools - Maven, Gradle, Ant & mehr 2
S Applet pai.nt? Tools - Maven, Gradle, Ant & mehr 3
S Applet und File-Object? Tools - Maven, Gradle, Ant & mehr 9
T Applet soll Datei lesen (darf es aber nicht.) Tools - Maven, Gradle, Ant & mehr 3
P Java-Applet funktioniert unter WINXP nicht Tools - Maven, Gradle, Ant & mehr 2

Ähnliche Java Themen

Neue Themen


Oben