Java SWT GC, как принудительно очистить образ двойной буферизации? - PullRequest
1 голос
/ 26 октября 2011

Имеем следующий код:

image = new Image(display, imageData);
offScreenImageGC.drawImage(image, 0, 0, imageData.width, imageData.height, imageData.x, imageData.y, imageData.width, imageData.height);
/* Draw the off-screen image to the shell. */
shellGC.drawImage(offScreenImage, 0, 0);

... после выполнения нижней инструкции: shellGC.drawImage(offScreenImage, 0, 0); иногда я получаю изображение видимым на компоненте shellGC, иногда - нет.Я вижу это только тогда, когда я «замедляю» выполнение программы, например, когда я нахожусь в режиме отладки.Но когда быстро бегает - не показывает.Я хочу, чтобы это показывалось принудительно, сбрасывалось или как вы его называете, возможно ли это?

Позвольте мне уточнить, что я хочу добиться - реализовать анимацию, основанную на кадрах, но пока не иметь возможности ее воспроизвестис двойной буферизацией, способной остановить его, показать только определенный кадр с паузой и т. д. ...

Спасибо.

1 Ответ

3 голосов
/ 27 октября 2011

Выяснилось, что это ЕДИНСТВЕННЫЙ БЕЗОПАСНЫЙ способ дублирования буфера с помощью SWT:

canvas.addPaintListener(new PaintListener() {
              public void paintControl(PaintEvent event) {
                 //Obtain the next frame
                ImageData imageData = imageDataArray[iad.imageNumber];
                Image imageFrame = new Image(display, imageData);

                // Create the image to fill the canvas
                Image image = new Image(display, canvas.getBounds());

                // Set up the offscreen gc
                GC gcImage = new GC(image);

                //Draw the image offscreen
                gcImage.setBackground(event.gc.getBackground());
                gcImage.drawImage(imageFrame, 0, 0);

                // Draw the offscreen buffer to the screen
                event.gc.drawImage(image, 0, 0);

                imageFrame.dispose();
                image.dispose();
                gcImage.dispose();
              }
            });

.... при использовании этого метода ТОЛЬКО для двойной буферизации гарантируется кросс-платформенное равное поведение во время выполнения, и непредсказуемое поведение буфера также исчезает.

...