2

我正在制作一个旨在作为备份的程序。我已经SwingWorker进行了备份并将其所做的事情发布到JTextArea. 我想要一个按钮来取消工人,(一次初始化的数量未知)所以这就是我调用摇摆工人的方法,以及取消方法:

package main;

import java.io.File;
import java.util.ArrayList;

import javax.swing.SwingWorker;

public class test2 {

SwingWorker bw;
static ArrayList bgWorker = new ArrayList();
ArrayList al = new ArrayList(); // this is the list of files selected
static boolean bwInitiallized = false;

public void startBackup() throws Exception {
    Panel.txtArea.append("Starting Backup...\n");

    for (int i = 0; i < al.size(); i++) {
        /**
         * THIS IS WHERE I NEED TO CREATE THE FOLDER THAT EACH BACKUP FILE
         * WILL GO INTO EX: SC2 GOES INTO A FOLDER CALLED SC2 AND RIOT GOES
         * TO RIOT, ALL WITHIN THE DIRECTORY CHOSEN
         */
        File file = new File((String) al.get(i));
        File directory = new File(dir); // dir is gotten by a JFileChooser.

        bw = new BackgroundWorker(Panel.txtArea, file, directory);
        bgWorker.add(bw);
        bwInitiallized = true;
        bw.execute();

        /**
         * follows to the bottom of the txtarea
         */
        int x;
        Panel.txtArea.selectAll();
        x = Panel.txtArea.getSelectionEnd();
        Panel.txtArea.select(1, x);
    }
}

public static void cancel() {
    BackgroundWorker bg;

    if (bwInitiallized) {
        bwInitiallized = false;
        Panel.txtArea.append("Cancelling...\n");
        for (int i = 0; i < bgWorker.size(); i++) {
            bg = (BackgroundWorker) bgWorker.get(i);
            bg.cancel(true);
        }
        Panel.txtArea.append("Canceled backUp!\n");
    } else {
        Panel.txtArea.append("Cannot Cancel! Not Initiallized!\n");
    }
}
}

好吧,由于我无法弄清楚的原因,这并没有取消其中的任何一个(据我所知)。我唯一能想到的就是当我做的时候

bg = (BackgroundWorker) bgWorker.get(i);
bg.cancel(true);

它没有做我认为它做的事情,但是 idk。我究竟做错了什么?提前致谢!

4

1 回答 1

4

我会class FileWorker extends SwingWorker<File, File>为每个文件创建一个实例,并创建一个实例class Supervisor extends SwingWorker<Queue<File>, File>来管理它们,如本示例中所建议的那样。您可以允许用户取消个人FileWorker或让Supervisor他们全部取消。此处cancel()显示了一个使用示例。

在任何情况下,请使用适当的SwingWorker类型参数以确保安全,并按照@Hovercraft 评论中的建议严格检查您的设计。

于 2012-08-28T03:08:56.340 回答