JApplet не будет запускать JComponent в браузерах, работает в Eclipse - PullRequest
0 голосов
/ 27 марта 2011

В свободное время я программировал прототип игры на Java. Эта игра была только для моих образовательных целей. У меня это работает нормально через файл запуска JNLP в Интернете, а также на моей основной машине, через JFrame.

Мое главное намерение - сделать этот прототип для воспроизведения в веб-браузерах с помощью JApplet. Я кодировал класс под названием AppletPlayer.java. Цель этого класса - по сути служить средством запуска для основного класса моей игры. Файл AppletPlayer.java выглядит примерно так:

public class AppletPlayer extends JApplet {
private Game myGame_; // This is my game's main class
private boolean started_ = false;

public void init() {}

public void start() {

    if (!started_) {
        started_ = true;
        myGame_ = new Game();
        this.setContentPane(myGame_);
        myGame_.start() // I set focusable, and enabled to 'true' in the Game's start method
        // My Game class has no init method. Just a start method that spawns a new thread, that the game runs in
    }
}

Теперь класс Game сам расширяет JComponent и реализует Runnable, KeyListener и FocusListener. Если я запускаю AppletPlayer через Eclipse, он работает как чудо в своем Applet Viewer. Однако при развертывании в Интернете я вижу две вещи:

  1. На машине под управлением Windows XP Апплет загружается, застревает на главном титульном экране, никогда не получая фокуса, следовательно, никогда не регистрирует какой-либо пользовательский ввод.
  2. На машине с Windows 7 апплет загружается, я слышу музыку моей игры, но сам экран апплета отображает простой белый прямоугольник и больше ничего.

Эти проблемы возникают как в IE, так и в Firefox.

Я уже некоторое время просматривал Google и StackOverFlow, пытаясь найти решение, но мне не повезло. Я немного незнаком с Апплетами и надеялся на толчок в правильном направлении.

1 Ответ

1 голос
/ 27 марта 2011

Причина может быть одна: Swing не является потокобезопасным, поэтому все изменения в графическом интерфейсе (включая ваши setContentPane) должны происходить в потоке диспетчеризации событий AWT.Метод start() апплета не вызывается в этом потоке.

Оберните все вызовы методов, связанных с GUI, в вызов EventQueue.invokeLater(...) (или invokeAndWait, если вам нужны результаты, и SwingUtilities также имеет эти методы, если хотите) и посмотрите, видите ли вы какие-либо изменения.

...