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