为什么我的SwingWorker不工作?

时间:2017-01-26 13:06:21

标签: java swing swingworker

我的SwingWorker似乎不起作用。它不会在textpanel中输出任何内容,也不会输出到控制台中。它甚至不能在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();来运行它,我检查它是否可以调用它,它确实可以。我通过向我的swingworker中的所有方法添加一个sysout来检查它,并且它确实打印了它应该运行的方法。

我忘记了什么吗?我只是再次透视它来试图看到我错过的东西而失明。

这是调用SwingWorker类的代码:

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

当按下按钮时,此代码位于ActionListener中。

经过进一步研究;我注意到它是因为这3行:

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

但我真的需要在这些类中找到变量。我怎么能这样做并让它全部工作?

1 个答案:

答案 0 :(得分:1)

新构造函数

 firebaseDatabaseRef.addValueEventListener(new ValueEventListener() {
     @Override public void onDataChange(DataSnapshot dataSnapshot) {
        customPOJO customPOJO = dataSnapshot.getValue(YourCustomPOJO.class);
        customPOJO.getName();
        customPOJO.getEmail();
        customPOJO.getfavoriteFood();
        //and so on....

     }

     @Override public void onCancelled(DatabaseError databaseError) {

     }
  });

并在runWorker()中传递要更改的值。

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

但是,如您的代码中所示,您需要添加 cmdExec = new cmdExec(formPanel,footerPanel,textPanel); cmdExec.execute(); ,请参阅文档中有关如何添加进度条的更多信息Documentation of SwinWorker