【发布时间】:2019-05-17 13:49:15
【问题描述】:
我正在尝试在 nattable 上渲染加载动画。我使用 OverLayPainter 机制在表格顶部绘制了一个“玻璃窗格”和一些文本,这非常有效:
public class MessageOverlay
implements IOverlayPainter {
....
@Override
public void paintOverlay(final GC gc, final ILayer layer) {
this.currentGC = gc;
this.currentLayer = layer;
if (visible) {
currentGC.setAlpha(200);
currentGC.fillRectangle(0, 0, currentLayer.getWidth(), currentLayer
.getHeight());
drawMessage();
if (withLoadingAnimation) {
showAnimation = true;
}
} else {
showAnimation = false;
}
}
}
但是,paintOverlay 方法不会定期调用,而是在每次表更改时调用。
为了能够显示平滑动画,我添加了一个新线程
final Thread animatorThread = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.interrupted()) {
try {
Thread.sleep(1000 / fps);
} catch (final InterruptedException e) {
break;
}
display.asyncExec(new Runnable() {
@Override
public void run() {
if (showAnimation && !currentGC.isDisposed()) {
final Image currentImage = getNextImage();
final int posX = currentGC.getClipping().width / 2
- currentImage.getBounds().width;
final int posY = currentGC.getClipping().height / 2
- currentImage.getBounds().height;
currentGC.drawImage(currentImage, posX, posY);
}
}
});
}
}
});
animatorThread.start();
如您所见,它尝试访问在paintOverlay 方法中设置的图形上下文this.currentGC。我的问题是,animatorThread 中的currentGC 始终是disposed。
我怎样才能 a.) 确保上下文不在线程中或 b.) 以替代方式解决这个问题?
感谢您的帮助。
【问题讨论】:
-
即使没有处理 GC,这仍然会因“无效线程访问”而失败,因为所有 UI 操作(例如
drawImage)都必须在 UI 线程中完成。 -
啊,你说得对,我已经改变了问题以反映在 ui 线程中运行。