JAVA使用swt绘制线条而不删除前一行

时间:2014-05-26 19:12:51

标签: java canvas swt draw

我有一个应用程序,其中onMouseDown开始绘制一条线,并在onMouseUp时绘制线条。我遇到的问题是,当我移动鼠标时,前一行会停留。如何才能正常工作?绘制线条时,先前的内容会被删除? 为了更清楚,我发布了一个screanshots: 1

2

这是我的代码:

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

}

1 个答案:

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