2012-12-11 183 views
0

有時,我的SwingWorker的doInBackgorund()方法似乎沒有被執行,它直接進入done()方法而沒有在我的某些客戶端機器上保存或打印任何東西,所以我想這是一個隨機的事情,弄清楚爲什麼。這是我的代碼:SwingWorker問題,doInBackground方法不執行?

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(); 

      } 
     }; 

我沒有任何可用的日誌,所以我不承擔任何異常被捕獲。我看到一個JOptionPane在doInBackground()中被觸發(考慮作爲其他線程中的ui修改嗎?),但是當應用程序不在else語句中時存在問題。這可能是我的問題的原因嗎?我沒有在我的電腦上發現這個錯誤,它可以正常工作。

+3

是的,打開一個JOptionPane被認爲是一個UI修改,所以你不應該這樣做doInBackground。此外,請遵循Java命名約定:類以大寫字母開頭。變量以小寫字母開頭。你的代碼是不可讀的。還要避免這個'if(ord.isIsProd()== false)'而只是簡單地鍵入'if(!ord.isIsProd())' –

+0

好的建議我會糾正這個問題,但如果JOptionPane實際上不是打開了,它仍然可能是未被執行的方法的原因? – caRameL

+1

由於您違反了Swing的單線程,所以結果可能會非常不可預測,並且您最終可能會在您調用showMessageDialog時看不到JOptionPane。 showMessageDialog是一個阻塞呼叫,所以你可能會卡在那裏。可以肯定的是,使用JConsole並查看SwingWorker線程的堆棧跟蹤狀態,或者更好地使用調試器並在doInBackground方法中設置一些斷點,這會很快導致您遇到問題。 –

回答