我的SwingWorker似乎不起作用。它不会在textpanel中输出任何内容,也不会输出到控制台中。它甚至不能在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();
但我真的需要在这些类中找到变量。我怎么能这样做并让它全部工作?
答案 0 :(得分:1)
新构造函数
firebaseDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override public void onDataChange(DataSnapshot dataSnapshot) {
customPOJO customPOJO = dataSnapshot.getValue(YourCustomPOJO.class);
customPOJO.getName();
customPOJO.getEmail();
customPOJO.getfavoriteFood();
//and so on....
}
@Override public void onCancelled(DatabaseError databaseError) {
}
});
并在runWorker()中传递要更改的值。
public cmdExec(FormPanel formPanel,FooterBar footerBar,TextPanel textPanel ) {
textPanel.appendText((this.getState()).toString());
}
但是,如您的代码中所示,您需要添加 cmdExec = new cmdExec(formPanel,footerPanel,textPanel);
cmdExec.execute();
,请参阅文档中有关如何添加进度条的更多信息Documentation of SwinWorker