2012-03-13 12 views
2

Swingを使用してEclipseにコンパイルされたJavaアプレットがあります。ここをクリックしてください:http://www.test.world2build.com/Game/Play.aspxJavaアプレットのGUIは、アプレットのダウンロードが完了するまで表示されません。

アプレットの開始時に、私はログインしてアップデートをダウンロードする「読み込み中...」ダイアログを作成しました。

  • MainApplet
  • LoadingDialog
  • 接続

MainApplet.class

public class MainApplet extends JApplet { 
public MainApplet() { 
} 
public void init() { 
    // constructor 

    setSize(800,600); 
    getContentPane().setLayout(null); 

    AppSettings AppSettings = new AppSettings(); 
    AppSettings.Username = GetParameter(0); 
    AppSettings.Password = GetParameter(1); 
    AppSettings.ClientMode = GetParameter(2); 
    AppSettings.ServerIP = GetParameter(3); 

    System.out.println("Main applet loaded."); 
    System.out.println("Starting load..."); 

    LoadingDialog load = new LoadingDialog(); 
    load.setVisible(true); 
    getContentPane().add(load); 

    int panelX = (getWidth() - load.getWidth() - getInsets().left - getInsets().right)/2; 
    int panelY = ((getHeight() - load.getHeight() - getInsets().top - getInsets().bottom)/2); 
    load.setLocation(panelX, panelY); 



    load.lblNewLabel_1.setText("Connecting..."); 

    //wait(2); 

    // UPDATE PROGRESS BAR // 
    load.progressBar.setValue(15); 

    Connect connect = new Connect(); 
    String Result = null; 
    try { 
     Result = connect.Read("http://www.world2build.com/"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    if(Result == null) { 
     return; 
    } 

    // UPDATE PROGRESS BAR // 
    load.progressBar.setValue(30); 

    load.lblNewLabel_1.setText("Checking for updates..."); 

    //wait(1); 

    String UpdatesAvailable = "null"; 

    try { 
     UpdatesAvailable = connect.Read("http://test.world2build.com/Game/CheckUpdates.aspx?v=" + AppSettings.Version); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    // UPDATE PROGRESS BAR // 
    load.progressBar.setValue(60); 

    if(UpdatesAvailable.startsWith("available")) { 
     load.lblNewLabel.setText("Updating, please wait..."); 
     load.lblNewLabel_1.setText("Downloading..."); 

     URL url; 
     try { 
      url = new URL("http://www.world2build.com/Game/WorldToBuild.zip"); 

      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("GET"); 
      InputStream in = connection.getInputStream(); 
      FileOutputStream out = new FileOutputStream(System.getenv("APPDATA") + "download.zip"); 
      copy(in, out, 1024); 
      out.close(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (ProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    else if(UpdatesAvailable.startsWith("unavailable")) { 
     load.lblNewLabel.setText("Please wait..."); 
     load.lblNewLabel_1.setText("Logging in..."); 
     String loginStatus = null; 

     try { 
      loginStatus = connect.Read(
        "http://test.world2build.com/Game/Login.ashx?u=" 
        + AppSettings.Username + "&p=" 
        + AppSettings.Password + "&sip=" 
        + AppSettings.ServerIP); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     if(loginStatus.startsWith("success")) { 
      load.lblNewLabel_1.setText("Connecting..."); 
      load.progressBar.setValue(100); 

      // Join the game. Start game now. // 


     } 
     else if(loginStatus.startsWith("failed")) { 
      load.lblNewLabel.setText("An error occured"); 
      load.lblNewLabel_1.setText("Login failed."); 
     } 
     else { 
      load.lblNewLabel.setText("An error occured"); 
      load.lblNewLabel_1.setText("Failed to connect."); 
     } 
    } 
    else { 
     load.lblNewLabel.setText("An error occured"); 
     load.lblNewLabel_1.setText("Failed to check updates."); 
    } 
} 
public static void copy(InputStream input, OutputStream output, int bufferSize) throws IOException { 
    byte[] buf = new byte[bufferSize]; 
    int n = input.read(buf); 
    while (n >= 0) { 
     output.write(buf, 0, n); 
     n = input.read(buf); 
    } 
    output.flush(); 
} 
public static void wait(int n){ 
    long t0, t1; 
    t0 = System.currentTimeMillis(); 
    do{ 
     t1 = System.currentTimeMillis(); 
    } 
    while ((t1 - t0) < (n * 1000)); 
} 
public String GetParameter(int Index) { 
    String Parameters = null; 
    String[] Stuff = null; 

    try { 
     Parameters = this.getParameter("data"); 
     Stuff = Parameters.split(" "); 

     return Stuff[Index]; 
    } catch(NullPointerException e) { 
     e.printStackTrace(); 
    } 

    // Username   Password  ServerMode  IP 
    Parameters = "Bailey 1f6311d6446e2a3fa08a1c08187129ad false 127.0.0.1:45565"; 
    Stuff = Parameters.split(" "); 

    return Stuff[Index]; 
} } 

LoadingDialog.class

012:このアプレットは、3つのクラスが含まれています
public class LoadingDialog extends JApplet { 

public JPanel frame = new JPanel(); 

public JProgressBar progressBar; 
public JLabel lblNewLabel_1; 
public JLabel lblNewLabel; 
private JPanel panel; 

public LoadingDialog() { 
    getContentPane().setFocusable(false); 
    frame.setBorder(new LineBorder(new Color(0, 0, 0))); 
    setSize(350,150); 
    frame.setSize(350,150); 
    getContentPane().setLayout(null); 
    setVisible(true); 
    progressBar = new JProgressBar(); 
    progressBar.setVerifyInputWhenFocusTarget(false); 
    progressBar.setOpaque(true); 
    progressBar.setBounds(10, 51, 322, 19); 
    getContentPane().add(progressBar); 

    lblNewLabel = new JLabel("Please wait..."); 
    lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 14)); 
    lblNewLabel.setBounds(24, 11, 308, 29); 
    getContentPane().add(lblNewLabel); 

    lblNewLabel_1 = new JLabel("Checking for updates..."); 
    lblNewLabel_1.setForeground(UIManager.getColor("InternalFrame.borderDarkShadow")); 
    lblNewLabel_1.setHorizontalAlignment(SwingConstants.RIGHT); 
    lblNewLabel_1.setHorizontalTextPosition(SwingConstants.RIGHT); 
    lblNewLabel_1.setBounds(10, 76, 322, 19); 
    getContentPane().add(lblNewLabel_1); 



    int panelX = (getWidth() - frame.getWidth() - getInsets().left - getInsets().right)/2; 
    int panelY = ((getHeight() - frame.getHeight() - getInsets().top - getInsets().bottom)/2); 
    frame.setBounds(350, 150, panelX, panelY); 

    frame.setVisible(true); 
} } 

いくつかの奇妙な理由で、Connectクラス(下記参照)を使用してURLの内容を取得するMainAppletでは、アプレットはすべてが完了するまではLoadingDialog GUIを表示しません。

Connect.class

public class Connect { 
public String Read(String theurl) throws IOException { 
    URL url = new URL(theurl); 

    // Read all the text returned by the server 
    BufferedReader in; 
    try { 
     in = new BufferedReader(new InputStreamReader(url.openStream())); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    String str = in.readLine(); 
    String newstr = "..."; 

    while(newstr != null) { 
     newstr = in.readLine(); 
     if(newstr == null) { 
      break; 
     } 
     else { 
      str += newstr; 
     } 
    } 

    in.close(); 
    return str; 
} } 
+0

*「すべてが完了するまではLoadingDialog GUIが表示されません」*おそらくEDTをブロックする際の問題です。 OTOHでは、[Java Web Start](http://stackoverflow.com/tags/java-web-start/info)を使用して、リンクからフレームを起動する方法を検討する必要があります。スプラッシュスクリーンをサポートしています。 –

答えて

2

あなたConnectクラス使用するブロックI/O、すべてがダウンロードされた後まで完了からinit方法を防止しています。アプレットは、少なくともinitメソッドが返されるまでレンダリングされません。 initメソッドを迅速に返すには、リソースのダウンロードをバックグラウンドのワーカースレッドにオフロードできます。

たとえば、SwingWorkerを参照してください。これは、この種のワーカースレッドオフロードをSwing GUIで正しく行うためのユーティリティクラスです。これは、Java 6の標準Javaの一部として導入されました。Java 5をサポートする必要がある場合は、SwingWorker for downloadの旧バージョンがあります。


また、独自のスレッドを生成することもできます。 GUIアップデートをAWTイベントディスパッチスレッドにプッシュするようにしてください。

public class MainApplet extends JApplet { 
    public MainApplet() { 
    } 
    public void init() { 
     // constructor 

     setSize(800,600); 
     getContentPane().setLayout(null); 

     AppSettings AppSettings = new AppSettings(); 
     AppSettings.Username = GetParameter(0); 
     AppSettings.Password = GetParameter(1); 
     AppSettings.ClientMode = GetParameter(2); 
     AppSettings.ServerIP = GetParameter(3); 

     System.out.println("Main applet loaded."); 
     System.out.println("Starting load..."); 

     final LoadingDialog load = new LoadingDialog(); 
     load.setVisible(true); 
     getContentPane().add(load); 

     int panelX = (getWidth() - load.getWidth() - getInsets().left - getInsets().right)/2; 
     int panelY = ((getHeight() - load.getHeight() - getInsets().top - getInsets().bottom)/2); 
     load.setLocation(panelX, panelY); 

     load.lblNewLabel_1.setText("Connecting..."); 

     // UPDATE PROGRESS BAR // 
     load.progressBar.setValue(15); 

     Thread thread = new Thread() { 
      public void run() { 
       Connect connect = new Connect(); 
       String Result = null; 
       try { 
        Result = connect.Read("http://www.world2build.com/"); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       if(Result == null) { 
        return; 
       } 

       // UPDATE PROGRESS BAR // 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         load.progressBar.setValue(30); 
         load.lblNewLabel_1.setText("Checking for updates..."); 
        } 
       }); 

       String UpdatesAvailable = "null"; 

       try { 
        UpdatesAvailable = connect.Read("http://test.world2build.com/Game/CheckUpdates.aspx?v=" + AppSettings.Version); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       // UPDATE PROGRESS BAR // 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         load.progressBar.setValue(60); 
        } 
       }); 

       if(UpdatesAvailable.startsWith("available")) { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          load.lblNewLabel.setText("Updating, please wait..."); 
          load.lblNewLabel_1.setText("Downloading..."); 
         } 
        }); 

        URL url; 
        try { 
         url = new URL("http://www.world2build.com/Game/WorldToBuild.zip"); 

         HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
         connection.setRequestMethod("GET"); 
         InputStream in = connection.getInputStream(); 
         FileOutputStream out = new FileOutputStream(System.getenv("APPDATA") + "download.zip"); 
         copy(in, out, 1024); 
         out.close(); 
        } catch (MalformedURLException e) { 
         e.printStackTrace(); 
        } catch (ProtocolException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       else if(UpdatesAvailable.startsWith("unavailable")) { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          load.lblNewLabel.setText("Please wait..."); 
          load.lblNewLabel_1.setText("Logging in..."); 
         } 
        }); 
        String loginStatus = null; 

        try { 
         loginStatus = connect.Read(
           "http://test.world2build.com/Game/Login.ashx?u=" 
           + AppSettings.Username + "&p=" 
           + AppSettings.Password + "&sip=" 
           + AppSettings.ServerIP); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

        if(loginStatus.startsWith("success")) { 
         SwingUtilities.invokeLater(new Runnable() { 
          public void run() { 
           load.lblNewLabel_1.setText("Connecting..."); 
           load.progressBar.setValue(100); 
          } 
         }); 

         // Join the game. Start game now. // 


        } 
        else if(loginStatus.startsWith("failed")) { 
         SwingUtilities.invokeLater(new Runnable() { 
          public void run() { 
           load.lblNewLabel.setText("An error occured"); 
           load.lblNewLabel_1.setText("Login failed."); 
          } 
         }); 
        } 
        else { 
         SwingUtilities.invokeLater(new Runnable() { 
          public void run() { 
           load.lblNewLabel.setText("An error occured"); 
           load.lblNewLabel_1.setText("Failed to connect."); 
          } 
         }); 
        } 
       } 
       else { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          load.lblNewLabel.setText("An error occured"); 
          load.lblNewLabel_1.setText("Failed to check updates."); 
         } 
        } 

       } 
      } 

      Connect connect = new Connect(); 
      String Result = null; 
      try { 
       Result = connect.Read("http://www.world2build.com/"); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      if(Result == null) { 
       return; 
      } 

      // UPDATE PROGRESS BAR // 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        load.progressBar.setValue(30); 
        load.lblNewLabel_1.setText("Checking for updates..."); 
       } 
      }); 

      //wait(1); 

      String UpdatesAvailable = "null"; 

      try { 
       UpdatesAvailable = connect.Read("http://test.world2build.com/Game/CheckUpdates.aspx?v=" + AppSettings.Version); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      // UPDATE PROGRESS BAR // 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        load.progressBar.setValue(60); 
       } 
      }); 

      if(UpdatesAvailable.startsWith("available")) { 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         load.lblNewLabel.setText("Updating, please wait..."); 
         load.lblNewLabel_1.setText("Downloading..."); 
        } 
       }); 

       URL url; 
       try { 
        url = new URL("http://www.world2build.com/Game/WorldToBuild.zip"); 

        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setRequestMethod("GET"); 
        InputStream in = connection.getInputStream(); 
        FileOutputStream out = new FileOutputStream(System.getenv("APPDATA") + "download.zip"); 
        copy(in, out, 1024); 
        out.close(); 
       } catch (MalformedURLException e) { 
        e.printStackTrace(); 
       } catch (ProtocolException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      else if(UpdatesAvailable.startsWith("unavailable")) { 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         load.lblNewLabel.setText("Please wait..."); 
         load.lblNewLabel_1.setText("Logging in..."); 
        } 
       }); 
       String loginStatus = null; 

       try { 
        loginStatus = connect.Read(
          "http://test.world2build.com/Game/Login.ashx?u=" 
          + AppSettings.Username + "&p=" 
          + AppSettings.Password + "&sip=" 
          + AppSettings.ServerIP); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       if(loginStatus.startsWith("success")) { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          load.lblNewLabel_1.setText("Connecting..."); 
          load.progressBar.setValue(100); 
         } 
        }); 

        // Join the game. Start game now. // 


       } 
       else if(loginStatus.startsWith("failed")) { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          load.lblNewLabel.setText("An error occured"); 
          load.lblNewLabel_1.setText("Login failed."); 
         } 
        }); 
       } 
       else { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          load.lblNewLabel.setText("An error occured"); 
          load.lblNewLabel_1.setText("Failed to connect."); 
         } 
        }); 
       } 
      } 
      else { 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         load.lblNewLabel.setText("An error occured"); 
         load.lblNewLabel_1.setText("Failed to check updates."); 
        } 
       }); 
      } 
     } 
     thread.start(); 
    } 
    // ... 
} 
+0

追加のユーティリティを使用しなくてもこれを回避する方法はありますか? – Anonymous

+0

@BaileyMcAfeeはい。新しいスレッドを生成することができます。あなたは、そのスレッド内からGUIに行う更新がAWTイベントスレッドにプッシュオフされていることを確認する必要があります。 'SwingUtilities.invokeLater'(SwingUtilitiesはJavaに組み込まれたクラスです)。私の答えに掲載したコード例を参照してください。 –

関連する問題