Java-апплет мерцает на focusLost и focusGained - PullRequest
1 голос
/ 03 марта 2010

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

1 Ответ

1 голос
/ 03 марта 2010

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

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

Прочитайте раздел из учебника по Swing на Custom Painting для примеров.

...