これは質問ではありません。動作するサンプルコードです。コードは他の人を助けるかもしれません。また、改善方法についての投稿がいくつかあるかもしれません。それ。
更新を送信しないプロセスの進行状況バーが必要でした。完了するまで実行するだけです。したがって、不確定なプロセスバーが必要でした。
コードは、インターネットで見つけたコードに基づいています。そのコードには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();
}
}
}