我目前正在自学Java。我一直在尝试使用JRadioButton
s,JcomboBox
es等不同的东西。现在,我正在尝试使用JProgressBar
s,但它似乎无法正常工作。
相关代码段:
JProgressBar progress;
JButton button; //Fields of the class
progress=new JProgressBar(JProgressBar.HORIZONTAL,0,100);
button=new JButton("Done"); //Done from methods
progress.setValue(0);
progress.setStringPainted(true);
progress.setBorderPainted(true); //Also done from methods
button.addActionListener(this); //Also done from methods
当button
被点击时,我想展示的JProgressBar去从0%到100%。这是方法的相关部分actionPerformed
:
public void actionPerformed(ActionEvent e)
{
for(int i=0;i<=progress.getMaximum();i++)
{
progress.setValue(i);
/*try{
Thread.sleep(10);
}catch(InterruptedException ex)
{
System.err.println("An error occured:"+ex);
ex.printStackTrace();
}*/
}
progress.setValue(progress.getMinimum());
}
我已经添加了两个progress
并button
成一个JPanel和面板插入我用一个JFrame setVisible(true);
。
这里的问题是,每当我按下JButton时button
,JProgressBarprogress
都不会从0%变为100%。相反,什么也没有发生。如果取消注释该try...catch
块,然后按button
,该程序将“冻结”片刻,然后继续。这次也是,JProgressBar保持在0%,我再也看不到它在移动。我也曾尝试过一次repaint();
,try...catch
但同样的事情发生了。
我尝试添加
System.out.println(i+"");
在for
循环中,actionPerformed
并且在终端上打印此数字0到100。因此,我确定循环会运行。
我怎么解决这个问题?
摆动是单线程的,
所有更新都必须在EDT上完成,
只需一会儿,即可在GUI中绘制当前EDT中的所有事件,
Thread.sleep
要在EDT中锁定事件的执行,可以在for_loop的末尾绘制重绘,在执行完所有锁定之后Thread.sleep
,Oracle跟踪中的更多内容-Swing和EventDispatchThread中的并发性
从AWT(摇摆)监听输出- ActionListener
,应该做的,如果里面的所有事件actionPerformed
被执行,那么只有执行progress.setValue(progress.getMinimum());
,不要紧,如果是有Thread.sleep
还是没有
public void actionPerformed(ActionEvent e) -> progress.setValue(progress.getMinimum());
使用SwingWorker
或Runnable#Thread
与progress.setValue(i);
包裹成invokeLater
为了更好地帮助,尽早发布SSCCE
/ MCVE
,简短,可运行,可编译
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句