2012-11-23 20 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