0

我希望这是一个不需要 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,但老实说,我不知道在这种情况下我会如何做,并且在不添加大量代码的情况下包含所有文件大小和百分比更新。我试图只包含最重要的信息,但如果有其他我应该添加的内容,请随时要求更多。非常感谢!

4

1 回答 1

2

当您发现文件的大小时,为什么不将进度条设置为 0%(并因此触发更改事件)?

于 2013-12-30T01:14:41.650 回答