为什么我的 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);
}
}
在我的主要 class 中,我只是为它调用一个 cmdExec.execute();
到 运行,我检查了它是否可以调用它并且确实如此。我通过向我的 swingworker 中的所有方法添加一个系统输出来检查它,它确实在它应该 运行.
的方法上打印它们
我是不是忘记了什么?我只是通过再次查看它来尝试看看我错过了什么而变得盲目。
这是调用 SwingWorker 的代码 class:
cmdExec cmdExec = new cmdExec();
cmdExec.execute();
此代码位于按下按钮时的 ActionListener 中。
经过进一步研究;我注意到这是因为这 3 行:
private FormPanel formPanel = new FormPanel();
private FooterBar footerBar = new FooterBar();
private TextPanel textPanel = new TextPanel();
但我确实需要访问那些 classes 中的变量。我怎样才能做到这一点并使其全部正常工作?
新建构造函数
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
我的 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);
}
}
在我的主要 class 中,我只是为它调用一个 cmdExec.execute();
到 运行,我检查了它是否可以调用它并且确实如此。我通过向我的 swingworker 中的所有方法添加一个系统输出来检查它,它确实在它应该 运行.
我是不是忘记了什么?我只是通过再次查看它来尝试看看我错过了什么而变得盲目。
这是调用 SwingWorker 的代码 class:
cmdExec cmdExec = new cmdExec();
cmdExec.execute();
此代码位于按下按钮时的 ActionListener 中。
经过进一步研究;我注意到这是因为这 3 行:
private FormPanel formPanel = new FormPanel();
private FooterBar footerBar = new FooterBar();
private TextPanel textPanel = new TextPanel();
但我确实需要访问那些 classes 中的变量。我怎样才能做到这一点并使其全部正常工作?
新建构造函数
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