![](/img/trans.png)
[英]Why isn't my image downloading when I use a SwingWorker but downloads when I don't?
[英]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.