2013-10-14 49 views
0

我在需要的时候再次来找你。 hehehe我已经做了一个小小的SWT,可以画出线条,圆形,正方形和三角形。我通过将起点和终点画出所有这些数字来做到这一点。一旦画出,我想在x和y轴上移动它。我把这里放在我有麻烦的地方。通过在画布中放置一个鼠标监听器来处理线条,以及听到我点击并放开鼠标点击时的声音。 //这是听者使用SWT和画布,用按钮绘制的移动线

MasX.addListener(SWT.Selection,新监听器(){

 public void handleEvent(Event event) { 
      SX += 1; 
      EX += 1; 
      canvas.redraw(); 
      //gc.drawLine(SX, SY, EX, EY); 
      //crearLinea(SX,SY,EX,EY,gc); 

     } 

    }); 

//这是线描方法

public void crearLinea(int SX, int SY, int EX, int EY, GC gc){ 

    int x1 = SX; 
    int x2 = EX; 
    int y1 = SY; 
    int y2 = EY; 
    System.out.println(SX+" "+SY+" "+EX+" "+EY); 
    int cont = 0; 
    float dx, dy, m, y, x; 
    if (x1>x2){ 
     int ax = x2; 
     int ay = y2; 
     x2 = x1; 
     x1 = ax; 
     y2 = y1; 
     y1 = ay; 
    } 
    dx = x2 - x1; 
    dy = y2 - y1; 
    m = dy/dx; 
    if (m>=-1&&m<=1){ 
     y = y1; 
     //System.out.println(m+" "+x1+" "+y1+"....."+x2+" "+y2); 
     for (x = x1 ; x <= x2;x=x+5){ 
      //if (x>=dot&&x<=dot+10||x>=dot*2&&x<=dot*2+10||x>=dot*3&&x<=dot*3+10){ 
       gc.drawLine((int)x, (int)Math.round(y), (int)x, (int)Math.round(y)); 
       y+=m*5; 
      //} 
     } 
    } 
    if(m>1){ 
     x = x1; 
     //System.out.println(m+" "+x1+" "+y1+"....."+x2+" "+y2); 
     for (y = y1 ; y <= y2;y=y+3){ 
      if (cont<=5){ 
      //System.out.println(cont); 
      gc.drawLine((int)Math.round(x), (int)y, (int)Math.round(x), (int)y); 
      cont++; 
      } 
      if(cont>=10){ 
      //System.out.println(cont); 
      cont=0; 
      } 
      if(cont>5){ 
      //System.out.println(cont); 
      cont++; 
      } 
      x+=(1/m)*3; 
     } 
    } 
    if(m<-1){ 
     x = x1; 
     //System.out.println(m+" "+x1+" "+y1+"....."+x2+" "+y2); 
     for (y = y1 ; y >= y2;y--){ 
      if(y%10==0||y%8==0||y%12==0){ 
      gc.drawLine((int)Math.round(x), (int)y, (int)Math.round(x), (int)y); 
      } 
      x-=(1/m); 
     } 
    } 

} 

它给误差我是空指针异常并指向gc.drawline()

希望有人能帮助我:D

回答

1

Event.gc仅针对SWT.Paint事件设置,因为您使用的SWT.Selection听众将为null

您可以在选择侦听器中调用Control.redraw方法之一来请求重绘部分或全部控件,这会生成一个绘画事件。

+0

我这样做,但它所做的只是将画布放在白色。真的很好的回答思想。我仍然不知道如何使用重绘方法。 –

+0

非常感谢您的帮助。这篇文章帮助我找到了我正在寻找的答案。我在下一篇文章中发布答案。 –

0

像Greg告诉我的,我使用canvas.redraw()方法调用canvas.addPaintListener();方法,然后给我的事件即时通讯寻找创建我想要的绘图。下面是代码从按钮调用它:

MasX.addListener(SWT.Selection, new Listener(){ 

     public void handleEvent(Event event) { 
      SX += 10; 
      EX += 10; 
      System.out.println(SX+" "+SY+" "+EX+" "+EY); 
      canvas.redraw(); 
      System.out.println("Aqui 2"); 
      //gc.drawLine(SX, SY, EX, EY); 
      //crearLinea(SX,SY,EX,EY,gc); 

     } 

    }); 

和核心调用所有其他方法,这使得该行广场等

canvas.addPaintListener(new PaintListener() { 

     @Override 
     public void paintControl(PaintEvent event) { 
      if(btnLinea.getSelection()){ 
       gc = event.gc; 

       crearLinea(SX,SY,EX,EY,gc); 

      } 
      if(btnCirculo.getSelection()){ 
       gc = event.gc; 

       crearCirculo(SX,SY,EX,EY,gc); 

      } 
      if(btnCuadrado.getSelection()){ 
       gc = event.gc; 

       crearCuadro(SX,SY,EX,EY,gc); 

      } 
      if(btnTriangulo.getSelection()){ 
       gc = event.gc; 

       crearTriangulo(SX,SY,EX,EY,gc); 

      } 
     } 
    }); 

希望它能帮助任何人:d