2016-02-24 11 views
2

Я хочу сделать приложение для рисования форм (прямоугольник, линия, квадрат, стрелка), как в краске с использованием Java SWT Canvas. Я использую события мыши (Up, Down и move), чтобы получить положение холста Y и X. И у меня есть кнопка для каждого типа форм, которые получают положение холста canvas и рисуют выбранную форму, используя события мыши. Моя проблема заключается в том, что когда я рисую первую форму (круг, квадрат, линия), все работает, но когда рисуется вторая, первая стирается. Как я могу сделать первую форму на рисованной после перерисовывания холста?Java SWT Drawing Shapes на холсте с событиями мыши

Переменные:

private static boolean drag = false; 
private Canvas compCanvas; 
private Button btnSend, btnAdd,btnFreeHand,btnArrow,btnCircle,btnSquare,btnLine; 
private Composite mainPanel; 
compCanvas = new Canvas(mainPanel, SWT.NONE); 

mouseEvents():

private void mouseEvents(){ 
    compCanvas.addListener(SWT.MouseDown, new Listener(){ 
     public void handleEvent(Event e){ 
      System.out.println("Mouse event on canvas DOWN: X VALUE:"+e.x+"Y VALUE:"+e.y); 
      startY = e.y; 
      startX = e.x; 
      drag = true; 
     } 
    }); 

    compCanvas.addListener(SWT.MouseUp, new Listener(){ 
     public void handleEvent(Event e){ 
      System.out.println("Mouse event on canvas UP: X VALUE:"+e.x+"Y VALUE:"+e.y); 
      endY = e.y; 
      endX = e.x; 
      drag = false; 

      //compCanvas.redraw(); 
     } 
    }); 

    compCanvas.addListener(SWT.MouseMove, new Listener(){ 
     public void handleEvent(Event e){ 
      System.out.println("Mouse event on canvas MOVE: X VALUE:"+e.x+"Y VALUE:"+e.y); 
      if(drag){ 
       endY = e.y; 
       endX = e.x; 

       compCanvas.redraw(); 
      } 
     } 
    }); 
}; 

btnSquare.selectionListener() и Декларация:

btnSquare = new Button(compSendAdd, SWT.NONE); 
      btnSquare.setLayoutData(new RowData(25, 25)); 
      btnSquare.setImage(squareIcon); 
      btnSquare.addSelectionListener(new SelectionListener(){ 
       private void btnSquare(){ 
        mouseEvents(); 
        //LightweightSystem lws = new LightweightSystem(compCanvas); 
        compCanvas.addListener(SWT.Paint, new Listener(){ 
         public void handleEvent(Event e){ 
          if(drag){ 
           GC gc = e.gc; 
           //gc.setAlpha(128); 
           int minX = Math.min(startX,endX); 
           int minY = Math.min(startY,endY); 
           int maxX = Math.max(startX, endX); 
           int maxY = Math.max(startY, endY); 
           int width = maxX - minX; 
           int height = maxY - minY; 
           gc.fillRectangle(minX, minY,width,height); 
          } 
         } 
        }); 
       } 
       public void widgetSelected(SelectionEvent event) { 
        btnSquare(); 
       } 
       public void widgetDefaultSelected(SelectionEvent event) { 
        btnSquare(); 
       } 
      }); 

ответ

0

По умолчанию управления заполняются текущим цветом фона каждый раз вызывается прослушиватель SWT.Paint. Вам нужно отключить это.

Сделайте это, указав SWT.NO_BACKGROUND стиль на Canvas

compCanvas = new Canvas(mainPanel, SWT.NO_BACKGROUND); 

Вам также необходимо заполнить фон в первый раз, холст нарисованный.

+0

Привет, Грег, спасибо за ваш ответ. Я указываю 'SWT.NONE', потому что я устанавливаю фоновое изображение Canvas на App Launch и перед тем, как мне нужно нарисовать формы над изображением, и мне нужно его сохранить; Настройка фона фона на холсте: 'compCanvas.setBackground (новый цвет (Display.getDefault(), 54, 54,54)); compCanvas.setBackgroundImage (canvasBcg); compCanvas.setBackgroundMode (SWT.INHERIT_FORCE); ' – vinistig

+0

Есть ли другой способ сделать это? – vinistig

0

Создание класса формы с х, у, ширина, высота поля

class Shape { 
    public int x; // coordiates 
    public int y; 
    public int width; 
    public int heigth; 
    String type; // "rect" for example 
    public Shape(int x, int y, int width, int height, String type) { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.heigth = height; 
     this.type = type; 
    } 
} 

После мыши до магазина фигуры в списке в соответствии с которой кнопка выбрана

List<Shape> shapes = new ArrayList<Shape>(); 
shapes.add(new Shape(x, y, width, height, getType())); 

В PainListener Вы ДОЛЖНЫ перерисовывать все формы из вашего списка

for(Shape s: shapes) { 
    //draw shape s 
} 

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

  • Нет связанных вопросов^_^