【问题标题】:threads to show progress in java [closed]在java中显示进度的线程[关闭]
【发布时间】:2013-09-28 01:30:31
【问题描述】:

情况如下:我的代码从 Internet 下载文件,同时显示其大小和文件名。

问题是,当我下载该文件时,该 JTextArea 中没有任何内容出现,并且在下载完成之前,框架就像“冻结”一样。

我什至尝试使用 swingworker 类放置进度条(几天前我问过请求信息,但我不明白如何在我的代码中“集成”你之前给我的 swingworker 方法。有人告诉我使用 Matisse在那种情况下根本不推荐。所以我不能使用 swingworker。

我一直在研究,我认为适合我的方法是使用线程。有或没有进度条。只是找简单的代码,我是初学者,谢谢

【问题讨论】:

  • 什么线程正在运行您的 GUI 代码?是事件调度线程,还是主线程?如果是后者,就让它成为前者。
  • 在您展示一些工作、发布请求和下载文件的代码之前,没有人会提供帮助,我们会建议...
  • 你需要学会使用一个SwingWorker,纯粹而简单。从一个简单的线程睡眠示例开始,直到你让它工作,或者直到你可以在这里展示一个小例子。尽管如此,除非您提出更好(即可回答)的问题,否则我怀疑任何人都可以为您提供更多帮助。
  • 1) 您知道您应该使用 SwingWorker,并且您确实应该发布您使用它的尝试。否则我们怎么能猜到你可能做错了什么? 2) 同样,当尝试使用像 SwingWorker 这样复杂的新工具时,首先尝试解决一个简单的问题,而不是使用您的文件下载代码。让 SwingWorker 正常工作,然后在您更大的程序中实施它。分而治之。
  • 你需要看懂Concurrency in Swing

标签: java multithreading swing user-interface matisse


【解决方案1】:

这可能不是您当前问题的原因,而是这样的代码:

    } catch (MalformedURLException ex) {

    } catch (IOException ioe) { 

    }

是一场等待发生的事故。如果发生任何这些异常,您已经告诉应用程序默默地忽略它们

不要这样做!

如果您不知道如何处理已检查的异常,请在方法签名中声明为thrown。不要只是扔掉它。

【讨论】:

    【解决方案2】:
    package org.assume.StackOverflow;
    
    import java.io.File;
    
    public class Progress implements Runnable
    {
        private File file;
        private long totalSize;
        private int currentProgress;
    
        public Progress(String filePath, long totalSize)
        {
            this(new File(filePath), totalSize);
        }
    
        public Progress(File file, long totalSize)
        {
            this.file = file;
            this.totalSize = totalSize;
            new Thread(this).start();
        }
    
        public int getProgress()
        {
            return currentProgress;
        }
    
        @Override
        public void run()
        {
            while (file.length() < (totalSize - 100))
            {
                currentProgress = (int) (file.length() / totalSize);
            }
        }
    }
    

    使用方法:

    new Thread(new Progress(file, totalSize)).start();
    

    【讨论】:

    • 虽然技术上是正确的,但这可能会导致 OP 违反 Swing 的单线程规则
    • 我可以在 gui/matisse 中使用这个代码吗?还是我需要“编码”框架?
    • 我可以把我的代码放在哪一部分?
    【解决方案3】:

    这些行实际上是在执行下载和写入

     while (b != -1) {
           b = in.read();
           if (b != -1) {
               out.write(b);
           }
     }
    

    添加进度添加一些东西:

     while (b != -1) {
               b = in.read();
               if (b != -1) {
                   downloaded += b;
                   out.write(b);
               }
         }
    

    进步是

    downloaded / conn.getContentLength() * 100
    

    【讨论】:

    • 我把downloaded / conn.getContentLength() * 100放在哪里??
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多