2014-04-21 37 views
3

這一點,只是SwingWorker類的實現:SwingWorker類的,做()方法​​不叫

class GuiWorker extends SwingWorker<Integer, Integer> { 
    private JFrame frame = new JFrame(); 
    private JDialog dialog = new JDialog(frame, "Loadin data", true); 
    private JProgressBar progressBar = new JProgressBar(); 

    private Statistics st = new Statistics(); 

    public GuiWorker(GraphEditor editor, Statistics st) { 
     this.st = st; 

     Window mainWindow = SwingUtilities.windowForComponent(editor 
       .getGraphComponent().getParent()); 
     dialog.setSize(400, 200); 

     int x = mainWindow.getX() + (mainWindow.getWidth() - dialog.getWidth()) 
       /2; 
     int y = mainWindow.getY() 
       + (mainWindow.getHeight() - dialog.getHeight())/2; 
     progressBar.setString("Have fun to wait some time..."); 
     progressBar.setStringPainted(true); 
     progressBar.setIndeterminate(true); 
     dialog.add(progressBar); 
     dialog.setModal(true); 
     dialog.setLocation(x, y); 
     dialog.setVisible(true); 
    } 

    @Override 
    protected Integer doInBackground() throws Exception { 
     st.loadInitialData(); 
     return 0; 
    } 

    @Override 
    protected void done() { 
     dialog.setVisible(false); 
     JLabel label = new JLabel("Task Complete"); 
     dialog.getContentPane().remove(progressBar); 
     dialog.getContentPane().add(label); 
     dialog.getContentPane().validate(); 
     dialog.setVisible(false); 
    } 
} 

diaglog從不隱藏,直到我forcely關閉它(當任務完成後,必須被隱藏)的問題。 我注意到loadInitialData()方法是從我的DB收集一些統計信息的方法,它需要幾秒鐘的時間。

UPDATE:我確信只有在關閉dialog時調用了done()方法。

UPDATE: 如果我使用GuiWorker是在這裏:

mainTabs.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        switch (mainTabs.getSelectedIndex()) { 
        case 0: 
        case 1: 
        case 2: // stats tab 
         GuiWorker gw = new GuiWorker(editor,st); 
         gw.execute(); 
         break; 
        default: 
         break; 
        } 
       } 
      }); 
+1

請張貼在您使用的GuiWorker –

+0

@ Can'tTell看到UPDATE :)代碼 –

回答

4

所有Swing事件在Event Dispatch Thread內運行。因此,您添加到mainTabsChangeListener將在「事件調度線程」中運行。

在事件監聽器中,您實例化了GuiWorker,並在該構造函數中調用dialog.setVisible(true);來打開對話框。

您的JDialog實例是modal並且在模態對話框中調用setVislbe(true)會阻止調用線程,在您的情況下是Event Dispatch Thread。所以直到對話框關閉,gw.execute();不被調用。這就是爲什麼你的done方法沒有被調用,直到你關閉對話框。

爲了您的代碼正常工作,您可以嘗試在構造函數中不要調用setVisible(true),而是從GuiWorker提供一種方法來設置對話框的可見性。然後致電gw.execute();致電gw.setVisible(true)

爲了澄清,嘗試

class GuiWorker extends SwingWorker<Integer, Integer> { 
    private JFrame frame = new JFrame(); 
    private JDialog dialog = new JDialog(frame, "Loadin data", true); 
    private JProgressBar progressBar = new JProgressBar(); 

    private Statistics st = new Statistics(); 

    public GuiWorker(GraphEditor editor, Statistics st) { 
     this.st = st; 

     Window mainWindow = SwingUtilities.windowForComponent(editor 
       .getGraphComponent().getParent()); 
     dialog.setSize(400, 200); 

     int x = mainWindow.getX() + (mainWindow.getWidth() - dialog.getWidth()) 
       /2; 
     int y = mainWindow.getY() 
       + (mainWindow.getHeight() - dialog.getHeight())/2; 
     progressBar.setString("Have fun to wait some time..."); 
     progressBar.setStringPainted(true); 
     progressBar.setIndeterminate(true); 
     dialog.add(progressBar); 
     dialog.setModal(true); 
     dialog.setLocation(x, y); 
    } 

    @Override 
    protected Integer doInBackground() throws Exception { 
     st.loadInitialData(); 
     return 0; 
    } 

    @Override 
    protected void done() { 
     dialog.setVisible(false); 
     JLabel label = new JLabel("Task Complete"); 
     dialog.getContentPane().remove(progressBar); 
     dialog.getContentPane().add(label); 
     dialog.getContentPane().validate(); 
     dialog.setVisible(false); 
    } 

    public void setVisible(boolean visible) { 
     dialog.setVisible(visible); 
    } 
} 

mainTabs.addChangeListener(new ChangeListener() { 
       @Override 
       public void stateChanged(ChangeEvent e) { 
        switch (mainTabs.getSelectedIndex()) { 
        case 0: 
        case 1: 
        case 2: // stats tab 
         GuiWorker gw = new GuiWorker(editor,st); 
         gw.execute(); 
         gw.setVisible(true); 
         break; 
        default: 
         break; 
        } 
       } 
      });