2017-07-18 13 views
1

SWTのキャンバスの一部を更新しようとしていますが、その方法を理解できません。 "描画操作によって引数で指定された矩形領域に変更可能なレシーバの領域を設定します。矩形にnullを指定すると、受信者のクリッピング領域を元の値に戻します。swt:キャンバスの一部だけを更新(再描画)する方法

だから私はちょうど試してみましたが、ここで運、簡単な例で:

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.*; 
import org.eclipse.swt.graphics.*; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 


public class SimpleCanvas { 

    boolean manualDraw=false; 
    public void run() { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setText("Canvas Example"); 
     createContents(shell); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 

    /** 
    * Creates the main window's contents 
    * 
    * @param shell the main window 
    */ 
    private void createContents(Shell shell) { 
     shell.setLayout(new FillLayout()); 

     // Create a canvas 
     Canvas canvas = new Canvas(shell, SWT.NONE); 

     // Create a button on the canvas 
     Button button = new Button(shell, SWT.PUSH); 
     button.setBounds(10, 10, 300, 40); 
     button.setText("TEST"); 
     button.addListener(SWT.Selection, new Listener() { 
      public void handleEvent(Event e) { 
       switch (e.type) { 
       case SWT.Selection: 
        manualDraw=true; 
        canvas.redraw(); 
        break; 
       } 
      } 
     }); 

     // Create a paint handler for the canvas 
     canvas.addPaintListener(new PaintListener() { 
      public void paintControl(PaintEvent e) { 

       if (manualDraw){ 
        e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_GREEN)); 
        e.gc.setClipping(90,90,60,60); 
        e.gc.drawRectangle(90,90,30,30); 
        return ; 
       } 


       Rectangle rect = ((Canvas) e.widget).getBounds(); 
       e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_RED)); 
       e.gc.drawText("DRAW TEXT", 0, 0); 
       e.gc.dispose(); 
      } 
     }); 
    } 

    /** 
    * The application entry point 
    * 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     new SimpleCanvas().run(); 
    } 
} 

あなたは私が間違ってやっているかを理解する助けてくださいことはできますか?

ありがとうございます。

+0

あなたが期待していることは明確ではありません。 setClippingは現在のGCだけを変更するので、あなたの例ではdrawRectangleだけが影響を受けます。 –

+0

私はタイトルに書いたものを眺めています。キャンバスの一部を更新してください:文字列を残してRectangleを追加してください...しかし、私は答えようとしている問題を発見しました... – navy1978

答えて

1

問題が見つかりました。

canvas.redraw(); 

とそこキャンバスの部分を描くが、その代わりにキャンバスからGCを取得し、そこsetClippingを使用するので、何かを呼び出す:キャンバスの一部のみを更新するために私が呼​​び出す必要はありません。そのように:

public void redrawCanvas (Canvas canvas) { 
     GC gc = new GC(canvas); 
     gc.setClipping(90,90,60,60); 
     gc.drawRectangle(90,90,30,30); 
     gc.dispose(); 
    } 
関連する問題