1

これは質問ではありません。動作するサンプルコードです。コードは他の人を助けるかもしれません。また、改善方法についての投稿がいくつかあるかもしれません。それ。

更新を送信しないプロセスの進行状況バーが必要でした。完了するまで実行するだけです。したがって、不確定なプロセスバーが必要でした。

コードは、インターネットで見つけたコードに基づいています。そのコードにはJPanelがありました。JDialog への切り替えが不可欠です。そうしないと、数値が正しくなる前に戻ります。

「インポート com.adamford.LuSch.GP;」トップレベルのフレームである GP.mainFrame を取得するためだけに使用されます。インポートを削除し、独自のフレームを追加します。

以下はコードです。バックグラウンドで実行されるプロセスは walkFileTree() です。


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

import com.adamford.LuSch.GP;

public class FldrStats extends JPanel  {

    private static JDialog jDia;
    private JProgressBar progressBar;
    private Task task;
    private String theSubdir;
    private File theSubfile;
    private double numOfBytes;
    private ArrayList<File> fileList = new ArrayList<File>();
    private ArrayList<File> subdirList = new ArrayList<File>();
    private static DecimalFormat DF = new DecimalFormat("#.##");
    private boolean debug = false;

    public FldrStats(String subdir) {        
        super(new BorderLayout()); 
        theSubdir = subdir;
        theSubfile = new File(theSubdir);
         // create the progress bar
        progressBar = new JProgressBar(0, 100);
        progressBar.setString("for folder " + subdir + " ");
        progressBar.setIndeterminate(true);
        progressBar.setStringPainted(true);
        // start the background task
        task = new Task();
        task.execute();
        // JPanel
        JPanel panel = new JPanel();
        panel.add(progressBar);
        add(panel, BorderLayout.PAGE_START);
        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        jDia = new JDialog(GP.mainFrame,"Calculating folder stats . . . ",true);        
        jDia.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);             
        panel.setOpaque(true); // content panes must be opaque
        jDia.setContentPane(panel); // add the main panel
        jDia.pack(); // size the jDia
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension labelSize = jDia.getContentPane().getPreferredSize();
        jDia.setLocation(screenSize.width / 2 - (labelSize.width / 2),
                screenSize.height / 2 - (labelSize.height / 2));
        jDia.setMinimumSize(new Dimension(300,50));
        jDia.setVisible(true); // display the jDia

    }

    private void finishUp() {
        // Executed in event dispatching thread
        Toolkit.getDefaultToolkit().beep();
        setCursor(null); // turn off the wait cursor
        jDia.dispose();
        if(debug) {
            System.out.println("Finishing");      
            System.out.println("Ab\t" + getNumSubdirs() + " subdirs");
            System.out.println("Ab\t" + getNumFiles() + " files");
            System.out.println("Ab\t" + getBytes() + " bytes");
        }
    }

    private double walkFileTree(File folder) {
        // re-entrant routine
        numOfBytes = 0;
        File[] filelist = folder.listFiles();
        for (int i = 0; i < filelist.length; i++) {
            File thisOne = filelist[i];
            if (thisOne.isDirectory()) {
                subdirList.add(thisOne);
                numOfBytes += walkFileTree(thisOne);
            } else {
                fileList.add(thisOne);
                numOfBytes += thisOne.length();
            }
        }
        return numOfBytes;
    }

    public String getSubdir() { return theSubdir; }
    public double getBytes() { return numOfBytes; }
    public double getKb() { return Double.valueOf(DF.format(numOfBytes/(1024.0))); }
    public double getMb() { return Double.valueOf(DF.format(numOfBytes/(1024.0*1024.0))); }
    public double getGb() { return Double.valueOf(DF.format(numOfBytes/(1024.0*1024.0*1024.0))); }
    public int getNumFiles() { return fileList.size(); }    
    public int getNumSubdirs() { return subdirList.size(); }

    public static void main(String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new FldrStats("c:/aa");
                System.out.println("HERE");
             }
        });
    }

   //###################################################################
    class Task extends SwingWorker<Void, Void> {
        @Override
        public Void doInBackground() {
            // Main task. Executed in background thread.
            walkFileTree(theSubfile);
            return null;
        }

        @Override
        public void done() {
            finishUp();
        }
    }

}
4

0 に答える 0