Java SwingWorker问题,未执行doInBackground方法?
有时我的SwingWorker的doInBackgorund()方法似乎没有被执行,它直接进入done()方法,而没有在我的一些客户机上保存或打印任何内容,所以我认为这是随机的,我不知道为什么。这是我的代码:Java SwingWorker问题,未执行doInBackground方法?,java,swing,swingworker,Java,Swing,Swingworker,有时我的SwingWorker的doInBackgorund()方法似乎没有被执行,它直接进入done()方法,而没有在我的一些客户机上保存或打印任何内容,所以我认为这是随机的,我不知道为什么。这是我的代码: public class saveCmdWorker extends SwingWorker<Integer, Integer> { Order ord; public saveCmdWorker(Order ord) { this.ord
public class saveCmdWorker extends SwingWorker<Integer, Integer> {
Order ord;
public saveCmdWorker(Order ord) {
this.ord = ord;
}
@Override
public Integer doInBackground() {
if(999 != ord.getCaissier().getIdCaissier())
saveCmd(ord); // database queries
else
JOptionPane.showMessageDialog(null,"Error",JOptionPane.WARNING_MESSAGE);
if(ord.isIsProd() == false){
try {
// print via serial port
Printer.print(ord, false, Restaurant.numCaisse);
} catch (Exception ex) {
PosO2.errorLogger.log(Level.SEVERE, "Printing error", ex);
}
}
try {
Printer.printFacture(ord, false);
if(btnDuplicata.getForeground() == Color.red)
Printer.printFacture(ord, true);
} catch (Exception ex) {
PosO2.errorLogger.log(Level.SEVERE, "Printing error", ex);
}
return 1;
}
@Override
protected void done() {
try {
btnDuplicata.setForeground(Color.black);
ARendre = 0.0;
ord.clear();
for (int j = 0; j < tab_paiement.size(); j++) {
tab_paiement.get(j).setVisible(true);
}
montantRestant.setBackground(Color.red);
} catch(Exception e) {
PosO2.errorLogger.log(Level.SEVERE, "Refresh Error", e);
}
}
}
我没有任何可用的日志,所以我假设没有捕获异常。我看到在doInBackground()中触发了JOptionPane(在另一个线程中是否视为ui修改?),但当应用程序不在else语句中时,问题就存在了。这可能是我的问题的原因吗?我的电脑上没有这个错误,它只是工作正常 根据SwingWorker文档(): SwingWorker设计为只执行一次。多次执行SwingWorker不会导致调用doInBackground方法两次
因此,每次要正确运行execute方法时,似乎都需要创建子类的新实例。是的,打开JOptionPane被视为对UI的修改,因此不应在doInBackground中这样做。另外,请遵循Java命名约定:类以大写字母开头。变量以小写字母开头。您的代码本身不可读。另外,如果(ord.isIsProd()==false)也要避免这个
if(!ord.isIsProd())
Ok thnks我会纠正这个建议,但是如果JOptionPane实际上没有打开,它仍然可能是方法没有被执行的原因?因为您违反了Swing的单线程,结果可能非常不可预测,并且您可能会在调用showMessageDialog时始终无法看到JOptionPane。showMessageDialog是一个阻塞调用,因此您可能会被卡在那里。可以肯定的是,使用JConsole并查看SwingWorker线程的stacktrace状态,或者更好地使用调试器并在doInBackground方法中设置一些断点,这将很快导致您的问题。除非我缺少一些您实际上没有调用的SwingWorker.get()
在您的done
实现中-这意味着如果工作进程中发生异常(例如,说ord.getCaissier()
返回null),您将不会看到任何日志消息。因此,这里可能还隐藏着另一个错误,尽管纪尧姆·波尔特的答案可能就是原因所在。
ActionListener encaissListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
worker = new saveCmdWorker(cmd);
worker.execute();
}
};