加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Swing多线程和ui冻结

发布时间:2020-12-15 08:47:00 所属栏目:Java 来源:网络整理
导读:无法想出这个.使用worker或invokeLater,UI仍然会冻结.下载每个文件后,我想要更新JList.但是JList只会在胎面返回后更新. 这是代码: public class MyUi extends javax.swing.JFrame{ ... private void jButton2ActionPerformed(java.awt.event.ActionEvent ev
无法想出这个.使用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]);
      }
   }

}

任何例子都会有帮助.

解决方法

在后台线程上下载文件,并在Runnable中包装updateJlist().

SwingWorker会更可靠.

附录:正如@mre所说,SwingWorker还可以轻松报告中期结果,如here所示.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读