2014-04-21 12 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; 
        } 
       } 
      });