0

暇なときにJavaでゲームのプロトタイプをコーディングしました。このゲームは私の教育目的のためだけのものでした。Web上のJNLP起動ファイル、およびJFrameを介したメインマシンを介して正常に動作しています。

私の主な目的は、JAppletを使用して、このプロトタイプをWebブラウザで再生できるようにすることです。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を実装しています。Eclipseを介してAppletPlayerを起動すると、アプレットビューアの魅力のように機能します。ただし、Webにデプロイすると、次の2つのことがわかります。

  1. Windows XPマシンでは、アプレットがロードされ、メインタイトル画面に留まり、フォーカスを受け取らないため、ユーザー入力の種類を登録することはありません。
  2. Windows 7マシンでは、アプレットがロードされ、ゲームの音楽が聞こえますが、アプレットの画面自体は、真っ白なボックスだけをレンダリングします。

これらの問題は、IEとFirefoxの両方で発生します。

私はしばらくの間GoogleとStackOverFlowを熟読していて、解決策を掘り下げようとしていますが、運がありませんでした。私はアプレットに少し慣れておらず、正しい方向への微調整を望んでいました。

4

1 に答える 1

1

理由として考えられるのは、Swing はスレッドセーフではないため、GUI でのすべての変更 ( を含むsetContentPane) は、AWT イベント ディスパッチ スレッドで発生する必要があることです。start()このスレッドでは、アプレットのメソッドは呼び出されません。

GUI 関連のすべてのメソッド呼び出しを 1 つのEventQueue.invokeLater(...)呼び出し (またはinvokeAndWait、結果が必要な場合は、必要に応じSwingUtilitiesてこれらのメソッドも含む) にラップし、変更があるかどうかを確認します。

于 2011-03-27T15:46:18.360 に答える