在不更改值的情况下触发JProgressBar的PropertyChangeListener

时间:2013-12-30 00:51:12

标签: java swing swingworker jprogressbar propertychangelistener

我希望这是一个简单的问题,不需要SSCCE,因为我很难把一个简短但又包含所有必要部分。

我有一个包含JProgressBar的GUI(JFrame)。 createGUI()内的ProgressBar代码:

progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
progressBar.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
progressBar.setValue(0);
progressBar.setIndeterminate(true);

进度条使用apache commons IO FileUtils / copyFile类/方法监视文件复制。绘制的字符串是到目前为止复制的百分比(进度)和总MB。这一切都是使用SwingWorker完成的,以保持EDT远离长时间运行的进程。 progressBar最初设置为不确定,但在创建第二个目录(将复制文件)之后,在第一次updateProgress()方法调用时,进度条设置为常规(非不确定)模式({ {1}}是我自己在SwingWorker类中的方法,我将其命名为“task”,创建时可以从EDT外部访问updateProgress()。这包含在setProgress()内,以及标准class Task extends SwingWorker<Void, String>{}方法等:

doInBackground()

然后我创建了一个PropertyChangeListener,用于在使用新值(也在public void updateProgress(int tick){ if(progressBar.isIndeterminate()) progressBar.setIndeterminate(false); setProgress(tick); } 内)调用setProgress()时更新进度条:

createGUI()

我的问题如下:

首次渲染帧时,仅显示0%,并且“(xxMB of xxMB)”不可见。括号中的第二部分仅在百分比第一次更改后出现。有没有办法在PropertyChangeListener listener = new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent event){ if("progress".equals(event.getPropertyName())){ currentPercent = (int)event.getNewValue(); progressBar.setValue((int)currentPercent); progressBar.setString(Integer.toString(newPercentValue) + "% (" + String.format("%.2f", currentMB) + "MB of " + String.format("%.2f", totalMB) + "MB)"); } } }; 更改之前更新MB值(显示已复制文件的大小和总大小)?侦听器当前所处的位置,它(百分比和MB值)仅在百分比第一次增加后才更新。如何在百分比从0%变化之前更新MB值?

我希望这里有足够的代码继续下去。我通常会发布一个SSCCE,但老实说,我不知道在这种情况下我是如何做到的,包括所有文件大小和百分比更新,而不添加大量的代码。我试图只包含最重要的信息,但如果有其他我应该添加的内容,请随时请求更多信息。非常感谢!

1 个答案:

答案 0 :(得分:2)

为什么在找出文件大小时不将进度条设置为0%(因此触发更改事件)?

相关问题