SwingWorker问题,方法doInBackground没有执行?

时间:2012-12-11 11:30:35

标签: java swing swingworker

有时我的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,它运行正常。

1 个答案:

答案 0 :(得分:0)

根据SwingWorker文档(http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#execute()):

  

SwingWorker只能执行一次。多次执行SwingWorker不会导致两次调用doInBackground方法。

因此,每次要正确运行execute方法时,您似乎需要创建子类的新实例。