2011-09-12 8 views
2

私は、アプレット内でJavaゲーム用のコンソールを作ろうとしています。コンソールは、独立したTextAreaのFrameであり、進行のロード/ダウンロードの表示に使用されます。 閉鎖時にコンソールを隠そうとすると、いくつかの問題が発生しています。アプレットからフレームを閉じる

//Method inherited from the Applet class 
public void init() { 
    console = new Frame(); 
    console.setSize(500, 300); 
    console.addWindowListener(new WindowAdapter(){ 
     public void windowClosing(WindowEvent e) { 
      console.setVisible(false); 
     } 
    }); 

    consoleText = new TextArea(); 
    consoleText.setSize(500, 300); 

    console.add(consoleText); 

    console.setVisible(true); 

    gameThread = new Thread() { 
     public void run() { 
      mainLoop(); 
     } 
    }; 
    gameThread.start(); 
} 

スレッド「gameThread」私はフレーム「コンソール」を閉じたときに、単にハング:

はここで単純化されたコードです。私が "console.setVisible(false);"を置き換えたとしても"console.setExtendedState(Frame.ICONIFIED);"で、スレッドは何の警告もなくハングします。 ブラウザでアプレットを実行しているときに、タスクマネージャでプロセスを強制終了する必要があります。とてもうるさい。

代わりにJFrameを使用することは、バグを再現するのが難しいことを除いて全く同じことです。

私はちょうどユーザーがコンソールを取り除くことができるようにしたい。

誰のアイデアを持っていますか?ありがとう!

+1

を - ダンプアプレットを完全に起動し、[Java Web Start](http://stackoverflow.com/tags/)を使ってフレーム( 'JFrame')ベースのゲームを起動します。 java-web-start/info)を実行します。問題は解決され、JWSはアプレットから起動されるフレーム(ブラウザが閉じてもゲームを使用できるという事実を含むがこれに限定されない)に対して多くの利点を提供する。 –

+0

私はロードするものを表示するためにフレームとしてコンソールを使用します。このゲームは、アプレット自体のCanvasで実行されます。 Java Web Startは素晴らしいですが、アプレットはJava Web Startアプリよりも透過性が高いと思います。ユーザーには、フラッシュゲームのようなものです。 – Klems

答えて

2

フレームがダイアログとして動作しているので、このためにFrame/JFrameを使用するべきではなく、むしろJDialogを使用するべきではないと思います。また、アプレットではなくJAppletを使用していることを確認してください。

編集
私はあなたの表示コードスニペットに基づいて、あなたの問題を再現することはできません。直接問題を示すSSCCEの作成と投稿を検討してください。

編集2
問題再現していない私のSSCCE:JDialogの使用

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class AppletEg extends JApplet { 
    private static final int MAX_LOOP = 30; 
    private static final long SLEEP_TIME = 500; 
    private JFrame console; 
    private JTextArea consoleText; 
    private Thread gameThread; 

    @Override 
    public void init() { 
     console = new JFrame(); 
     console.setSize(500, 300); 
     console.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      console.setVisible(false); 
     } 
     }); 

     consoleText = new JTextArea(); 
     consoleText.setPreferredSize(new Dimension(500, 300)); 

     console.add(new JScrollPane(consoleText)); 

     console.setVisible(true); 

     gameThread = new Thread() { 
     public void run() { 
      mainLoop(); 
     } 
     }; 
     gameThread.start(); 
    } 

    private void mainLoop() { 
     for (int i = 0; i < MAX_LOOP; i++) { 
     System.out.println("I: " + i); 
     try { 
      Thread.sleep(SLEEP_TIME); 
     } catch (InterruptedException e) { 
     } 
     } 
    } 
} 

編集3
マイSSCCEを:私のアドバイスがある

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class AppletEg extends JApplet { 
    private static final int MAX_LOOP = 30; 
    private static final long SLEEP_TIME = 500; 
    private JDialog console; 
    private JTextArea consoleText; 
    private Thread gameThread; 

    @Override 
    public void init() { 
     Window win = SwingUtilities.getWindowAncestor(this); 
     console = new JDialog(win); 
     consoleText = new JTextArea(); 
     consoleText.setPreferredSize(new Dimension(500, 300)); 

     console.add(new JScrollPane(consoleText)); 
     console.pack(); 
     console.setLocationByPlatform(true); 
     console.setVisible(true); 

     gameThread = new Thread() { 
     public void run() { 
      mainLoop(); 
     } 
     }; 
     gameThread.start(); 
    } 

    private void mainLoop() { 
     for (int i = 0; i < MAX_LOOP; i++) { 
     System.out.println("i: " + i); 
     try { 
      Thread.sleep(SLEEP_TIME); 
     } catch (InterruptedException e) { 
     } 
     } 
    } 
} 
+0

@Klems:編集を参照してください –

+0

申し訳ありませんが、私は全くバグを再現することができませんでした。スレッド/イベントの仕組みを示すコードを提供しました。書き直すにはたくさんの行があります。スレッドでは、OpenGLテクスチャに多くのイメージをロードしています。そのバグはどこからでも来る可能性があります。私はまだそれが起こっている理由を見ていない。フレームがスレッドとどのように通信できるかは、私が超えています。あなたのおかげで、AWTのためではないことは少なくとも知っています。バグは明らかにmainLoop()メソッドから来ています。ロード中にのみ発生します。ゲームが実行されている間、私はハングすることなくフレームを閉じることができます。私はとにかくそれを行うよりエレガントな方法を見つけた。 – Klems

関連する問題