簡體   English   中英

Java Swing多線程和ui凍結

[英]Java Swing multi threads and ui freezes

無法弄清楚這一點。 使用worker或invokeLater,UI仍然凍結。 下載每個文件后,我希望更新JList。 但是JList僅在踩踏返回后才更新。

這是代碼:

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]);
      }
   }

}

任何示例都會有所幫助。

invokeLater與您期望的完全相反-它在EDT上運行操作,從而解釋了行為。

將文件下載到后台線程上,然后將updateJlist()包裝到Runnable

SwingWorker將更加可靠。

附錄:作為@mre筆記, SwingWorker也可以很容易地報告中期業績,如圖所示這里

我創建了一個WorkerThread類,該類負責線程和GUI當前/主線程。 當發生事件啟動XXXServer時,我將我的GUI應用程序放在WorkerThread的Construct()方法中,然后所有線程均被激活,GUI順利工作,而沒有凍結。 看一看。

/ ** *動作事件* * @參見java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)* /

公共無效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());
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM