2013-02-18 19 views
0

我使用SwingWorker通过Java Swing API创建进度条。使用SwingWorker在GUI中添加进度条

我有一个扩展的SwingWorker

class Swinger extends SwingWorker { 
private ClassAnalyzer classAnalyzer; 

public Swinger(ClassAnalyzer classAnalyzer){ 
    this.classAnalyzer = classAnalyzer; 
} 
     @Override 
     public Void doInBackground() throws InterruptedException { 

      try 
     {  
      int progress = 0; 
      while (progress < 100) { 

// at this point I make certain elaboration on classAnalyzer     

       progress++; 

       //Call the process method to update the GUI 
       publish(progress); 

      }      
     } 
     catch(InterruptedException e) 
     { 
     } 
     return null; 
    } 

    @Override 
    protected void process(List chunks) { 
    for (Integer chunk : chunks) { 
     progressBar.setValue(chunk); 

     //if the switchtype checkbox is selected then 
     //change the progressbar to a determined type 
     //once the progress has reached 50 
     if (chunk > 49) 
     { 
      if (switchType.isEnabled() && switchType.isSelected()) 
      { 
       progressBar.setStringPainted(true); 

      } 

     } 
    } 
} 

} 

和第二类(我写一张本)

public Tester() 
{ 
    JFrame guiFrame = new JFrame(); 

    //make sure the program exits when the frame closes 
    guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    guiFrame.setTitle("Creating a Table Example"); 
    guiFrame.setSize(700,200); 

    //This will center the JFrame in the middle of the screen 
    guiFrame.setLocationRelativeTo(null); 


    goButton = new JButton("Go"); 
    goButton.setActionCommand("Go"); 
    goButton.addActionListener(new ActionListener() 
    { 

     //When the button is clicked the SwingWorker class is executed and 
     //the button is disabled 
     @Override 
     public void actionPerformed(ActionEvent event) 
     { 

      progressBar.setStringPainted(progressType.isSelected()); 
      ClassAnalyzer c = new ClassAnalyzer(); 
      Swinger task = new Swinger(c); 
      task.execute(); 

      int methods = c.getNumberOfMethods(); 

      if(methods == 0){ 
      JOptionPane.showMessageDialogo(null, "methods not found"); 
      } 

      goButton.setEnabled(false); 
     } 
    }); 

    } 

当我在测试推出第二类,A类在出现进度条之前显示消息“找不到方法”,而我希望消息在出现 之后出现。该怎么办?

+0

监控SwingWorker的状态你的另一个问题是一个单独的问题。无论您的第二个问题如何,您都应该接受这里发布的答案之一。 – 2013-02-18 17:16:39

回答

3

task.execute()将启动一个背景(其中将调用doInBackground方法)并且程序将继续执行。

task.execute()不是阻塞方法,这是使用它的原因,这样你就不会阻塞事件调度线程

您可以用PropertyChangeListener

final ClassAnalyzer c = new ClassAnalyzer(); 
Swinger task = new Swinger(c); 
task.addPropertyChangeListener(new PropertyChangeListener() { 
    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     if (evt.getPropertyName().equals("state") && evt.getNewValue().equals(SwingWorker.StateValue.DONE)) { 
      int methods = c.getNumberOfMethods(); 

      if(methods == 0){ 
       JOptionPane.showMessageDialogo(null, "methods not found"); 
      } 
     } 
    } 
}); 
task.execute(); 
3

SwingWorker类还定义了一个done方法,您可以在其中定义完成任务后要执行的操作。

class Swinger extends SwingWorker { 

    // all the rest of your code ^^ 

    @Override 
    protected void done() { 
     if(this.classAnalyzer.getNumberOfMethods() == 0) 
      JOptionPane.showMessageDialog(null, "methods not found");    
    } 
} 

因为在EDT上也调用了此方法,所以您不必担心线程问题。