2017-11-22 2 views
0

Ich habe ein Canvas, das ich zum Zeichnen verwende. So zeichnen Sie auf der Leinwand ISwt Caret verursacht Neuzeichnen der gesamten Leinwand

canvas.addPaintListener(paintEvent-> { 
    // Misc drawing code here. 
}); 

hinzugefügt haben, und dann füge ich eine caret auf diese Leinwand mit

Caret c = new Caret(canvas,SWT.None); 
c.setBounds(10, 10, 2, 12); 

Dies funktioniert gut, und ich kann an der // Misc Zeichencode auf der Leinwand ziehen hier zeigen.

Aber hier kommt das Problem: Jedes Mal, wenn das Caret blinken, sendet es ein Paint-Ereignis. Das macht Sinn, weil ich den Inhalt unter dem Caret neu zeichnen muss. Aber anstatt nur den Bereich um den Caret zu räumen, wird die gesamte Leinwand gelöscht. Und wenn ich x, y, width, height im paintEvent anschaue, dann sind x und y 0, und width und height entsprechen der Größe des Canvas.

Also wie bekomme ich das Caret, um nur den Bereich zu aktualisieren, der abgedeckt wurde, anstatt die gesamte Leinwand? Es ist ziemlich teuer, die gesamte Leinwand jedes Mal neu zu streichen, wenn das Caret blinkt.

Hinzugefügt: Ich benutze Eclipse, um die App zu entwickeln. Wenn ich in der Laufzeitumgebung für meine App SWT_GTK3 = 0 festlege, zeichnet die App den Hintergrund nicht jedes Mal neu auf, wenn der Cursor blinkt. Es sieht also aus wie ein swt + gtk3 Problem.

Antwort

1

Legen Sie den SWT.NO_BACKGROUND Stil fest, wenn Sie Canvas erstellen, um das standardmäßige Löschen der Zeichenfläche für jede Farbe zu stoppen.

Die GC in der Paint-Ereignis sollte einen Clipping-Bereich Set haben Sie die minimale Fläche zu sagen, dass sein neu gestrichen muss:

Rectange clipping = paintEvent.gc.getClipping(); 

diese Weise können Sie überprüfen, welche Teile der Leinwand neu gezeichnet werden müssen .

+0

Ich habe 2 verschiedene Computer mit Linux (Fedora). Das Einstellen von SWT.NO_BACKGROUND funktioniert auf einem von ihnen (kein Neuzeichnen), aber auf dem anderen Computer zeichnet das exakt gleiche Programm den gesamten Rahmen jedes Mal neu, wenn der Cursor blinkt. Ich denke, es gibt ein Problem mit Gtk oder meinem Grafiktreiber. Aber das ist eine Sache für eine andere Frage. – MTilsted

Verwandte Themen