2

ネットワークゲームクライアントを作成していますが、ボタンがクリックされたときにフレームを切り替えるときに問題が発生します。

クライアントの各ページを異なるフレームで記述しましたが、クライアントのホームページからメニューボタンをクリックするとそれらのフレームが表示されます。

以下は私が行ったコードです。

public class homePage extends JFrame{
       public homePage () {
       initComponents();
      }

      private void initComponents(){
      // the frame and butttons are here....


      GameListBtn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            this.setVisible(false); // to hide the current home page
            new GameList().start(); // to start new frame called GameList
            // basically the same thing as following code
            // GameList gl = new GameList();
            // gl.setVisible (true);
            // gl.run();
        }
      }
}

  public class GameList extends JFrame{
       public GameList(){
       //Everything about the frame is here
       }

       // this method is for connection
       public void run(){
             try{
              // open socket and initialize input streams, output streams here

             while (true){
                     //process data to and from server
             }
             }// end of try
       } // end of run

       // this method is to display GameList frame and it's connection
       public static void start(){
         GameList frame = new GameList();
         frame.setVisible(true);
         frame.run();
       }

     }

この次のクラスはGameListフレームを実行するだけで、メインメソッドからの接続です

   public static void main(String[] args) {
    new GameList().start();
    // basically the same thing as following code
    // GameList gl = new GameList();
    // gl.setVisible (true);
    // gl.run();
    }

私のGameListフレームは、mainメソッドから実行しただけで正しく機能します。GUIが表示され、接続が確立され、データ送信が成功します。基本的にやりたいのは、ホームページのActionListenerから新しいGameList()。start()メソッドを呼び出すことです。これは、mainメソッドから呼び出し、GameListを表示し、ホームページを非表示にすることができるためです。

最初のコードで示したようにこれを行うと、GameListのGUIはロードされません(黒くなっただけです)が、接続は確立され、データ送信は成功します。GUIは、接続が終了した場合にのみ表示されます。その理由は、GameListのrun()メソッド内のwhileループにあると思われますか?

しかし、繰り返しになりますが、GameListクラスのメインから実行すると、まったく同じことが魅力のように機能します。私がしていることはすべてまったく同じですが、ホームページから呼び出したときにGUIがロードされない理由を誰かに教えてもらえますか?

私の質問がばかげているように聞こえたら申し訳ありませんが、どんな助けでも大歓迎です。

4

1 に答える 1

3

GameList.start()から呼び出すとActionListenerSwing EDTに入ります。これは、Swing がマウスやキーボード入力などのすべてのイベントを処理するだけでなく、コンポーネントの再描画も処理するスレッドです。Swing EDT で長いプロセスを実行していると、実際にはスレッドがブロックされ、他のイベントの処理が妨げられ、その中には再描画イベントが含まれます。これが、フレームが黒く、GUI がロードされていないように見える理由です。これは、EDT スレッドではなくアプリケーションのメイン スレッドにいたため、メイン メソッドから呼び出したときには発生しませんでした。

Thread.start()これを解決するには、 と を使用して別のスレッドから GameList の run() メソッドを呼び出す必要がありますRunnable

経験則として、アプリケーションの応答性を維持するために、イベントには GUI のものといくつかのフラグ以外のものを入れるべきではなく、イベント内で計算を行うべきではありません。

もう 1 つのルールは、一般的な問題を回避するために、すべての GUI 要素 (フレームの作成を含む) をスレッド EDT に配置することです。別のスレッドから何かを実行する必要がある場合 (イベントに応答していない場合、またはメイン メソッドにいる場合)、 を使用しますSwingUtilities.invokeLater

于 2013-02-19T02:54:30.763 に答える