【发布时间】: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 example 或Short, Self Contained, Correct Example。
-
我在使用
BufferedReader时要小心,某些进程可能不会打印换行符。 -
您的主要问题是,您正在创建一堆似乎没有添加到任何可见 UI 容器中的类/组件的新实例
标签: java swing swingworker