有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何阻止SwingWorker。立即进行后台处理?

根据甲骨文docsSwingWorker.doInBackground不包括任何可能抛出InterruptedException的代码。不知道我的理解是否正确,但我注意到取消doInBackground进程会打印出InterruptedException,因此即使遇到Exception它也会继续。那么我们如何立即取消并停止该进程呢

所以我尝试了return STATUS;当它被取消时,但仍在继续。我也试过PROCESS.destroyForcibly()return之前,但还是一样。取消后如何立即停止

import ...

public class Test {

    private BackgroundProcess BG_PROCESS;
    private JFileChooser FILE_CHOOSER;
    private JProgressBar PROGRESS_BAR;


    public Test() {
        initComponents();
    }

    ...

    private class BackgroundProcess extends SwingWorker<Integer, String> {

        private int STATUS;

        @Override
        protected Integer doInBackground() throws Exception {

            File[] SELECTED_FILES = FILE_CHOOSER.getSelectedFiles();

            for (int i = 0; i < SELECTED_FILES.length; i++) {

                String file = SELECTED_FILES[i].getAbsolutePath();
                String name = SELECTED_FILES[i].getName();

                String[] command = {"javac", "" +file+ ""};

                try {
                    ProcessBuilder PROCESS_BUILDER = new ProcessBuilder(command);
                    Process PROCESS = PROCESS_BUILDER.start();
                    if (!isCancelled()) {
                        STATUS = PROCESS.waitFor();
                        if (STATUS == 0) {
                            TEXTAREA.append(name+ "Successfully compiled.");
                        } else {
                            TEXTAREA.append(name+ "Failed. (not compiled)");
                        }
                    } else {
                        TEXTAREA.append("Compilation cancelled.");
                        return STATUS;
                    }
                    PROCESS.destroy();
                } catch (IOException | InterruptedException ex) {
                    ex.printStackTrace(System.err);
                }
            }

            return STATUS;
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}

启动背景流程

JButton START = new JButton("Start");
START.addActionListener(new ActionListener() {
    @Override
    ...

    BG_PROCESS = new BackgroundProcess();
    BG_PROCESS.execute();
    PROGRESS_BAR.setIndeterminate(true);
});

取消背景处理

JButton CANCEL = new JButton("Cancel");
CANCEL.addActionListener(new ActionListener() {
    @Override
    ...

    BG_PROCESS.cancel(true);
    PROGRESS_BAR.setIndeterminate(false);
});

共 (0) 个答案