有时我的SwingWorker的doInBackgorund()方法似乎没有被执行,它直接进入done()方法而不保存或打印我的某些客户端机器上的任何东西,所以我想这是一个随机的东西,我可以弄清楚原因。这是我的代码:
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);
}
}
}
我通过这个actionlistener执行这个worker:
ActionListener encaissListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
worker = new saveCmdWorker(cmd);
worker.execute();
}
};
我没有任何可用的日志,因此我假设没有捕获任何异常。我看到在doInBackground()中触发了一个JOptionPane(在另一个线程中考虑为ui修改?)但是当应用程序没有进入else语句时,问题就存在了。这可能是我的问题的原因吗?我的计算机上没有这个bug,它运行正常。
答案 0 :(得分:0)
根据SwingWorker文档(http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#execute()):
SwingWorker只能执行一次。多次执行SwingWorker不会导致两次调用doInBackground方法。
因此,每次要正确运行execute方法时,您似乎需要创建子类的新实例。