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