【问题标题】:Progress bar not updating during a loop循环期间进度条不更新
【发布时间】:2013-07-29 12:02:43
【问题描述】:

我的进度条在循环结束之前不会更新?这是为什么呢?

for (String theURL : IPArray) {
    URL url = new URL(theURL);
    InetAddress address = InetAddress.getByName(url.getHost());
    String temp = address.toString();
    String IP = temp.substring(temp.indexOf("/") + 1, temp.length());
    URLArray.add(IP);
    Progress.percentage = (URLArray.size() * 100) / Progress.totalToDo;
    Progress.ipProgress.setString(Progress.percentage + "%");
    Progress.ipProgress.setValue(Progress.percentage);
    Progress.ipProgress.repaint();
    result += IP + System.getProperty("line.separator");
}

它只会在它通过循环后更新,而不是在循环期间。

【问题讨论】:

  • 单独的线程可能吗?
  • 是的,同样的问题每周被问两次。请先搜索此网站以找到您的无数解决方案。
  • 你帮助我或指导我到一个帖子,在那里我可以找到这样的答案而不是无知。
  • 请查看右侧的链接,例如link 1(查看 David Kroukamp 的答案)和link 2(查看 MadProgrammer 的答案)。
  • Maxim 为我回答了这个问题,需要一个新线程。现在解决了,谢谢。

标签: java swing concurrency event-dispatch-thread jprogressbar


【解决方案1】:

需要一个新线程。

new Thread(new Runnable() {
    String result = "";

    public void run() {
        for (String theURL : IPArray) {
            try {
                URL url = new URL(theURL);
                InetAddress address = InetAddress.getByName(url.getHost());
                String temp = address.toString();
                String IP = temp.substring(temp.indexOf("/") + 1, temp.length());
                URLArray.add(IP);
                Progress.percentage = (URLArray.size() * 100) / Progress.totalToDo;
                Progress.ipProgress.setString(Progress.percentage + "%");
                Progress.ipProgress.setValue(Progress.percentage);
                Progress.ipProgress.repaint();
                result += IP + System.getProperty("line.separator");
            } catch (Exception e) {
                if ("www.".equals(e.getMessage())) {
                    JOptionPane.showMessageDialog(
                            null, "Incorrect URL. Usage: http://www.URL.com\nError = Space! Can't use gaps in list.", "Error", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        IPFrame.textAreaIP.setText(result);
        GEOLookup.check(IPFrame.textAreaIP.getText());
    }
}).start();

【讨论】:

  • 你可能对[this] 官方教程感兴趣(特别是关于SwingWorker类的)。还有[here]你有一些关于这个类的信息。
  • 将与包装在 invokeLater 中的 setString 和 setValue 一起使用,这是 Runnable#Thread 输出的常见和基本内容,reapint 很难看到已经可见的 Swing GUI,从各个角落调用 EDT 的 ditry hack,在与轻量级的 invokeLater 比较
猜你喜欢
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多