2013-10-28 90 views
1

我正在使用SwingWorker在後臺執行某些操作。在執行過程中,我有一個條件,我需要通過拋出一個JoptionPane.showOptionDialog()來詢問用戶。 我不想在我的模型類中做到這一點,並且不想在執行SwingWorker.doInBackground時執行此操作。執行SwingWorker doInBackground時的用戶輸入

我相信很多人都遇到過這個問題。

所以我必須從調用返回到doInBackground,然後要求done()中的用戶輸入。然後我需要啓動另一個SwingWorker並從done方法執行doInBackground()?

是否有另一種整理/簡單的方法呢?

更新(用於mkorbel的問題)

一流的設計是這樣的:

public class OptionInSwingWorker { 

    public static void main(String[] args) { 
     JFrame frame=new JFrame(); 
     JButton test = new JButton("Test"); 
     frame.add(test); 

     test.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       new SwingWorker<Void,Void>(){ 
        @Override 
        protected Void doInBackground() throws Exception { 
         // check for a value in the database 

         // if value is something.. throw up an OptionPane 
         // and ask the user a question.. 
         // then do something... 
         return null; 
        } 


        @Override 
        protected void done() { 
         // open some other dialog 
        } 
       }.execute(); 
      } 
     }); 

    } 
} 
+0

我用什麼來傳遞窗口的引用,以及我用於調用JOption的工作線程的進度方法。但它不是一個好主意,如果處理不當,最終會出現很多彈出窗口。使用超時關閉一些默認值 –

+0

在執行過程中,我有一個...,是從嵌套的無效或由SwingWorker執行的類談論異常 – mKorbel

回答

4

撥打SwingUtilities.invokeLater調用,它提示並返回結果返回給SwingWorker的。如果可能的話,SwingWorker會繼續運行,否則只需讓它循環並等待它檢查響應。

這將允許您不必在以後返回並啓動新的SwingWorker。雖然,根據你在做什麼,啓動一個新的SwingerWorker實際上可能會更乾淨更清晰。

相關問題