2012-11-23 25 views
2

我有一個SWT帆布上有一些圖像。我希望我的用戶通過單擊鼠標左鍵並通過移動鼠標打開選擇框來選擇圖像的某些部分。作爲視覺反饋,我想將選定的矩形顯示爲透明覆蓋圖像。如何在SWT畫布上繪製選擇框?

問題是我沒有線索如何最好地實現這一目標?有人可以給我一個提示嗎?

回答

3

我的回答是某種類似於一個我給這裏:

SWTChart mouse event handling

下面的代碼應該給你從哪裏開始的想法。它基本上記住了MouseDown事件的位置。每次拖動鼠標時,都會從起始位置向當前位置繪製一個矩形。一旦發生MouseUp,一切都會停止。

public class DrawExample 
{ 
    private static boolean drag = false; 
    private static int startX; 
    private static int startY; 
    private static int endX; 
    private static int endY; 

    public static void main(String[] args) 
    { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setText("Drawing Example"); 

     final Canvas canvas = new Canvas(shell, SWT.NONE); 
     canvas.setSize(150, 150); 
     canvas.setLocation(20, 20); 
     shell.open(); 
     shell.setSize(200, 220); 

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

      @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(Display.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); 
       } 
      } 
     }); 

     while (!shell.isDisposed()) 
     { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
     display.dispose(); 
    } 
} 

它看起來像這樣:

enter image description here

+0

大。這似乎工作。我將整合它並在完成後立即將您的答案標記爲解決方案。再次感謝。 – ali

+0

@ali不客氣。當我能幫忙時總是很高興。 – Baz