2016-05-26 1 views
0

私はキャンバス上のイメージを持っている:GUIボタンが押されるとはSWTのJava:キャンバス上のイメージの上に長方形の選択急速な再描画せずに

canvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE); 
    GridData canvasGridData = new GridData(GridData.VERTICAL_ALIGN_FILL); 
    canvasGridData.verticalSpan = 15; 
    canvasGridData.horizontalAlignment = GridData.FILL; 
    canvasGridData.verticalAlignment = GridData.FILL; 
    canvasGridData.grabExcessHorizontalSpace = true; 
    canvasGridData.grabExcessVerticalSpace = true; 
    canvas.setLayoutData(canvasGridData); 
    canvas.addPaintListener(new PaintListener() { 
     public void paintControl(PaintEvent e) { 
      if (buttonPressed) { 
       GC gc = e.gc; 
       image = GetMyImagetoDisplay(); 
       gc.drawImage(image, 10, 10); 
      } 
     } 
    }); 

、再描画()と呼ばれ、イメージがロードされます。

また、長方形の選択を取得するためのマウスイベントがあります。彼らは、画像上の矩形の選択を描く: canvas.addListener(SWT.MouseDown、新しいリスナー(){

 @Override 
     public void handleEvent(Event event) { 
      startX = event.x; 
      startY = event.y; 

      drag = true; 
     } 
    }); 

    canvas.addListener(SWT.MouseUp, new Listener() { 

     @Override 
     public void handleEvent(Event event) { 
      endX = event.x; 
      endY = event.y; 

      drag = false; 

      canvas.redraw(); 
     } 
    }); 

    canvas.addListener(SWT.MouseMove, new Listener() { 

     @Override 
     public void handleEvent(Event event) { 


      if(drag) 
      { 
       endX = event.x; 
       endY = event.y; 


       canvas.redraw(); 
      } 
     } 
    }); 

    canvas.addListener(SWT.Paint, new Listener() { 

     @Override 
     public void handleEvent(Event event) { 
      if(drag) 
      { 
       GC gc = event.gc; 

       //gc.setBackground(top.getDefault().getSystemColor(SWT.COLOR_BLACK)); 
       gc.setAlpha(128); 

       int minX = Math.min(startX, endX); 
       int minY = Math.min(startY, endY); 

       int maxX = Math.max(startX, endX); 
       int maxY = Math.max(startY, endY); 

       int width = maxX - minX; 
       int height = maxY - minY; 

       gc.fillRectangle(minX, minY, width, height); 
      } 
     } 
    }); 

問題は私は全体でマウスをドラッグすると、画像がフリッカ保持していること、である

。あなたが修正を提案することができ

更新:?

をキャンバスコンストラクタにSWT.DOUBLE_BUFFEREDを渡すことで、ダブルバッファリングを有効に!!!

imageCanvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED); 

答えて

2

同じに2つのSWT.Paintリスナーを追加しているように見え、互いに競合しています。

最初のリスナーは「背景」を塗りつぶし、2番目のリスナーは「前景」を塗りつぶします。あなたが見るちらつきは、2人が交互に絵を描いている可能性が最も高いです。これはCanvasのスタイルとしてSWT.DOUBLE_BUFFEREDを使用してみてください、何も変更しない場合は

canvas.addListener(SWT.Paint, new Listener() { 
    @Override 
    public void handleEvent(Event event) 
    { 
     // paint background 

     if(drag) 
     { 
      // paint foreground 
     } 
    } 
}); 

はただ一つ、塗料リスナーでこのような何かを考えてみましょう。

+2

フリッカ効果を取り除くので、重バッファするために、このコードは私のMac上で以下のランよりますが、マックのデフォルトを言うためだけのノートは、おそらくちらつきと2人のペイントリスナーを扱っています。 2番目のペイントリスナーで背景色を元に戻す必要がありました。 –

+0

良い点 - 私は2人のリスナーをマージしました。残念ながら、それはまだちらつきます。それは私がマウスの動きごとに画像を追加するためです。矩形の選択を処理するためにウィジェットをオーバーレイする必要があるかもしれません –

+1

@Robben_Ford_Fan_boyダブルバッファリングを試みましたか? – Baz

0

これに答えることは非常に簡単でした! CanvasコンストラクタにSWT.DOUBLE_BUFFEREDを渡すことにより、ダブルバッファリングが有効になりました!!!

imageCanvas = new Canvas(top, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED); 

これは完全に

+0

あなたは知っています、私はその答えを言いました... – Baz

+1

@Baz Yep - 私はあなたに今答えました - :) –

関連する問題