基本不确定JProgress酒吧用法(Basic Indeterminate JProgress B

2019-06-24 04:20发布

我只是想有一个不确定的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);
  }
}

提前致谢!



编辑:对于那些谁在未来也有类似的问题,对我来说,这是一个基本的问题基本解决。 这不是我的代码逐字,但一般的草图。 里面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();

}

Answer 1:

您当前的代码显示没有创建一个后台线程,而是它表明你试图 Swing线程中的队列Swing线程的代码没有任何意义了这个问题(虽然也有偶尔的时候,你可能想要做的这一点,但同样,不是在这里)。 这个成功的唯一方法就是使用一个后台线程。 标准的Oracle 的JProgressBar教程和并发Swing中经历了这一切。

基本的事情是,你必须从Swing线程更新的JProgressBar会做你的长期运行的进程在后台线程,如由的SwingWorker对象提供。 还有为我们都在这里回顾太多的细节,所以我能做的是提供一个链接,但我们会很乐意帮助您了解的细节,一旦你查看教程。 只是检查教程,并与您的具体问题回到来吧,如果你还在坚持。

编辑1
幽州:

我能不能创造buttonClicked()函数中的一个新的线程对象?

是的,你可以创建的内部的SwingWorker对象buttonClicked() 方法并执行它。

事情是我有我的API和所有我开发的GUI的功能库,它似乎是一个冗长的解决办法来包装一个线程函数调用。

很抱歉,但我不知道你在说什么在这里,或者你觉得穿什么问题会导致。 该buttonClicked()方法可能必须在美国东部时间,而不是在后台线程中运行。

还要注意,在大多数我的更复杂的Swing GUI的年代,我经常做我的文件下载在不同的(模型)对象,仍然创造我在不同的SwingWorker对象从GUI对象(图)(控制)。 这似乎更复杂,做这种方式,但它更容易调试了很多 ,保持和增强我的程序,当我这样做,特别是当我大量使用接口,让我隔离测试所有程序组件。

编辑2
一些更正您的解决方案后。 您发布的评论:

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

       // ...

其中有问题

  • 它的doInBackground()而不是runInBackground()
  • 但更重要的是,你正在做的Swing从后台线程,一些不应该做的(除非该调用是线程安全的,即使这样......)中调用。

所以,改变它:

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

       // ...


文章来源: Basic Indeterminate JProgress Bar Usage