Hoo*_*ome 6 java swing progress-bar
我有奇怪的问题.我设置了一个JProgressBar:
private JProgressBar progressBar;
public void foo()
{
...
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
...
contentPane.add(progressBar);
...
}
Run Code Online (Sandbox Code Playgroud)
但是只有当我将setValue函数放在代码中的某些地方而不是所有地方时它才会改变:
public void foo2()
{
progressBar.setValue(100); //working
if(...)
{
System.out.println("These instructions are executing"); //working
progressBar.setValue(0); //not working
}
}
Run Code Online (Sandbox Code Playgroud)
那么,我做错了什么?为什么第二条指令不起作用?
Mar*_*aux 17
进度条的值确实已更新.但它不仅仅是在屏幕上.通常,我们在循环中使用进度条.但是,当您处于循环中时,您可能通过单击按钮来调用它,而不是它.为什么?因为您通过单击按钮来调用它.当您单击按钮时,您为该按钮创建的所有代码都由AWTEventThread.这是跟踪所有Swing组件的相同线程,并检查它们是否必须重新绘制.这是让你的JFrame活跃起来的线程.当你悬停一个按钮并且颜色稍微改变时,它就是由AWTEventThread.
因此,当您在循环中工作时,AWTEventThread无法再更新屏幕.
这意味着有两种解决方案:
(推荐)您应该创建一个执行循环的单独线程.这意味着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();
}
Run Code Online (Sandbox Code Playgroud)手动重绘进度条.我总是这样做,bar.repaint();但我想知道它是否会奏效.我虽然是那种方法.如果这不起作用,请尝试:bar.update(bar.getGraphics());.
| 归档时间: |
|
| 查看次数: |
12953 次 |
| 最近记录: |