Hallo zusammen,
ich hab mal ein bischen angefangen mit SWT (vorher habe ich nur mit Swing gearbeitet) und wollte nen bischen was zeichnen, möglichst ohne störendes flackern.
Ich hab schon ein Canvas mit SWT.DoubleBuffered benutzt, das ergebnis hat mich aber nicht wirklich überzeugt (flackern trat trotzdem auf).
Jetzt habe ich ein org.eclipse.swt.graphics.Image benutzt, es geht ganz gut, aber ein kleines bischen flackert es immer noch ab und zu...
Wie kann ich das besser machen?
Und außerdem finde ich es etwas umständlich bei SWT ein repaint anzuforder, ich habe das mit
gemacht, gibts vll bessere Alternativen dazu?
Dann hier drunter nochmal das was ich gemacht hab, bei mir flackert es ab und zu ein kleines bischen, nicht super schlimm, aber ich fänds besser, wenns ganz weg wäre.
Das Beispiel sollte eigentlich kompilierbar sein.
Wenn jemand verbesserungsvorschläge hat -> bitte melden, danke
ich hab mal ein bischen angefangen mit SWT (vorher habe ich nur mit Swing gearbeitet) und wollte nen bischen was zeichnen, möglichst ohne störendes flackern.
Ich hab schon ein Canvas mit SWT.DoubleBuffered benutzt, das ergebnis hat mich aber nicht wirklich überzeugt (flackern trat trotzdem auf).
Jetzt habe ich ein org.eclipse.swt.graphics.Image benutzt, es geht ganz gut, aber ein kleines bischen flackert es immer noch ab und zu...
Wie kann ich das besser machen?
Und außerdem finde ich es etwas umständlich bei SWT ein repaint anzuforder, ich habe das mit
Java:
display.asyncExec(new Runnable() {
public void run() {
if (!shell.isDisposed())
shell.redraw();
}
});
Dann hier drunter nochmal das was ich gemacht hab, bei mir flackert es ab und zu ein kleines bischen, nicht super schlimm, aber ich fänds besser, wenns ganz weg wäre.
Das Beispiel sollte eigentlich kompilierbar sein.
Java:
import java.util.Random;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class SWTThreadTest {
public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell(display);
int WIDTH = 1000;
int HEIGHT = 1000;
shell.setSize(new Point(WIDTH, HEIGHT));
shell.open();
final Image img = new Image(display, WIDTH, HEIGHT);
final GC gc = new GC(img);
shell.addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
e.gc.drawImage(img, 0, 0);
}
});
new Thread() {
{
setDaemon(true);
}
public void run() {
Random rnd = new Random();
int d = 1000;
while (true) {
gc.drawLine(rnd.nextInt(d), rnd.nextInt(d), rnd.nextInt(d),
rnd.nextInt(d));
display.asyncExec(new Runnable() {
public void run() {
if (!shell.isDisposed())
shell.redraw();
}
});
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}
}
Wenn jemand verbesserungsvorschläge hat -> bitte melden, danke