Applets und eine Welle von Repain-Events

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi,

kennt jemand eine Lösung für das Repaint-Problem von Applets. Auch in den neueren
Versionen 1.5.x von JRE ist dieser Bug immer noch vorhanden.
Alles läuft normal, dann auf einmal eine Welle von Repain-Events, bei denen die
Clipping-Area nicht mal begrenzt ist, also komplettes Neuzeichnen der Applet Oberfläche.
Ich kenne es nur von früher, es war bei JDK 1.3 zum Häulen. Es scheint nicht besser
geworden zu sein.

Einfaches Beispiel. Einfach die Konsole dazu öffnen und die Ausgabe beobachten.
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.applet.Applet;
import java.lang.ref.SoftReference;

public class DisplayImage extends Applet {

   private SoftReference imageRef = null;

   public void paint(Graphics g) {
      Image image = (imageRef == null)? null : (Image)(imageRef.get());
      if (image == null) {
         image = getImage(getCodeBase(), "image.jpg");
         imageRef = new SoftReference(image);
      }
      Rectangle clip = g.getClipBounds();
      System.out.println(clip);
      g.drawImage(image,
         clip.x, clip.y, clip.x+clip.width, clip.y+clip.height,
         clip.x, clip.y, clip.x+clip.width, clip.y+clip.height,
         this
      );
      image = null;
   }
}
Code:
<html>
<body>
<applet code=DisplayImage width="900px" height="600px"></applet>
</body>
</html>
und irgendeine JPG-Datei mit 900x600 Pixel in gleiches Verzeichnis kopieren.

Wenn man das Konsolefenster (oder was auch immer) nimmt und das Applet teilweise überdeckt
und dann dieses Fenster verkleinert/vergrössert, wie auch immer, kommt es manchmal zu diesem
Flimmern und in der Konsole kann man dann zig Repains sehen. Es ist einfach irre.

Eine Möglichkeit wäre vielleicht, das Repaint verzögert zuzulassen und alle dazwischen
zu ignorieren. Es bedeutet aber, dass man eben eine Verzögerung von paar Millisekunden
einbaut und mit dem GUI-Thread synchronisieren muss. Das ist auch gaga. :autsch:

Irgendeine Idee?
 

L-ectron-X

Gesperrter Benutzer
Ja! Lerne Java! Und dann wirst du die Funktion der paint()-Methode verstehen.
Auf den Zeitpunkt des Aufrufs hat man nur teilweise Einfluss.

Du sprichst also nicht von einem Bug, sondern von einer Notwendigkeit.
Und gegen das Flackern in Applets schaust du dir am besten mal das DoubleBuffering an.
 
G

Guest

Gast
L-ectron-X hat gesagt.:
Ja! Lerne Java! Und dann wirst du die Funktion der paint()-Methode verstehen.
Soll ich wirklich darauf antworten? :autsch: Cool down Papa. ;)

L-ectron-X hat gesagt.:
Auf den Zeitpunkt des Aufrufs hat man nur teilweise Einfluss.
Du sprichst also nicht von einem Bug, sondern von einer Notwendigkeit.
Und gegen das Flackern in Applets schaust du dir am besten mal das DoubleBuffering an.
Dies ändert nichts an der Tasache, dass unnötigerweise zig Repain-Events kommen.
Ansonsten, was hat hier DoubleBuffering mit java.awt.Applet zu tun?

Ich nehme an, du hast mich missverstanden und das Problem nicht erfasst.
 

L-ectron-X

Gesperrter Benutzer
Guck mal hier, da habe ich mal ein einfaches, nettes Beispiel geschrieben, in welchem demonstriert wird, wie man Einfluss auf den Zeitpunkt des Neuzeichnens nehmen kann bzw. die Anzahl der benötigten Repaints auf ein Mindestmaß reduzieren kann. Außerdem kannst du dir dort eine korrekte Implementierung von DoubleBuffering ansehen: http://www.java-forum.org/de/viewtopic.php?p=182774#182774

BTW werde ich immer sauer, wenn einer daher kommt und erzählt, er hätte einen Bug gefunden, der seit 3 Versionen nicht behoben wurde und darauf beharrt, dass er ja keinen Fehler gemacht haben kann und/oder sich ausreichend belesen und Gedanken gemacht hat.
 
G

Guest

Gast
L-ectron-X hat gesagt.:
Guck mal hier, da habe ich mal ein einfaches, nettes Beispiel geschrieben, in welchem demonstriert wird, wie man Einfluss auf den Zeitpunkt des Neuzeichnens nehmen kann bzw. die Anzahl der benötigten Repaints auf ein Mindestmaß reduzieren kann. Außerdem kannst du dir dort eine korrekte Implementierung von DoubleBuffering ansehen: http://www.java-forum.org/de/viewtopic.php?p=182774#182774

BTW werde ich immer sauer, wenn einer daher kommt und erzählt, er hätte einen Bug gefunden, der seit 3 Versionen nicht behoben wurde und darauf beharrt, dass er ja keinen Fehler gemacht haben kann und/oder sich ausreichend belesen und Gedanken gemacht hat.
Meine Güte, es geht hier nicht um's DoubleBuffering, ich zeichne ja absolut nichts ausser dem
JPG-Bild in dem Applet. Nenne es mal offscreenImage und du hast das gleiche wie in deinem
Code. Sogar etwas effizienter, da nicht immer die gesamte Oberfläche des Applets neugezeichnet
wird, sondern nur die Clipping-Area.

Ich meine nicht ein Flimmern oder Repaint während man ein Fenster drüber bewegt, sondern
nachdem man es wieder losgelassen hat. Dann kommt manchmal eine richtige Repain-Orgie.

Das Appletfenster wird für den Bruchteil einer Sekunde grau (nur Hintergrund) und dann sichtbar
zig mal neugezeichnet.

So sieht es dann aus. Die Zahl dahinter ist die Zeitdifferenz zum letzten Repaint in Millisekunden.
Jeweils 0 und das in ca. zigfacher Ausführung. Danach geht es wieder eine Zeitlang normal.
repaintar9.jpg


Man kann es wie folgt reproduzieren.

- Applet im Browser öffnen
- Java-Konsole öffnen und irgendwo in der Ecke des Applets plazieren
- Eine Ecke der Java-Konsole immer so ziehen, dass es das Applet
etwas überlappt. Einfach verkleinern, loslassen, vergössern loslassen.

Irgendwann mal beim Loslassen kommen die Repaints zig mal hintereinander.
Und dieses Problem kenne ich noch aus den JDK 1.3 Zeiten und es hat absolut
nichts mit DoubleBuffering zu tun.
 
G

Guest

Gast
Noch etwas. Die JPG-Datei hat die passende Auflösung, also 900x600 Pixel,
wird also nicht skaliert.
 

Wildcard

Top Contributor
Die repaints kommen deshalb, weil sie in eine Queue einsortiert werden und abgearbeitet werden sobald der Rechner dazu kommt. Und doch, das ganze hat etwas mit doubleBuffering zu tun und ist auch kein Bug.
 
G

Guest

Gast
Wildcard hat gesagt.:
Die repaints kommen deshalb, weil sie in eine Queue einsortiert werden und abgearbeitet werden sobald der Rechner dazu kommt. Und doch, das ganze hat etwas mit doubleBuffering zu tun und ist auch kein Bug.
Event-Queue hin oder her (ich weiss wie das Ding funktioniert), dreissig komplette Repaints,
wo es nicht nötig ist, sind nicht normal. Während das überlappende Fenster vergrössert oder
verkleinert wird, wird das Applet Fenster neugezeichnet bzw. der geänderte Ausschnitt.
Dies ist vollkommen normal und notwendig. Alles andere ist AWT Murks, den ich verhindern
möchte... und da wären wir bei der Ursprungsfrage.

Hast du es ausprobiert und den Fehler nachvollziehen können?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
L Applet Wo loggt log4j bei Applets Allgemeine Java-Themen 0
D Textfelder in Applets verschieben Allgemeine Java-Themen 1
J Ältere applets ausführen? Allgemeine Java-Themen 0
Developer_X Java Applets in Browser starten Allgemeine Java-Themen 9
R Applets & SEO bzw. Pagerank? Allgemeine Java-Themen 2
E grundkurs-java.de: Applets funktionieren nur teilweise Allgemeine Java-Themen 3
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
M Applets Allgemeine Java-Themen 4
S Mittels eines Applets Bilder generieren die in einer Webseite angezeigt werden..? Allgemeine Java-Themen 8
D Ich möchte meine *.java Dateien in Applets "umschreiben. Aber wie? Allgemeine Java-Themen 3
R Kann ich die jars eines Applets auf verschiedenen Domains hosten? Allgemeine Java-Themen 2
G java-applets und browser Allgemeine Java-Themen 12
R Signatur fuer Applets. Allgemeine Java-Themen 5
R Testen von Applets - versch. Browser und Java Versionen? Allgemeine Java-Themen 4
M Verbieten Applets die Nutzung von Commons Logging? Allgemeine Java-Themen 7
G Sind Applets noch uptodate Allgemeine Java-Themen 24
G Aktuallisierung von Applets? Allgemeine Java-Themen 8
L KeyEvents in Applets Allgemeine Java-Themen 7
S grafisch programmieren aber nicht applets Allgemeine Java-Themen 13
Chris_1980 Applets laufen bei mir nicht im IE 7 Allgemeine Java-Themen 2
V Java applets unter ubuntu im Browser anzeigen Allgemeine Java-Themen 9
W Zugriff auf HTML - Tags über Applets Allgemeine Java-Themen 2
S Kein Sound in Java Applets unter Win 9x Allgemeine Java-Themen 4
D Warum Applets signieren ? Allgemeine Java-Themen 2
M Fehler beim Start des Chat-Applets von java-forum.org Allgemeine Java-Themen 10
T JEditorPane oder JTextPane Applets und Flash anzeigen Allgemeine Java-Themen 7
K Problem mit Applets unter Windows XP Allgemeine Java-Themen 2
R Signieren von Java-Prog. oder Applets - Zugriff auf dlls Allgemeine Java-Themen 8
L Status eines Applets sichern Allgemeine Java-Themen 6
M Seit Neuinstallation von Windows funktionieren Applets nicht Allgemeine Java-Themen 3
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
berserkerdq2 Gibt es eine saubere Dokumentation von Jfoenix? Allgemeine Java-Themen 1
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
T Eine Frage des Designs Allgemeine Java-Themen 2
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
H Eine Linie verkürzen Allgemeine Java-Themen 5
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
berserkerdq2 Wie mache ich in IJVM eine if verzweigung? Allgemeine Java-Themen 27
F Gibt es mittlerweile eine Alternative zu DaisyDiff Allgemeine Java-Themen 2
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
F Kennt ihr eine Library um 2 HTML Seiten zu diffen? Allgemeine Java-Themen 8
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Tobero Wie kann man eine Poisson Disc Sampler? Allgemeine Java-Themen 7
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Drachenbauer warum bekomme ich hier eine NullPointerException Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
I Eine Anwendung so gut wie möglich beschützen Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Login in eine Webseite mit Java Allgemeine Java-Themen 3
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
M Schlüsselworte Was ist eine Java Spezifikation + JSR? Allgemeine Java-Themen 11
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben