Эта проблема очень странная . Проблема возникает не на каждой платформе . У меня это происходит в 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);
}
...
}