首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwingWorker异常

SwingWorker异常
EN

Stack Overflow用户
提问于 2015-03-24 07:29:04
回答 1查看 127关注 0票数 0

我有一个用于从网站下载大文件和显示进程与jProgressBar的一些类。我使用了一个SwingWorker类和doInBackground方法。它工作得很好,但当下载文件的大小大于20mb时,我会得到一个java.lang.IllegalArgumentException:这个值应该是从0到100。我做错了什么?求求你救救我!我的一段代码:

代码语言:javascript
复制
   @Override
   protected Void doInBackground() throws Exception {
      URL url = new URL(site);
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      int filesize = connection.getContentLength();
      int totalDataRead = 0;
      try (java.io.BufferedInputStream in = new java.io.BufferedInputStream(
            connection.getInputStream())) {
         java.io.FileOutputStream fos = new java.io.FileOutputStream(file);
         try (java.io.BufferedOutputStream bout = new BufferedOutputStream(
               fos, 1024)) {
            byte[] data = new byte[1024];
            int i;
            while ((i = in.read(data, 0, 1024)) >= 0) {
               totalDataRead = totalDataRead + i;
               bout.write(data, 0, i);
               int percent = (totalDataRead * 100) / filesize;
               setProgress(percent);
            }
         }
      }
      return null;
   }
}
EN

回答 1

Stack Overflow用户

发布于 2015-03-24 08:10:32

在玩弄了你的计算之后,这个...

代码语言:javascript
复制
int percent = (totalDataRead * 100) / filesize;

在我看来是错误的(可能只是我可怜的数学大脑),但在大约20.48mb (或51%)的40mb中,它恢复为负数(-51%)

无论如何,如果我使用

代码语言:javascript
复制
int percent = Math.round(((float)count / (float)range) * 100f);

它工作得很好。

另外,我会考虑开发filesizetotalDataRead long,而不是int,但这只是我的想法。

还有一个我用来测试它的可运行的例子...

代码语言:javascript
复制
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JProgressBar pb;

        public TestPane() {
            pb = new JProgressBar();
            setLayout(new GridBagLayout());
            add(pb);

            SwingWorker worker = new SwingWorker() {
                @Override
                protected Object doInBackground() throws Exception {
                    int range = 40 * (1024 * 1024);
                    for (int count = 0; count < range; count += 1024) {
                        int percent = Math.round(((float)count / (float)range) * 100f);
                        setProgress(percent);
                        Thread.sleep(1);
                    }
                    return null;
                }
            };
            worker.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if (null != evt.getPropertyName()) {
                        switch (evt.getPropertyName()) {
                            case "progress":
                                pb.setValue(worker.getProgress());
                                break;
                        }
                    }
                }
            });
            worker.execute();
        }

    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29222338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档