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.
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?
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>
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?