我希望这是一个不需要 SSCCE 的简单问题,因为我很难将一个简短但包含所有必要部分的问题放在一起。
我有一个包含 JProgressBar 的 GUI (JFrame)。里面的进度条代码createGUI()
:
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 远离长时间运行的进程。updateProgress()
progressBar 最初设置为不确定,但在创建第二个目录(文件将被复制到该目录)后,进度条在第一个方法调用时设置为常规(非不确定)模式(updateProgress()
是我自己在SwingWorker 类,我将其命名为“任务”,创建它以便setProgress()
可以从 EDT 外部访问)。这包含在 内部class Task extends SwingWorker<Void, String>{}
,以及标准doInBackground()
方法等:
public void updateProgress(int tick){
if(progressBar.isIndeterminate())
progressBar.setIndeterminate(false);
setProgress(tick);
}
然后我创建了一个 PropertyChangeListener 来更新进度条,无论何时setProgress()
使用新值(也在内部createGUI()
)调用:
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)");
}
}
};
我的问题如下:
首次渲染帧时,仅出现 0%,并且“(xxMB of xxMB)”不可见。括号中的第二部分仅在第一次百分比变化后出现。newPercentValue
有没有办法在更改之前更新 MB 值(显示已复制文件的大小和总大小) ?听者当前的坐姿,它(百分比和 MB 值)仅在百分比第一次增加后更新。如何在百分比从 0% 变化之前更新 MB 值?
我希望这里有足够的代码可以继续。我通常会发布一个 SSCCE,但老实说,我不知道在这种情况下我会如何做,并且在不添加大量代码的情况下包含所有文件大小和百分比更新。我试图只包含最重要的信息,但如果有其他我应该添加的内容,请随时要求更多。非常感谢!