2012-01-25 16 views
3

これを理解することはできません。 workerまたはinvokeLaterを使用すると、UIはまだフリーズします。各ファイルがダウンロードされた後、私はJListを更新したい。しかし、JListは、トレッドが復帰した後にのみ更新されます。Java Swingマルチスレッドとフリーズフリー

public class MyUi extends javax.swing.JFrame{ 
    ... 

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt){ 

     SwingUtilities.invokeLater(new Runnable() { 
     //To get out of the event tread 
     public void run() { 
      dl(); 
     } 
     }); 
    } 

    private void dl(){ 
     ... 
     //ini and run the download class 
     Download myDownload = new Download(); 
     myDownload.doDownload(myDlList); 
    } 

    public void updateJlist(String myString){ 

     myModel.addElement(myString); 
     jList1.repaint(); 
    } 

} 

public class Download{ 
... 

    public void doDownload(String[] fileName){ 
     for(int i=0; i<fileName.length; i++){ 
     ...//download action... 
     //for my jList1 to be updated after each file. 
     MyUi.updateJlist(fileName[i]); 
     } 
    } 

} 

どれ例に役立つだろう。ここでは

は、コードがあります。

答えて

3

ファイルをバックグラウンドスレッドでダウンロードし、にupdateJlist()とだけラップします。

SwingWorkerがより信頼できるでしょう。

補足:SwingWorkerは、hereのように、中間結果を簡単に報告することもできます。

+1

+1 SwingWorkerの。 – mre

+0

バックグラウンドでダウンロードを実行するのはちょっと難しいので、updateJlist()をラップする必要はありません。 SwingWorkerについては、もう少し読んでテストを行う必要があります。私はそれを完全に理解していません。ありがとう! – marcb

+0

私はうまくいきましたが、私は非EDTスレッドからGUIを更新することに注意しています(http://stackoverflow.com/a/7158505/230513)。 'SwingWorker'の助けが必要な場合は、質問を投稿するのをためらってください。 – trashgod

4

invokeLaterは、EDT上で操作を実行し、その動作を説明しています。

0

スレッドとGUIの現在/メインスレッドを処理するWorkerThreadクラスを作成しました。私はGUIアプリケーションをWorkerThreadのconstruct()メソッドに入れました。イベントが発生してXXXServerを起動すると、すべてのスレッドがアクティブになり、GUIがスムーズに動かなくなりました。見てみましょう。

/** *アクションイベント* * @see java.awt.event.ActionListener#のactionPerformed(java.awt.event.ActionEvent)*/

ます。public void actionPerformedの(のActionEvent AE){ log.info ( "actionPerformed begin ..." + ae.getActionCommand());中間結果と

try { 
    if (ae.getActionCommand().equals(btnStart.getText())) { 
     final int portNumber = 9990; 
     try { 

      WorkerThread workerThread = new WorkerThread(){ 
       public Object construct(){ 

        log.info("Initializing the Server GUI..."); 
        // initializing the Server 
        try { 
         xxxServer = new XXXServer(portNumber); 
         xxxServer.start(); 
         btnStart.setEnabled(false);        
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         log.info("actionPerformed() Start button ERROR IOEXCEPTION..." + e.getMessage()); 
         e.printStackTrace(); 
        } 
        return null; 
       } 
      };workerThread.start(); 
      } catch (Exception e) { 
       log.info("actionPerformed() Start button ERROR..." + e.getMessage()); 
       e.printStackTrace(); 
     } 


    } else if (ae.getActionCommand().equals(btnStop.getText())) { 
     log.info("Exit..." + btnStop.getText()); 
     closeWindow(); 
    } 

} catch (Exception e) { 
    log 
     .info("Error in ServerGUI actionPerformed===" 
      + e.getMessage()); 
} 

}