2011-12-21 11 views
2

私はこの例ではwgetを使ってexeをダウンロードするGUIプログラムを持っています。私は、ファイルをダウンロードするスレッドを設定しました。ファイルのサイズを保持する静的変数があります。次に、実際のファイルサイズをチェックし、ダウンロードが100%完了するまでJLabelを更新するwhileループがあります。 GUIは明らかに更新されておらず、スレッドが完了するまですべてが停止しています。このスレッドを作成することはこの問題を回避することになると私は思っていました。私が間違っていたこととスレッドを変更する必要があることを教えてください。私はこれを現在のように単純にしておきたいと思っています。Java GUIスレッディング

FYI:System.out.println()があるので、現在のファイルサイズが正しく更新されていることがわかります。また、ダウンロードされているファイルがすでに存在する場合(whileループが瞬時に真であるため)、全体が機能しません。

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

public class downloaderProgram implements ActionListener { 
    JFrame frame; 
    JPanel p1, p2, p3; 
    JButton start; 
    JLabel status; 

    downloaderProgram() { 
     frame = new JFrame("Downloader"); 
     frame.setSize(500, 400); 

     //p1 
     p1 = new JPanel(); 

     //p2 
     p2 = new JPanel(); 

     status = new JLabel(""); 
     p2.add(status); 

     //p3 
     GridLayout p3Grid = new GridLayout(0, 1); 
     p3 = new JPanel(); 
     p3.setLayout(p3Grid); 

     start = new JButton("Start"); 
     start.setMargin(new Insets(10,0,10,0)); 

     p3.add(start); 

     //frame 
     frame.add(p1, BorderLayout.NORTH); 
     frame.add(p2, BorderLayout.CENTER); 
     frame.add(p3, BorderLayout.SOUTH); 

     start.addActionListener(this); 

     //output.setEditable(false); 
     frame.setResizable(false); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource().equals(start)) { 
      long fileSize = 1110476; 

      downloadThread dt = new downloadThread(); 
      dt.start(); 

      long length = 0; 
      File download = new File("7z920.exe"); 
      while (length != fileSize) { 
       length = download.length(); 
       status.setText(Long.toString(length)); 
       System.out.println(Long.toString(length)); 
      } 

      start.setEnabled(false); 
     } 
    } 

    public static void main(String[] args) { 
     new downloaderProgram(); 
    } 
} 
class downloadThread extends Thread { 
    public void run() { 
     try { 
      String cmd = "wget http://downloads.sourceforge.net/sevenzip/7z920.exe"; 
      Runtime run = Runtime.getRuntime(); 
      Process pr = run.exec(cmd); 
     } catch(IOException io) { 
      System.out.println(io); 
     } 
    } 
} 

申し訳ありませんが、スペースがちょっと混乱していると、私のIDEからうまくコピーできませんでした。ありがとう!

+0

Huhh .. 7 Zipをインストールするには壊れやすい方法のようです。どのようにwgetをインストールしますか? –

+0

私はちょうど例のダウンロードとして7zip exeを使用しました...それをインストールする方法ではありません。 – carget

+0

Java命名規則を学び、それらに固執してください – kleopatra

答えて

5

ラベルはいつ更新されますか? Event Dispatch Thread(EDT)をループしています。それはSwingがその絵を描くときです。ダウンロードスレッドではなく、whileループがあるため、GUIの更新が妨げられています。

答えは簡単です:javax.swing.SwingWorker。 Oracleのcomprehensive SwingWorker tutorialがあります。

またJLabelの代わりにJProgressBarを使用することを検討してください。それについてのチュートリアルもあります:How to Use Progress Bars