【发布时间】:2011-10-24 10:59:43
【问题描述】:
我正在将一个大文件切割成块,并希望显示进度。 当我点击 startCut 按钮时,执行代码如下:
FileInputStream in = new FileInputStream(sourceFile);
int blockSize = (int)(getSelectedBlockSize() * 1024);
int totalBlock = Integer.parseInt(txtNumberOfBlock.getText());
byte[] buffer = new byte[blockSize];
int readBytes = in.read(buffer);
int fileIndex = 1;
class PBThread extends Thread
{
@Override
public void run()
{
while(true)
{
pbCompleteness.setValue(value);
//value++; //place A
System.out.println(value);
if (value >= 100)
break;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
value = 0;
PBThread pbThread = new PBThread();
pbThread.start();
while(readBytes != -1)
{
File file = new File(targetFilePath + fileIndex);
FileOutputStream out = new FileOutputStream(file);
out.write(buffer, 0, readBytes);
out.close();
value = (int)(fileIndex / (double)totalBlock * 100);// place B
readBytes = in.read(buffer);
fileIndex++;
}
我在B处的run方法之外改变了progressbar的值,问题是——grogressbar只显示两种状态:0%和100%。
但是,如果我拿走 B 处的代码,并在 A 处的 run 方法中更改进度条的值,问题就会消失。
我知道也许SwingWorker 可以很容易地修复它,但我确实想知道为什么会这样,虽然我在运行方法中更改了值,但当我在运行方法中打印出来时,它确实改变了。
如何在 run 方法之外更改值时解决该问题?
【问题讨论】:
-
除了您已经收到的好建议之外..
Thread.sleep(100);- 不要那样做。如果 GUI 中需要延迟(例如动画),请创建一个 SwingTimer。
标签: java swing progress-bar