滚动时避免重新绘制画布

问题描述

我遵循了这个 tutorial,以便在画布上显示一些图形元素: 我来了:
滚动监听器

vBar.addListener(SWT.Selection,new Listener() {
            @Override
            public void handleEvent(Event event) {
                System.out.println("Scroll event");
                int vSelection = vBar.getSelection();
                int destY = -vSelection - origin.y;
                canvas.scroll(0,destY,canvas.getSize().x,canvas.getSize().y,false);
                origin.y = -vSelection;
            }
        });

调整监听器大小

canvas.addListener(SWT.Resize,new Listener() {
            @Override
            public void handleEvent(Event e) {
                System.out.println("Resize event");
                Rectangle client = canvas.getClientArea();
                vBar.setThumb(Math.min(theoreticalScreenHeight,client.height));
                vBar.setPageIncrement(Math.min(theoreticalScreenHeight,client.height));
                vBar.setIncrement(20);
                int vPage = canvas.getSize().y - client.height;
                int vSelection = vBar.getSelection();
                if (vSelection >= vPage) {
                    if (vPage <= 0)
                        vSelection = 0;
                    origin.y = -vSelection;
                }
            }
        });

绘制监听器

canvas.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                System.out.println("Paint event");
                // Costly drawing here
                ...
                // rectangle
                for (int productIndex = 0; productIndex < products.size(); productIndex++) {
                    Product p = products.get(productIndex);
                    ...
                    e.gc.drawRoundRectangle(rectEdge.x,rectEdge.y,(int) productWidth,productHeight,30,30);
                    Point prevSubRectEdge = rectEdge; // Coordinate of each result rectangle
                    for (int resultIndex = 0; resultIndex < productResultsAmount; resultIndex++) {
                        Result result1 = p.getResult(resultIndex);
                        ...
                        e.gc.drawLine(sepStart.x,sepStart.y,sepEnd.x,sepEnd.y);
                        ...
                    }
                    rectEdge.y += 300;
                }
                drawLinks(e);
            }
         });

由于我显示了很多图形元素,所以可能需要一些时间才能显示出来。这就是为什么我想在开始时显示它们一次,因为有很多,我想在画布上垂直滚动,这样我就可以看到我的所有元素。

我的问题是滚动事件触发了重新绘制元素的重绘事件。但由于这是一项昂贵的手术,这不是我想要的。

我想避免这种重绘行为,只需在开始时绘制元素一次,然后滚动即可查看它们。

我已经添加代码,因为我认为有人会想看它,但我认为它并没有真正的帮助,它只是为了显示tutorial 和我的代码间的区别。我认为这更多是关于 swt 理解的问题,关于听众和重绘生命周期? 我还得说,我从不打电话给 canvas.redraw()

这是我的画布的屏幕截图:

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)