2017-11-22 4 views
0

私はキャンバスを描画に使用しています。私はこれが正常に動作しますSwtキャレットはキャンバス全体を再描画します

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

で、このキャンバスにキャレットを追加し、私は//その他の描画コードでキャンバスに描くことができ、その後

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

とを追加したキャンバスに描画するにはここでポイント。

ただし、ここでは問題が発生します。 キャレットが点滅するたびに、ペイントイベントが送信されます。私はキャレットの下でコンテンツを再描画する必要があるので、これは理にかなっています。しかし、キャレットの周りの領域をクリアするのではなく、キャンバス全体をクリアします。また、paintEventのx、y、width、heightを見ると、xとyは0、幅と高さはキャンバスのサイズに相当します。

キャレット全体ではなく、カバーする領域を更新するにはどうしたらよいですか?キャレットが点滅するたびにキャンバス全体を再描画するのはちょっと高価です。

追加: 私はアプリを開発するためにEclipseを使用しています。私のアプリの実行環境で SWT_GTK3 = 0に設定した場合、カーソルが点滅するたびにアプリはバックグラウンドを再描画しません。つまり、swt + gtk3のように見えます。

答えて

1

Canvasの作成時にSWT.NO_BACKGROUNDスタイルを設定して、各ペイントのキャンバスのデフォルトの消去を停止します。

Rectange clipping = paintEvent.gc.getClipping(); 

あなたは、これはキャンバスの一部を再描画する必要があるチェックするために使用することができます:ペイントイベントでGC

はあなたに再描画される必要最小限の面積を伝えるためにクリッピング領域が設定されている必要があります。

+0

Linux(Fedora)を実行する2つの異なるコンピュータがあります。 SWT.NO_BACKGROUNDを設定すると、その1つ(再描画なし)で動作しますが、他のコンピュータでは、まったく同じプログラムが、カーソルが点滅するたびにフレーム全体を再描画し続けます。だから私はGtkや私のグラフィックスドライバに問題があると思う。しかしそれは他の質問のためのものです。 – MTilsted

関連する問題