Java-апплет мерцает на focusLost и focusGained

У меня есть 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, чтобы предотвратить перерисовку, но я бы предпочел услышать лучшее решение проблемы.


person Warlax    schedule 03.03.2010    source источник


Ответы (1)


Нет необходимости реализовывать двойную буферизацию, Swing делает это автоматически. Вы создаете апплет так же, как вы создаете приложение. То есть вы добавляете компоненты на панель содержимого JApplet.

Если вам нужно выполнить пользовательскую прорисовку, вы переопределяете метод paintComponent() панели JPanel и добавляете панель в апплет.

Прочтите раздел руководства Swing по Custom Painting, где приведены примеры. .

person camickr    schedule 03.03.2010