基本不确定JProgress栏用法

Bil*_* VB 6 java swing swingworker jprogressbar progress-bar

我只是想在进行长时间下载时在框架的左下角设置一个不确定的JProgressBar动画.

我看了很多教程,其中没有一个对我很清楚.我只是想在后台下载文件时让它具有动画效果.每个我试过这种方式,它不会动画进度条,直到下载完成.

我需要帮助知道下载()调用的位置.

class MyFunClass extends JFrame {
  JProgressBar progressBar = new JProgressBar();

  public void buttonClicked() {
    progressBar.setVisible(true);
    progressBar.setIndeterminate(true);

    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        progressBar.setIndeterminate(true);
        progressBar.setVisible(true);

        // Do I do my download() in here??

    }});

    // Do download() here???
    progressBar.setVisible(false);
  }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!



编辑:对于那些将来遇到类似问题的人来说,这是基本问题的基本解决方案.这不是我的代码,而是一般草图.内部buttonClicked():

public void buttonClicked() {
  class MyWorker extends SwingWorker(String, Object) {
     protected String doInBackground() {
       progressBar.setVisible(true);
       progressBar.setIndeterminate(true);

       // Do my downloading code
       return "Done."
     }

     protected void done() {
        progressBar.setVisible(false)
     }
  }

  new MyWorker().execute();

}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 9

您当前的代码显示没有创建后台线程,而是显示您尝试 Swing线程对Swing线程中的代码进行排队,这对于此问题没有意义(尽管有时您可能想要这样做这,但是,再次,不在这里).成功的唯一方法是使用后台线程.标准的Oracle JProgressBar教程Swing中的Concurrency都经历了这一切.

基本的是你必须从Swing Thread更新JProgressBar才能在后台线程中执行长时间运行的进程,例如SwingWorker对象提供的进程.我们在这里审查的细节太多了,所以我所能做的就是提供一个链接,但是一旦您查看了教程,我们将很乐意帮助您了解详细信息.如果您仍然遇到问题,请查看教程并回答您的具体问题.

编辑1
您说明:

我可以在buttonClicked()函数中创建一个新的线程对象吗?

是的,您可以在buttonClicked() 方法内部创建SwingWorker对象并在那里执行它.

问题是我拥有我正在开发GUI的所有功能的API和库,并且它似乎是一个在线程中包装该函数调用的长途解决方法.

对不起,但我不知道你在这里说什么,或者你认为线程会导致什么问题.该buttonClicked()方法可能必须在EDT上运行,而不是在后台线程中运行.

另请注意,在我的大多数复杂的Swing GUI中,我经常在不同的(模型)对象中进行文件下载,并在GUI对象(视图)中的另一个对象(控件)中创建我的SwingWorker.这样做可能看起来更复杂,但是当我这样做时调试,维护和增强我的程序容易得多,特别是当我大量使用接口允许我单独测试所有程序组件时.

编辑2
对解决方案帖子的一些更正.你发布了:

public void buttonClicked() {
  class MyWorker extends SwingWorker(String, Object) {
     protected String runInBackground() {
       progressBar.setVisible(true);
       progressBar.setIndeterminate(true);

       // ...
Run Code Online (Sandbox Code Playgroud)

有问题

  • 是的doInBackground(),不是runInBackground()
  • 但更重要的是,你是在后台线程中进行Swing调用,这是永远不应该做的事情(除非调用是线程安全的,甚至是......).

所以改变它:

public void buttonClicked() {
  progressBar.setVisible(true);
  progressBar.setIndeterminate(true);
  class MyWorker extends SwingWorker<String, Void> {
     protected String doInBackground() {

       // ...
Run Code Online (Sandbox Code Playgroud)