【问题标题】:Progress bars in JavaJava中的进度条
【发布时间】:2013-09-03 22:40:58
【问题描述】:

我有一个包含两种方法的代码。

public void fondo() { ... }        //Gathers JFrame Background and system time
public void recuperarDatosInternet() {...} //Connects to a URL and gets data.

当 JFrame 运行时,一开始需要四五秒的时间来执行这些方法的所有操作。

在加载过程中,框架显示完全为空 3 或 4 秒,直到所有方法都完成,然后框架显示出来,一切正常。

如何制作一个进度条来向用户显示它正在加载的内容? 我的意思不是预先设定为“4000 毫秒”的 ProgressBar。我指的是一个进度条,它可以采取任何措施,并且在方法完成之前进度条不会达到 100%。

【问题讨论】:

标签: java swing class methods


【解决方案1】:

您可以为此使用SwingWorker。此类允许在后台线程中完成耗时的工作,同时不占用用户界面。它还具有将工作划分为“块”并在完成这些工作块时更新用户界面的功能。这是进度条所需要的,尽管它取决于您的任务是否“可分块”。上面的链接将您带到此类的 JavaDoc,其中包含简单和“分块”用法的示例。

【讨论】:

    【解决方案2】:

    如果您在The Event Dispatch Thread 中运行繁重的任务,它将冻结直到完成,以避免您可以使用SwingWorker 在另一个线程中执行下载。 关注 link 以查看带有 progressBar 的完整示例,特别注意 setProgress() publish()process()

    例子:

    public class MyWorker extends SwingWorker<Integer, String> {
    
      @Override
      protected Integer doInBackground() throws Exception {
        // Start
        publish("Start Download");
        setProgress(1);
    
        // More work was done
        publish("More work was done");
        setProgress(10);
    
        // Complete
        publish("Complete");
        setProgress(100);
        return 1;
      }
    
      @Override
      protected void process(List< String> chunks) {
        // Messages received from the doInBackground() (when invoking the publish() method)
      }
    }
    

    在客户端代码中:

        SwingWorker worker = new MyWorker();
        worker.addPropertyChangeListener(new MyProgressListener());
        worker.execute();
    
       class MyProgressListener implements PropertyChangeListener {
          @Override
          public void propertyChange(final PropertyChangeEvent event) {
            if(event.getPropertyName().equalsIgnoreCase("progress")) {
              downloadProgressBar.setIndeterminate(false);
              downloadProgressBar.setValue((Integer) event.getNewValue());
            }         
          }
         }
    

    【讨论】:

    • 好的。我以前读过这个,我没有设法把代码放在我的程序上。不是因为它错了,而是因为我不知道如何使用 netbeans“swing”编辑器来做到这一点。该代码解释了如何通过调用所有摆动组件(我的意思是“编写”它们)来做到这一点。我已经这样做了!使用设计视图。所以当我尝试调用一个swing组件时,它总是抛出一个我无法解决的错误
    • @SebaPaz 嗯,我认为您不必使用 netbeans swing 编辑器(也称为 matisse),因为您正在使用 gui 组件做任何事情。你必须在没有编辑器的情况下编码..
    • 我不习惯,但我会尝试的。无论如何,¿有没有可能使用 matisse 更快地做到这一点的方法?
    • @SebaPaz 嗯,我不这么认为,因为 swingWorker 它不是一个摇摆 gui 组件。我会尽量不与 matisse“结婚”,然后开始编码!如果您在尝试某事后遇到问题,您可以在 stackoverflow 中发布一个新问题
    猜你喜欢
    • 2010-10-27
    • 2013-02-18
    • 2013-09-11
    • 2013-02-24
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多