簡體   English   中英

為什么我的SwingWorker不工作?

[英]Why isn't my SwingWorker working?

我的SwingWorker似乎不起作用。 它什么也不輸出到文本面板,什么也不輸出到控制台。 它甚至不執行ProcessBuilder中的實際cmd命令。

我不知道為什么它不起作用。 有人在代碼中看到任何錯誤嗎?

public class cmdExec extends SwingWorker<Integer, String> {

    private int status;

    private FormPanel formPanel = new FormPanel();
    private FooterBar footerBar = new FooterBar();
    private TextPanel textPanel = new TextPanel();

    public cmdExec() {
        textPanel.appendText((this.getState()).toString());
    }

    @Override
    protected Integer doInBackground() {
        try {

            ProcessBuilder pb = new ProcessBuilder(
                "cmd.exe", "/c", "copy NUL createThis.txt"
            );
            pb.directory(new File(formPanel.workspaceDir.toString()));
            pb.redirectErrorStream(true);
            Process p = pb.start();
            String s;
            BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream()));

            while((s = stdout.readLine()) != null && !isCancelled()) {
                publish(s);
            }
            if(!isCancelled()) {
                status = p.waitFor();
            }
            p.getInputStream().close();
            p.getOutputStream().close();
            p.getErrorStream().close();
            p.destroy();

        } catch(IOException | InterruptedException ex) {
            ex.printStackTrace(System.err);
        }

        return status;
    }

    @Override
    protected void process(List<String> messages) {
        formPanel.okBtn.setText((this.getState()).toString());
        for(String message : messages) {
            textPanel.appendText(message + "\n");
        }
    }

    @Override
    protected void done() {
        textPanel.appendText((this.getState()).toString() + " " + status);
        formPanel.okBtn.setEnabled(true);
        footerBar.progress.setIndeterminate(false);
        formPanel.disableList(false);
        formPanel.disableWorkspace(false);
    }

}

在我的主類中,我只是調用cmdExec.execute(); 使其運行,我檢查了它是否可以調用它並且確實可以。 我通過將一個sysout添加到我的swingworker中的所有方法中進行了檢查,並確實將它們打印在應該運行的方法上。

我忘了什么嗎? 我只是通過再次查看所有內容以嘗試查看我錯過的內容而變得盲目。

這是調用SwingWorker類的代碼:

cmdExec cmdExec = new cmdExec();
cmdExec.execute();

按下按鈕時,此代碼位於ActionListener中。

經過進一步研究; 我注意到這是由於以下三行:

private FormPanel formPanel = new FormPanel();
private FooterBar footerBar = new FooterBar();
private TextPanel textPanel = new TextPanel();

但我確實需要在這些類中訪問變量。 我該怎么做並使它們全部正常工作?

新建設者

public cmdExec(FormPanel formPanel,FooterBar footerBar,TextPanel textPanel ) {
            textPanel.appendText((this.getState()).toString());
        }

並在runWorker()中傳遞要更改的值。

   cmdExec = new cmdExec(formPanel,footerPanel,textPanel);
   cmdExec.execute();

但是,如您的代碼所示,您需要添加一個PropertyChangeListeners ,在文檔中可以看到更多有關如何添加進度條的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM