2

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

しかし、それも機能せず、zip 操作のプロセスがはるかに長くなります。

4

1 に答える 1

2

AWTスレッドのどこかから呼び出していると思いdoZipます(たとえば、クリックなどへの応答としてアクションハンドラーによって直接呼び出されます)。したがって、途中で進行状況を適切に設定しても、アクション (圧縮) が完了するまで UI は更新されません。

1 つの解決策は、別のスレッドで開始する doZipことです (一般に、AWT スレッドでコストのかかる操作を避けることをお勧めしますが、基本的な「アクション処理」のみを実行し、そこから長時間実行される操作をトリガーします...)

于 2011-06-21T18:51:28.463 に答える