Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SwingWorker问题,未执行doInBackground方法?_Java_Swing_Swingworker - Fatal编程技术网

Java SwingWorker问题,未执行doInBackground方法?

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

有时我的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);
        }
    }
}

我没有任何可用的日志,所以我假设没有捕获异常。我看到在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();

            }
        };