0

有时我的 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 执行这个工人:

ActionListener encaissListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                    worker = new saveCmdWorker(cmd);
                    worker.execute();

            }
        };

我没有任何可用的日志,所以我认为没有发现异常。我看到在 doInBackground() 中触发了 JOptionPane(考虑在其他线程中修改 ui 吗?)但是当应用程序不进入 else 语句时,问题就存在了。这可能是我的问题的原因吗?我的电脑上没有这个错误,它工作正常。

4

1 回答 1

0

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

SwingWorker 仅设计为执行一次。多次执行 SwingWorker 不会导致调用 doInBackground 方法两次。

因此,看起来您每次想要正确运行 execute 方法时都需要创建子类的新实例。

于 2015-09-25T16:02:27.620 回答