2013-10-17 6 views
-1

안녕하세요 저는 캔버스 내부에 선, 원, 사각형 및 삼각형을 만들 수있는 작은 프로그램을 만들고 있습니다. 이 모든 것은 GC 이벤트와 2 점 (Sx, Sy)와 (Ex, Ey)를 사용합니다. 캔버스 내부를 클릭하고 선을 드래그하면 이벤트가 터지지 않습니다. 시작점과 끝점 사이에서 기하학적 그림을 선택합니다. 모든 단추를 클릭하여 오른쪽 또는 왼쪽으로 10 픽셀을 업데이트하고 이동하려고하면 null이 아니거나 캔버스에 그려지는 이벤트가 필요합니다. 여기에 약간의 코드가 있습니다. 나는 모든 SX SY EX와 EY를 전역 변수로 갖는다.캔버스에 선을 그리는 이벤트 변수 만들기

canvas.addListener(SWT.MouseDown, new Listener() { 

     @Override 
     public void handleEvent(Event event) { 
      SX = event.x; 
      SY = event.y; 

      textSX.setText(Integer.toString(SX)); 
      textSY.setText(Integer.toString(SY)); 

      drag = true; 
     } 
    }); 

    canvas.addListener(SWT.MouseUp, new Listener() { 

     @Override 
     public void handleEvent(Event event) { 
      EX = event.x; 
      EY = event.y; 

      drag = false; 
     } 
    }); 

    canvas.addListener(SWT.MouseMove, new Listener() { 

     @Override 
     public void handleEvent(Event event) { 
      if(drag) 
      { 
       EX = event.x; 
       EY = event.y; 

       textEX.setText(Integer.toString(EX)); 
       textEY.setText(Integer.toString(EY)); 

       canvas.redraw(); 
      } 
     } 
    }); 

    canvas.addListener(SWT.Paint, new Listener() { 

     @Override 
     public void handleEvent(Event event) { 
      if(drag) 
      { 
       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); 

       } 
      } 
     } 
    }); 

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

     } 

    }); 

명확하지 않은 경우 다음을 요청하십시오. D 사전에 도움을 요청하십시오.

답변

0

좋아 운동을 어떻게하는지 발견했습니다. 나는 canvas.redraw() 메서드를 호출하고 canvas.addPaintListener()를 만들었습니다. 이것은 다시 그리기 (redraw)에 의해 호출되며,이 메서드는 나에게 라인 사용이었던 장소를 업데이트하려고하는 이벤트를 제공합니다. 코드는 다음과 같습니다

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

      } 
     } 
    }); 

이것이 그 방법입니다. 이 메서드를 호출하는 버튼은 다음과 같습니다.

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

     } 

    }); 

희망이 있으면 다음 사람에게 도움이됩니다.

관련 문제