【问题标题】:Why isn't my SwingWorker working?为什么我的 SwingWorker 不工作?
【发布时间】:2017-01-26 13:06:21
【问题描述】:

我的 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(); 来让它运行,我检查了它是否可以调用它并且确实可以。我通过向我的 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();

但我确实需要访问这些类中的变量。我怎样才能做到这一点并让一切正常运行?

【问题讨论】:

  • 你可以在执行你的 swingworker 时发布代码吗?
  • @Gatusko 绝对!我编辑了主要帖子。在实际的 swingworker 类中似乎有问题,因为它成功调用了它。此外,如果您真的想深入了解,所有代码都在这个 github 存储库中:github.com/condolent/USB3Installer
  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 我在使用BufferedReader 时要小心,某些进程可能不会打印换行符。
  • 您的主要问题是,您正在创建一堆似乎没有添加到任何可见 UI 容器中的类/组件的新实例

标签: java swing swingworker


【解决方案1】:

新构造函数

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

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

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

但正如您在代码中看到的那样,您需要添加一个PropertyChangeListeners,请参阅文档中的更多信息如何添加进度条Documentation of SwinWorker

【讨论】:

  • 但这只允许我使用 cmdExec 方法中的变量,对吧?它不会让我在课堂上的其他方法中使用它们。比如doInBackground() 方法。还是我完全错过了什么?
  • 编辑:例如,我意识到我必须通过 this.footerPanel = footerPanel; 初始化变量。非常感谢你的帮助! :)
猜你喜欢
  • 1970-01-01
  • 2014-05-17
  • 2017-09-20
  • 2012-04-14
  • 2016-09-15
  • 2012-02-14
  • 2012-08-10
  • 2013-07-27
  • 1970-01-01
相关资源
最近更新 更多