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

ProgressBar不会在Java中更改其值

戈建白
2023-03-14
问题内容

我有一个奇怪的问题。我设置了一个JProgressBar:

private JProgressBar progressBar;

public void foo()
{
    ...
    progressBar = new JProgressBar(0, 100);
    progressBar.setValue(0);
    progressBar.setStringPainted(true);
    ...
    contentPane.add(progressBar);
    ...
}

但是,只有当我将setValue函数放在代码中的某些位置(而不是到处都是)时,它才会更改:

public void foo2()
{
    progressBar.setValue(100); //working
    if(...)
    {
        System.out.println("These instructions are executing"); //working
        progressBar.setValue(0);                                //not working
    }                             
}

那么,我在做什么错呢?为什么第二条指令不起作用?


问题答案:

进度栏的值实际上已更新。但这还不只是在屏幕上。通常,我们在循环中使用进度条。但是,当您处于循环中时,您可能 通过单击按钮来调用
该循环,但该循环没有被绘制。为什么?因为您通过单击按钮来调用它。当您单击一个按钮时,您为该按钮编写的所有代码都将由来执行AWTEventThread。这是跟踪所有Swing组件并检查是否需要重新绘制的同一线程。那就是使您的JFrame活跃起来的线程。当您将鼠标悬停在某个按钮上并且颜色发生一些变化时,该操作由来完成AWTEventThread

因此,在循环中工作时,AWTEventThread无法再更新屏幕。

这意味着有两种解决方案:

  1. (推荐)您应该创建一个单独的线程来执行循环。这意味着AWTEventThread可以根据需要更新屏幕(调用时bar.setValue(...);

    public void yourButtonClickMethod()
    

    {
    Runnable runner = new Runnable()
    {
    public void run() {
    //Your original code with the loop here.
    }
    };
    Thread t = new Thread(runner, “Code Executer”);
    t.start();
    }

  2. 手动重新绘制进度条。我一直都这样做,bar.repaint();但是我想知道它是否会起作用。我就是那个方法。如果不行,请尝试:bar.update(bar.getGraphics());



 类似资料:
  • 我正在学习JAVA,WEB服务,特别是SOAP。根据本教程,我们可以自定义WSDL,就像我们可以通过使用注释覆盖deafult post名称和服务名称一样。所以我试了一下: 一揽子做法; 导入java.util.List; 导入javax.jws.WebMethod;导入javax.jws.WebService; @webmethod 公共列表getBooks(String category) {

  • 问题内容: 有没有办法在SWT中更改ProgressBar栏的颜色? 似乎不起作用。 如果无法通过编程方式更改颜色,是否可以使用WindowBuilder GUI工具更改ProgressBar的颜色? 谢谢! 问题答案: 在SWT中,有3种内置状态,每种状态用一种颜色表示: 此状态不支持不确定的进度条样式(SWT.INDETERMINATE)。 此状态将暂停不确定的进度条动画。

  • 我试图理解如何在多线程环境中更新ProgressBar。我在这里做错了什么,但我不知道是什么。这只需每隔3秒填满一次,但不会: 我错过了什么?

  • 问题内容: 我的工厂看起来像: 它吐出日志,但不更改路径。我该怎么做才能做到这一点? 问题答案: $ location 的文档说: 请注意,设置员不会立即更新window.location。而是$ location服务知道作用域的生命周期,并在作用域$ digest阶段将多个$ location突变合并为一个“ commit”到window.location对象。 因此,如果拒绝诺言对产生影响,那

  • 我正在制作一个程序来修补一些文件,我想用一个作为进度指示器,但是进度条保持完全满的状态,完成后不会重置。这是更新它的方法。 我已经试过了 但当我使用它时,它根本不会显示任何进展<代码>线程。sleep()也不行。

  • 问题内容: 我有一个简单的Java类,如下所示: 这段代码的输出是这样的: 为什么s不在finally块中覆盖,而是控制打印输出? 问题答案: 在与所述的执行块完成语句和的值在时间语句执行是由该方法返回的值。finally子句稍后s(在语句完成之后)更改值的事实(此时)并未更改返回值。 请注意,以上内容处理的s是对块中自身值的更改,而不是对s引用对象的更改。如果s是对可变对象的引用(String不