问题描述
我遵循了这个 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()
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)