开发者

Java file a progress bar

开发者 https://www.devze.com 2023-03-14 06:59 出处:网络
I\'m new to Java. I want to write a program that makes arcive of file and i want to use progress bar to show progress of zipping

I'm new to Java. I want to write a program that makes arcive of file and i want to use progress bar to show progress of zipping There is my code, but it duosen't work shows only 100% when work is done.

        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();

    }}

Maybe someone knows where is the problem?


I call doZip by pressing the botton. I tried this

 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){;}

but it also doesent work, only makes process of zip opperation much more longer.


I assume you are calling doZip from somewhere in the AWT thread (e.g. called (in)directly by an action handler as response to a click or something). Therefore the UI is not updated until the action (zipping) is finished, even if you set the progress accordingly in between..

One solution would be to start doZip in a separate thread (in general it is good advice to avoid any costly operation in the AWT thread, but only do basic 'action handling' and trigger long-running operations from there...)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号