Hallo
Erstaunlich, über welch vermeintlich elementare Probleme man stolpert, wenn man sich mal von Swing <3 abwendet, und versucht, mit SWT etwas zu zeichnen:
Das folgende Beispiel sollte nur eine Linie zeichnen. Die 'Transform' für den GC wird dabei ständig um 1 Grad weitergedreht. Immer wenn der Winkel bei 45°+n*90° liegt (die Linie also diagonal stehen sollte), "verschiebt" sich die Zeichnung ein Stück und die Linie wird an eine falsche Position gezeichnet :autsch:
Hat jemand eine Idee, woran das liegt? Vielleicht an irgendwelchen "hardwarenahen" und ggf. Betriebssystemspezifischen Aspekten von 'Transform'? Sollte man 'Transform' vielleicht gar nicht benutzen? Welche Möglichkeiten gibt es, mit SWT eine beliebig transformierte Vektorgrafik zu zeichnen, ohne dass die Linien kreuz und quer verlaufen oder plötzlich verschwinden? Oder braucht man tatsächlich solche Krämpfe wie den "Graphics2DRenderer" von diesem Beispiel um "schöne" Grafiken mit SWT zeichnen zu können? Bei Linien könnte man die Endpunkte vielleicht noch manuell transformieren, aber bei komplexeren Objekten ist das ja auch keine Option mehr... :bahnhof:
Erstaunlich, über welch vermeintlich elementare Probleme man stolpert, wenn man sich mal von Swing <3 abwendet, und versucht, mit SWT etwas zu zeichnen:
Das folgende Beispiel sollte nur eine Linie zeichnen. Die 'Transform' für den GC wird dabei ständig um 1 Grad weitergedreht. Immer wenn der Winkel bei 45°+n*90° liegt (die Linie also diagonal stehen sollte), "verschiebt" sich die Zeichnung ein Stück und die Linie wird an eine falsche Position gezeichnet :autsch:
Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class RotateTest {
static int angle = 0;
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Matrix Tranformations");
shell.setLayout(new FillLayout());
final Transform transform = new Transform(display);
final Canvas canvas = new Canvas(shell, SWT.DOUBLE_BUFFERED);
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
GC gc = e.gc;
gc.setAdvanced(true);
transform.translate(100, 100);
transform.rotate(1);
angle++;
transform.translate(-100, -100);
gc.setTransform(transform);
gc.drawLine(100, 100, 200, 100);
System.out.println("Angle "+angle);
}
});
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (!display.isDisposed()) {
display.asyncExec(new Runnable() {
@Override
public void run() {
if (!canvas.isDisposed()) {
canvas.redraw();
}
}
});
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
shell.setSize(400, 400);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Hat jemand eine Idee, woran das liegt? Vielleicht an irgendwelchen "hardwarenahen" und ggf. Betriebssystemspezifischen Aspekten von 'Transform'? Sollte man 'Transform' vielleicht gar nicht benutzen? Welche Möglichkeiten gibt es, mit SWT eine beliebig transformierte Vektorgrafik zu zeichnen, ohne dass die Linien kreuz und quer verlaufen oder plötzlich verschwinden? Oder braucht man tatsächlich solche Krämpfe wie den "Graphics2DRenderer" von diesem Beispiel um "schöne" Grafiken mit SWT zeichnen zu können? Bei Linien könnte man die Endpunkte vielleicht noch manuell transformieren, aber bei komplexeren Objekten ist das ja auch keine Option mehr... :bahnhof: