У меня есть простое приложение Swing/AWT, которое работает в полноэкранном режиме в Windows. У меня есть несколько разных PNG-файлов, которые он загружает как свое собственное фоновое изображение в зависимости от контекста.Как загрузить изображения в фоновом режиме в приложении Swing?
Он загружает их так:
BufferedImage bufferedImage;
bufferedImage = ImageIO.read(getClass().getResource("/bg1.png"));
Image bgImage1 = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
bufferedImage = ImageIO.read(getClass().getResource("/bg2.png"));
Image bgImage2 = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
bufferedImage = ImageIO.read(getClass().getResource("/bg3.png"));
Image bgImage3 = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
А потом рисует их так:
window.repaint();
graphics.drawImage(bgImage1, 0, 0, null);
// draw some other stuff too, like text
И только тщательное, window
является JWindow
переменной и graphics
является Graphics2D
переменной.
Проблема, с которой я сталкиваюсь, возникает, когда я выключаю одно из фоновых изображений для другого. Первый раз, когда я переключатель, называя что-то вроде этого:
window.repaint();
graphics.drawImage(bgImage2, 0, 0, null);
// draw some other stuff too, like text
... весь экран становится белым в течение секунды. И затем он успешно показывает изображение, но это мерцание действительно раздражает. Я предполагаю, что, поскольку изображения относительно большие и имеют высокое разрешение (2560x1440), для загрузки их требуется около секунды, и масштабируйте их до соответствующего размера.
Как я могу заставить его загружать эти изображения беззвучно? Как в ... как мне избежать рисования белого белого экрана в течение секунды, в первый раз он отображает новое фоновое изображение? Все последующие времена уже мгновенные, вероятно, потому, что они действительно захватили их в память в этот момент. Но просто называть getScaledInstance
, по-видимому, недостаточно, чтобы поместить вещи в память, потому что она на самом деле не мерцает, пока я не позвоню drawImage
по линии.
Вам следует подумать о предоставлении запускаемого примера, демонстрирующего вашу проблему. Одна из проблем, которые могут возникнуть у вас, заключается в том, что вы не передаете ImageObserver методу drawImage ... – MadProgrammer