不确定的SwingWorker的示例代码

时间:2012-12-22 20:18:12

标签: progress-bar swingworker

这不是问题。它的示例代码有效。 代码可以帮助其他人。也许会有一些关于如何改进的帖子。它

我想要一个没有发送更新的进程的进度条。 它一直运行直到它完成。因此,我需要一个不确定的流程栏。

代码基于我在互联网上找到的一些代码。 该代码有JPanel。切换到JDialog是必不可少的,或者它在之前返回 数字是对的。

“import 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();
        }
    }

}

0 个答案:

没有答案