问题描述
现在,我正在阅读《 Eclipse4 PlugIn Development By Example》这本书,在第一个示例中,画布上的时钟将每隔一秒钟通过使用canvas.redrawn()
进行移动,它始终显示一秒钟的时钟,现在我想让画布显示1秒的时钟,然后显示1秒的时钟,显示2秒的时钟... 60秒后将显示60秒的时钟。
现在,在这段代码中,我将SWT.NO_BACKGROUND
用于新的Canvas而不是SWT.NONE
,在Windows中就可以了,但是在Linux上它总是显示一秒钟的时钟。
还有其他方法可以使画布上的先前绘制不干净,并且可以在同一画布上绘制新内容。 非常感谢。
public class ClockView extends ViewPart {
public void createPartControl(Composite parent) {
final Canvas clock = new Canvas(parent, SWT.NONE);
clock.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
int seconds = new Date().getSeconds();
int arc = (15 - seconds) * 6 % 360;
Color blue = e.display.getSystemColor(SWT.COLOR_BLUE);
e.gc.setBackground(blue);
e.gc.fillArc(e.x, e.y, e.width - 1, e.height - 1, arc - 1,
2);
new Thread("TickTock") {
public void run() {
while (!clock.isDisposed()) {
clock.getDisplay().asyncExec(new Runnable() {
public void run() {
if (clock != null
&& !clock.isDisposed())
clock.redraw();
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
return;
}
}
}
}.start();
}
});
}
1楼
SWT.NO_BACKGROUND
用于通过不重绘背景来减少闪烁,但不能保证保留您之前绘制的内容,例如,请参阅的最后一个注释。
SWT.NO_BACKGROUND
的确切行为在平台之间确实有所不同。
您需要在每个绘画请求中绘制所有内容。