当前位置: 首页 > 面试题库 >

基本的不确定JProgress Bar用法

楚涵润
2023-03-14
问题内容

当长时间下载完成后,我只想在帧的左下角添加不确定的JProgressBar动画。

我浏览了许多教程,但我都不清楚。我只是想在后台下载文件时使其具有动画效果。每个我试过这种方式,它不会动画进度条,直到 下载完成。

我需要知道我的download()调用位置的帮助。

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();

}

问题答案:

您当前的代码未显示创建后台线程,而是显示了您尝试
Swing线程中将代码在Swing线程上排队,但这对这个问题没有意义(尽管有时您可能想做这个,但又不是这里)。成功的唯一方法是使用后台线程。标准的Oracle
JProgressBar教程和Swing中的并发性贯穿了所有这一切。

基本的事情是您必须从Swing线程更新JProgressBar,它将在后台线程中执行长时间运行的过程,例如SwingWorker对象提供的过程。这里有太多细节需要我们复查,所以我所能做的就是提供一个链接,但是一旦您阅读了教程,我们将很乐意帮助您理解这些细节。只需查看教程,然后再提出一些具体问题(如果您仍然感到困惑)。

编辑1
您声明:

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

是的,您可以在buttonClicked() 方法 内部创建一个SwingWorker对象,然后在其中执行它。

问题是我拥有开发GUI所要使用的所有功能的API和库,并且似乎很费力地将函数调用包装在线程中。

抱歉,但我不知道您在这里说什么或您认为线程将导致什么问题。该buttonClicked()方法可能 必须 在EDT上运行,而不是在后台线程中运行。

还要注意,在大多数较复杂的Swing
GUI中,我经常在不同的(模型)对象中下载文件,并在与GUI对象(视图)不同的对象(控件)中创建SwingWorker。用这种方法执行起来似乎更复杂,但是用这种方法进行调试,维护和增强程序
容易得多,尤其是当我大量使用接口来允许我单独测试所有程序html" target="_blank">组件时。

编辑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() {

       // ...


 类似资料:
  • 问题内容: Java中是否有类似“ typeof”的函数来返回原始数据类型(PDT)变量的类型或操作数PDT的表达式? 似乎仅适用于类类型。 问题答案: 请尝试以下操作: 它将打印: 至于,您可以使用其动态对应项:

  • 问题内容: 我已经在SO和google上浏览了一段时间,以找到该问题的答案,但是我似乎找不到真正有效的方法。我将从头开始: 我用一个在后台运行批处理文件的方法创建了一个Java类(不显示命令窗口)。该程序运行良好,除了会使最终用户感到困惑之外,因为批处理文件需要一段时间才能完成-用户将不知道该程序是否仍在运行。批处理脚本执行完毕后,将显示一个消息对话框,说明已完成,但是在方法运行到对话框出现之间的

  • 我已经浏览了SO和谷歌一段时间,想找到这个问题的答案,但我似乎找不到一个真正有效的答案。我将从头开始: 我用一个方法创建了一个Java类,该方法在后台运行一个批处理文件(命令窗口不会出现)。该程序运行得很好,只是最终用户会感到有点困惑,因为批处理文件需要一段时间才能完成——用户将不知道该程序是否仍在运行。批处理脚本完成执行后,会出现一个消息对话框,说明它已完成,但在方法运行和对话框出现之间的一段时

  • 问题内容: 我正在尝试将JProgressBar添加到我的程序中,但不会更新!仅当原因为100%时,该值才会更改。这是我的方法。 更改进度栏的值位于上述方法的底部。 这就是我所谓的方法。 编辑:以上根本不是问题,问题之一是程序正在使用整数除法而不是十进制。 问题答案: 是一个整数,也是。因此发生的是小数被截断。你应该做什么,就像 这样做是确保将其除以具有十进制功能的数据类型,该数据类型将返回更具包

  • 介绍 (Introduction) JProgressBar类是一个可视地显示某个任务进度的组件。 Class 声明 (Class Declaration) 以下是javax.swing.JProgressBar类的声明 - public class JProgressBar extends JComponent implements SwingConstants, Access

  • Springfox昂首阔步的用户界面有错误的基本网址。我不清楚19080端口从哪里来,因为没有服务监听该端口。我需要做什么设置才能让springfox生成正确的基本网址? Swagger UI http://dev.example.com/newapi/swagger-ui.html 错误的基本URL 基本URL:dev.example。com:19080/newapi 正确的基本URL 基本UR