2015-10-05 83 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

你也可以將你的鼠標座標保存在一個數組中。然後使用這些座標來繪製塗料中的點,路徑或多邊形,甚至是控件的畫圖。 –

相關問題