Java файл индикатор выполнения - PullRequest
2 голосов
/ 21 июня 2011

Я новичок в Java. Я хочу написать программу, которая делает arcive файла и я хочу использовать индикатор выполнения, чтобы показать прогресс архивирования Есть мой код, но он не работает показывает только 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){;}

но это также делает работу, только делает процесс операции Zip намного дольше.

1 Ответ

2 голосов
/ 21 июня 2011

Я предполагаю, что вы звоните doZip откуда-то в потоке AWT (например, вызывается (in) напрямую обработчиком действия в ответ на щелчок или что-то в этом роде).Поэтому пользовательский интерфейс не обновляется до тех пор, пока действие (архивирование) не будет завершено, даже если вы установите соответствующий прогресс между ..

Одним из решений было бы запустить doZip в отдельном потоке (как правило, этохороший совет: избегайте дорогостоящих операций в потоке AWT, но выполняйте только базовую «обработку действий» и запускайте там длительные операции ...)

...