У меня есть Java JApplet, встроенный в веб-страницу. Окно JApplet содержит единственный экземпляр класса, который расширяет JPanel — того же размера, что и JApplet. Апплет может создавать всплывающие окна (JFrames), когда пользователь нажимает кнопку на панели.
Каждый раз, когда я нажимаю кнопку, чтобы открыть всплывающее окно, мой апплет мерцает при перерисовке. Он также делает то же самое, когда я снова нажимаю на него или когда он находится в фокусе, и я нажимаю на другое окно - мой вывод: это перерисовка, которая принудительно выполняется в событиях focusLost() и focusGained().
Я реализую двойную буферизацию в методе paint() панели следующим образом:
@Override
public void paint(Graphics g)
{
if(resized)
{
offscreen = createImage(getWidth(),getHeight());
resized = false;
}
Graphics offscreenG = offscreen.getGraphics();
/// DRAW HERE:
// paint the main window contents:
view.paint(offscreenG);
// paint the child components of our panel.
super.paint(offscreenG);
/// FRAW FINISHED
g.drawImage(offscreen,0,0,this);
offscreenG.dispose();
}
Объект представления не является компонентом Swing, а просто классом, который знает, как рисовать все на объекте Graphics.
Метод paint() JApplet не переопределяется.
Вероятно, я мог бы переопределить методы focusGained/focusLost моего JApplet, чтобы предотвратить перерисовку, но я бы предпочел услышать лучшее решение проблемы.