Java-апплет мигает на Mac

Эта проблема очень странная . Проблема возникает не на каждой платформе . У меня это происходит в Google Chrome с использованием MacOSX, но не происходит в Safari. Для друга, использующего Windows, в Google Chrome все работает отлично. У меня также есть друг, который использует MacOSX, и у него он мигает в Chrome, Safari и Firefox. У нас обоих MacOSX Lion. Я не вижу никакой ссылки. Не могли бы вы проверить это и сообщить, произойдет это или нет, и на какой вашей платформе (это должно произойти в течение максимум 30 секунд )?


Я нашел эту тему на форумах Oracle . Судя по всему, это хорошо -известная проблема в MacOSX из-за того, что Java создает дочерний процесс, а Safari не разрешает это в качестве функции безопасности. Однако проблема также возникает в Chrome и Firefox на Mac (и не возникает в Safari, как у меня ). Поди разберись… Буду рад услышать чье-нибудь мнение по этому поводу.


В настоящее время я делаю небольшую игру Java Tetris, и моя проблема заключается в том, что экран иногда мигает в версии апплета (, расширяющей JApplet ). Все работает нормально, когда я запускаю его в JFrame на своем компьютере.

Апплет можно посмотреть и использовать на этом сайте:http://mtetris.herokuapp.com/(Я не пытаюсь ничего рекламировать или продвигать, я просто разместил его так, чтобы люди могли реально увидеть, в чем проблема ).

(Существует также еще одна проблема, заключающаяся в том, что апплет не получает фокус мыши должным образом, когда он не загружается автоматически, т. е. когда браузер блокирует его и спрашивает пользователя, разрешено ли ему загрузить его. Если номера «начального уровня» не выделяются должным образом, вот почему.)

Вот способы, которые я пробовал, но которые не устранили проблему мерцания.:

  • Настройка фона апплета, корневой панели, панели содержимого, каждого компонента в апплете черным цветом.
  • Переопределение метода paint()апплета и выполнение в нем двойной буферизации (Я прокомментировал эту часть в текущем коде, так как это ничего не улучшало)
  • Переопределение метода update()апплета и прямой вызов paint()в it (эта проблема исправлена ​​в соответствии с описанием метода в официальной документации)

Весь исходный код можно найти на github по адресу эта страница . Класс, расширяющий JApplet, называется TetrisApplication. Исходный код еще не очень чистый, так что извините за это.


Вот как я реализовал двойную буферизацию

public class TetrisApplication extends JApplet {

    //  the dimension of the applet
    private Dimension dimension;
    // image used for double buffering
    Image offscreen;
    // the second buffer
    Graphics bufferGraphics;

    public void init() {
        super.init();
        dimension = getSize();
        offscreen = createImage(dimension.width, dimension.height);
        bufferGraphics = offscreen.getGraphics();
       ...
    }

    public void paint(Graphics g){
        bufferGraphics.clearRect(0, 0, dimension.width, dimension.height);
        super.paint(bufferGraphics);
        g.drawImage(offscreen, 0, 0, this);
    }
   ...
}

5
задан Heretic Monkey 27 May 2016 в 21:35
поделиться