2013-10-14 7 views
0

Я снова к вам при необходимости. hehehe Ive сделал немного SWT, который создает линии, круги, квадраты и треугольники. Я делаю это, беря начальную точку и конечную точку, чтобы нарисовать все эти цифры. после рисования я хочу переместить его по оси x и y. Я поставил здесь ядро, где у них проблемы. Im maing линии, имея слушателя мыши внутри холста, и слушая, когда я нажимаю вниз и отпускаю клик. // Это слушателюИспользование SWT и холста, перемещение линии, нарисованной с помощью кнопки

MasX.addListener (SWT.Selection, новый Listener() {

 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); 
     } 
    } 

} 

Ошибка дает me is Null pointer exception и указывает на gc.drawline()

Надеюсь, что кто-то может мне помочь: D

ответ

1

Event.gc настроен только на SWT.Paint событий, для SWT.Selection слушатель вы используете это null.

Вы можете вызвать один из методов Control.redraw в прослушивателе выбора, чтобы запросить повторную обработку части или всего элемента управления, это приведет к событию рисования.

+0

Я сделал это, но все, что он делает, помещает холст в белый цвет. Действительно хороший ответ. Я до сих пор не знаю, как использовать метод перерисовывания. –

+0

Большое спасибо за вашу помощь. Этот пост помог мне найти ответ, который я искал. Опубликовать ответ в следующем посте. –

0

Как сказал мне Грег, я использовал метод 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

Смежные вопросы