2015-10-05 85 views
1

我已经使用this教程创建了自定义视图。我能够在paintControl()方法中绘制我想要的任何东西。我想要做的,是有一个MouseMoveListener除了我PaintListener,应引起一些additinal东西,鼠标悬停:在侦听器方法中使用GC

@Override 
public void createPartControl(Composite parent) { 

    canvas = new Canvas(parent, SWT.NONE); 
    canvas.addPaintListener(new PaintListener() { 
     public void paintControl(PaintEvent e) { 
      // draw something 
     } 
    }); 

    canvas.addMouseMoveListener(new MouseMoveListener() { 
     @Override 
     public void mouseMove(MouseEvent e) { 
      system.out.println(e.x + ", e.y"); 
      // draw something 
     } 
    }); 
} 

是否有可能使用GCmouseMove()方法中,除了现有的绘制形状形状,创建于paintControl()?我尝试将GC设置为实例变量,并将其设置为paintControl()以在mouseOver()中重复使用它,但不幸的是它在该点上是null

+1

您不应该在paintEvents之外使用GC绘图。您想在按下鼠标左键后在画布上绘图? – Kuba

回答

1

作为@Kuba sais,您不能在PaintEvent之外使用GC。

使被重新绘制在画布上,调用其redraw方法形成像这样的鼠标事件:

canvas.addMouseMoveListener(new MouseMoveListener() { 
    @Override 
    public void mouseMove(MouseEvent event) { 
     canvas.redraw(); 
    } 
}); 
1

要画上的任何控制(即绘制,扩展Drawable),你需要创建一个实例GC并使用它来绘制任何你需要的东西。不要忘记处理GC实例。

我已经修改了Snippet10来说明如何做到这一点:

private static boolean mouseDown = false; 

public static void main(String[] args) { 
    final Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setText("Advanced Graphics"); 
    FontData fd = shell.getFont().getFontData()[0]; 
    final Font font = new Font(display, fd.getName(), 60, SWT.BOLD | SWT.ITALIC); 
    final Image image = new Image(display, 640, 480); 
    final Rectangle rect = image.getBounds(); 
    GC gc = new GC(image); 
    gc.setBackground(display.getSystemColor(SWT.COLOR_RED)); 
    gc.fillOval(rect.x, rect.y, rect.width, rect.height); 
    gc.dispose(); 
    shell.addListener(SWT.Paint, new Listener() { 
     public void handleEvent(Event event) { 
      GC gc = event.gc;    
      Transform tr = new Transform(display); 
      tr.translate(50, 120); 
      tr.rotate(-30); 
      gc.drawImage(image, 0, 0, rect.width, rect.height, 0, 0, rect.width/2, rect.height/2); 
      gc.setAlpha(100); 
      gc.setTransform(tr); 
      Path path = new Path(display); 
      path.addString("SWT", 0, 0, font); 
      gc.setBackground(display.getSystemColor(SWT.COLOR_GREEN)); 
      gc.setForeground(display.getSystemColor(SWT.COLOR_BLUE)); 
      gc.fillPath(path); 
      gc.drawPath(path); 
      tr.dispose(); 
      path.dispose(); 
     }   
    }); 
    shell.addMouseListener(new MouseListener() { 
     @Override 
     public void mouseUp(MouseEvent e) { 
      mouseDown = false; 
     } 

     @Override 
     public void mouseDown(MouseEvent e) { 
      mouseDown = true; 
     } 

     @Override 
     public void mouseDoubleClick(MouseEvent e) {} 
    }); 
    shell.addMouseMoveListener(new MouseMoveListener() { 
     @Override 
     public void mouseMove(MouseEvent e) { 
      if (!mouseDown) 
       return; 

      GC gc = new GC(shell); 
      gc.drawPoint(e.x, e.y); 
      gc.dispose(); 
     } 
    }); 

    shell.setSize(shell.computeSize(rect.width/2, rect.height/2)); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    image.dispose(); 
    font.dispose(); 
    display.dispose(); 
} 

注意:每当Paint事件在控制燃煤,您的自定义图纸会丢失。所以也许最好画一幅图像。然后调用控件上的重绘,该控件始终假定它必须绘制其背景,然后在背景上绘制该图像。这样,在每次重绘时,您都可以维护鼠标绘图。

+0

你也可以将你的鼠标坐标保存在一个数组中。然后使用这些坐标来绘制涂料中的点,路径或多边形,甚至是控件的画图。 –

相关问题