Резервный буфер VolatileImage изменить размер
У меня есть небольшая проблема относительно моего буфера в моем Java-апплете. В настоящее время я не рассматривал изменение размера моего апплета во время выполнения. Поэтому размеры панелей меняются, в то время как мой буфер сохраняет свой первоначальный размер. Поэтому перерисовывается только часть моего апплета, которая покрывается размером моего изображения. Тем не менее я попытался переустановить изображение с
private void createBackBuffer() {
backBuffer = this.getGraphicsConfiguration().createCompatibleVolatileImage(getWidth(), getHeight());
defaultComposite = ((Graphics2D) backBuffer.getGraphics()).getComposite();
defaultStroke = ((Graphics2D) backBuffer.getGraphics()).getStroke();
}
// Reinit on resize
public void adjustBackBufferSize() {
if (backBuffer != null) {
backBuffer.flush();
createBackBuffer();
}
}
К сожалению, ведет себя не по достоинству. Как только пользователь начинает перетаскивать, чтобы изменить размер окна браузера, воссоздание означает отсутствие резервного буфера для рисования в течение небольшого промежутка времени. Поэтому панель мерцает, либо с серым фоном, либо с используемыми панелями, либо с фактическим рисунком, который я собираюсь визуализировать.
Я рассмотрел возможность установки смещения на ширину и высоту при изменении размера, чтобы уменьшить мерцание, но это все же не кажется правильным способом, просто обходной путь.
Любые предложения, чтобы изменить размер без мерцания?!
С уважением.
1 ответ
Проблема: нежелательные перерисовки
Мерцание происходит потому, что панель перекрашивает себя. Эти перерисовки нежелательны, так как вы не хотите, чтобы окно начинало мерцать. Если вы отключите автоматическое перекрашивание, то вы будете контролировать, когда ваш апплет будет перекрашиваться. Что вы можете сделать, это изменить свой код для выполнения перерисовки после инициализации нового буфера.
Решение, часть 1: отключить перекрашивание
Вы должны попробовать следующее:
setIgnoreRepaint(true);
Если это ничего не делает, попробуйте добавить это в класс с вашим main()
метод:
static {
System.setProperty("sun.awt.noerasebackground", "true");
}
Это должно отключить автоматическое перекрашивание для вас, но может случиться так, что некоторые другие компоненты должны быть проинструктированы, чтобы они тоже не перерисовывались автоматически. Если вы отправите SSCCE, я могу помочь вам больше. Кроме того, запустите несколько тестов, чтобы увидеть, работает ли ваше приложение по-прежнему правильно - вам может понадобиться добавить несколько repaint()
звонки, например, во время минимизации и восстановления.
Решение, часть 2: перекраска по требованию
Поскольку вы хотите, чтобы перекраска произошла после backBuffer
инициализируется, измените код на:
// Reinit on resize
public void adjustBackBufferSize() {
if (backBuffer != null) {
backBuffer.flush();
createBackBuffer();
repaint();
}
}