0

私はJavaが初めてで、最初のプログラミング言語ではありません。サーバー上のバージョンがクライアントのものと同じになるまで、すべてのファイルをダウンロードするダウンローダーを実際にコーディングしようとしています。

プログラムはうまく動作しますが、これは私が解決できないことです。

このコードを実行すると:

private void updateContent()
{
    DownloadButton.setEnabled(false);
    SaveLocationButton.setEnabled(false);
    UpdateText.setText("Update to Version " + ServerVersionNumber + "...");
    UpdateText.setForeground(new Color(200, 150, 0, 255));
    ProgressText.setText("(1/2) Files will be downloaded");
    ProgressText.setForeground(new Color(200, 150, 0, 255));
    LoadingBar.setStringPainted(true);

    for(int i = 1; i < (ServerVersionNumber - LocalVersionNumber + 1); i++)
    {
        int CurrentUpdateFile = LocalVersionNumber + i;


        try 
        {
            URL FileURL = new URL(Host + CurrentUpdateFile + ".zip");

            try {
                FileURL.openConnection();


                InputStream reader = FileURL.openStream();
                FileOutputStream writer = new FileOutputStream(ContentSaveDirectory + CurrentUpdateFile + ".zip");

                byte[] buffer = new byte[153600];
                int bytesRead = 0;


                while ((bytesRead = reader.read(buffer)) > 0)
                {  
                    writer.write(buffer, 0, bytesRead);
                    buffer = new byte[153600];
                }

                writer.close();
                reader.close();

            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }

        } 
        catch (MalformedURLException e) 
        {
            e.printStackTrace();
        }
    }
}

すべてDownloadButton.setEnabled(false);のファイルがダウンロードされた後、その下の数行が変更されます。

4

1 に答える 1

5

このメソッドをイベント ハンドラーから呼び出す場合は、イベント ディスパッチ スレッドで実行され、ダウンロード ブロックの再描画とイベント処理が行われます。一方、GUI の更新は、イベント ディスパッチ スレッドからのみ行う必要があります。http://docs.oracle.com/javase/tutorial/uiswing/concurrency/を参照してください。

最も簡単な修正方法は、以下のように、ダウンロード用の新しいスレッドを開始することです。ダウンロードの完了時に GUI を更新するなど、GUI とのより良い統合については、チュートリアルを参照してください。

private void updateContent()
{
    DownloadButton.setEnabled(false);
    SaveLocationButton.setEnabled(false);
    UpdateText.setText("Update to Version " + ServerVersionNumber + "...");
    UpdateText.setForeground(new Color(200, 150, 0, 255));
    ProgressText.setText("(1/2) Files will be downloaded");
    ProgressText.setForeground(new Color(200, 150, 0, 255));
    LoadingBar.setStringPainted(true);

    new Thread() {
        public void run() {
            for(int i = 1; i < (ServerVersionNumber - LocalVersionNumber + 1); i++)
            {
                // the rest
            }
        }
    }.start();
}
于 2013-07-13T19:47:39.117 に答える