Я пытаюсь визуализировать загрузочную анимацию поверх 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();
Как вы можете видеть, он пытается получить доступ к графическому контексту this.currentGC
, установленному в paintOverlay
метод.Моя проблема в том, что currentGC
в animatorThread
всегда disposed
.
Как я могу а.) Убедиться, что контекст не расположен в потоке, или б.) Решить эту проблему альтернативноКстати?
Спасибо за помощь.