我有一个应用程序,其中onMouseDown开始绘制一条线,并在onMouseUp时绘制线条。我遇到的问题是,当我移动鼠标时,前一行会停留。如何才能正常工作?绘制线条时,先前的内容会被删除? 为了更清楚,我发布了一个screanshots:
这是我的代码:
public class MainClass {
private static Point fp;
private static Point lp;
public static void main(String[] args) {
// TODO Auto-generated method stub
Display d = new Display();
Shell shell = new Shell(d);
shell.setLayout(new FillLayout());
Canvas c = new Canvas(shell, SWT.NONE);
c.setSize(100, 100);
c.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
shell.open();
createPaintListener(c);
createMouseListener(c);
createMoveListener(c);
while(!shell.isDisposed()) {
if(!d.readAndDispatch()) {
d.sleep();
}
}
d.dispose();
}
private static void createMoveListener(final Canvas c) {
// TODO Auto-generated method stub
c.addMouseMoveListener(new MouseMoveListener() {
@Override
public void mouseMove(MouseEvent e) {
// TODO Auto-generated method stub
if (fp != null) {
GC gc = new GC(c);
if(lp != null) {
gc.setXORMode(true);
gc.drawLine(fp.x, fp.y, lp.x, lp.y);
lp = new Point(e.x, e.y);
gc.drawLine(fp.x, fp.y, lp.x, lp.y);
}else {
lp = new Point(e.x, e.y);
}
gc.dispose();
}
}
});
}
private static void createMouseListener(final Canvas c) {
c.addMouseListener(new MouseListener() {
@Override
public void mouseDoubleClick(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDown(MouseEvent e) {
// TODO Auto-generated method stub
if (fp == null) {
fp = new Point(e.x, e.y);
} else {
}
}
@Override
public void mouseUp(MouseEvent e) {
// TODO Auto-generated method stub
GC gc = new GC(c);
gc.drawLine(fp.x, fp.y, e.x, e.y);
gc.dispose();
fp = null;
}
});
}
private static void createPaintListener(Canvas c) {
c.addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
// TODO Auto-generated method stub
}
});
}
}
答案 0 :(得分:1)
从鼠标侦听器中删除所有绘图代码。绘图应该只出现在paint()中。即使你在鼠标监听器中不断更新GC(),在内部,它们都指向输出到屏幕的相同内存缓冲区,因此每次鼠标移动时你都要绘制一条新行。旧的缓冲区。在paint()中,您将获得一个空缓冲区。
private static void createPaintListener(Canvas c) {
c.addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
e.gc.drawLine(fp.x, fp.y, lp.x, lp.y);
}
});
}