gpt4 book ai didi

java - 为什么我的 SwingWorker 不工作?

转载 作者:行者123 更新时间:2023-12-01 08:58:37 25 4
gpt4 key购买 nike

我的 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 中。

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

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 请参阅文档中的更多内容如何添加进度条 Documentation of SwinWorker

关于java - 为什么我的 SwingWorker 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41874123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com