我是Java的新手。 我想编写一个使文件成为弧形的程序 我想使用进度条显示压缩的进度 有我的代码,但它不起作用 工作完成时只显示100%。
getContentPane().add(progressBar);
progressBar.setBorder(new CompoundBorder(null, null));
springLayout.putConstraint(SpringLayout.EAST, progressBar, 0, SpringLayout.EAST, messageLabel);
springLayout.putConstraint(SpringLayout.WEST, progressBar, 0, SpringLayout.WEST, messageLabel);
springLayout.putConstraint(SpringLayout.SOUTH, progressBar, 165, SpringLayout.NORTH, getContentPane());
springLayout.putConstraint(SpringLayout.NORTH, progressBar, 5, SpringLayout.SOUTH, uploadLocalButton);
progressBar.setValue(0);
progressBar.setMaximum(100);
progressBar.setMinimum(0);
progressBar.setStringPainted(true);
...
public void doZip(String filename,String outFilename)
{
try {
byte[] dataBytes = new byte[1024];
File file = new File(outFilename);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
ZipOutputStream zos = new ZipOutputStream(fos);
File fil = new File(filename); //"Users/you/image.jpg"
long length= fil.length();
System.out.println(length);
zos.putNextEntry(new ZipEntry(fil.getName()));//image.jpg
FileInputStream in = new FileInputStream(filename);
int current=0;
int len;
while ((len = in.read(dataBytes)) > 0)
{ current += len;
messageLabel.setText(Integer.toString(current));
System.out.println(current);
final double progres=(((double)current/(double)length)*100);
progressBar.setValue((int)progres);
zos.write(dataBytes, 0, dataBytes.length);
}
zos.closeEntry();
zos.close();
in.close();
}catch (IOException e) {
JOptionPane.showMessageDialog(null,
"Access denied. File or patch not exist or in currently in use.","Error",
JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}}
也许有人知道问题出在哪里?
按下按钮,我打电话给 doZip 。 我试过这个
while ((len = in.read(dataBytes)) > 0)
{ current += len;
zos.write(dataBytes, 0, dataBytes.length);
final double progres=(((double)current/(double)length)*100);
try{
SwingUtilities.invokeLater(new Runnable(){
public void run(){
progressBar.setValue((int)progres);
}
});
java.lang.Thread.sleep(100);
}catch(InterruptedException e){;}
但它也有效,只会使拉链操作的过程更长。
答案 0 :(得分:2)
我假设您正在从AWT线程中的某个地方调用doZip
(例如,由操作处理程序直接调用(in)作为对点击或其他内容的响应)。因此,在操作(压缩)完成之前,UI不会更新,即使您在两者之间相应地设置了进度..
一个解决方案是在一个单独的线程中启动doZip
(通常,建议避免AWT线程中的任何代价高昂的操作,但只做基本的“动作处理”并触发长时间运行的操作那里...)