2011-09-26 63 views

回答

7

我只是回答另一个论坛上类似的问题的有关的SwingWorker问题:

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.util.List; 
import java.util.concurrent.Executor; 
import java.util.concurrent.Executors; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.SwingWorker; 
import javax.swing.Timer; 


public class Main extends JFrame 
{ 
    private JLabel label; 
    private Executor executor = Executors.newCachedThreadPool(); 
    private Timer timer; 
    private int delay = 1000; // every 1 second 

    public Main() 
    { 
     super("Number Generator"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(300, 65); 
     label = new JLabel("0"); 
     setLayout(new FlowLayout()); 
     getContentPane().add(label, "Center"); 
     prepareStartShedule(); 
     setVisible(true); 
    } 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new Main(); 
      } 
     }); 
    } 

    private void prepareStartShedule() 
    { 
     timer = new Timer(delay, startCycle()); 
     timer.start(); 
    } 

    private Action startCycle() 
    { 
     return new AbstractAction() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       executor.execute(new MyTask()); 
      } 
     }; 
    } 

    private class MyTask extends SwingWorker<Void, Integer> 
    { 
     @Override 
     protected Void doInBackground() throws Exception 
     { 
      doTasksInBackground(); 
      return null; 
     } 

     private void doTasksInBackground() 
     { 
      publish(generateRandomNumber()); 
     } 

     private int generateRandomNumber() 
     { 
      return (int) (Math.random() * 101); 
     } 

     @Override 
     protected void process(List<Integer> chunks) 
     { 
      for(Integer chunk : chunks) label.setText("" + chunk); 
     } 

    } 
} 

PS:@trashgod帮助我在一个月前就知道如何处理SwingWorker类(Can't get ArrayIndexOutOfBoundsException from Future<?> and SwingWorker if thread starts Executor),这样的感谢给他。


编辑:代码被校正。谢谢@Hovercraft Full Of Eels

+0

如果tasksInBackground需要任何时间(不是在这个例子中,但可能在真正的程序中),它应该在SwingWorker内完成,并且s应该被传递到一个publish(...)方法调用中,然后通过处理方法放入标签中。 SwingWorker然后将更改为泛型类型。鉴于方法的名称,我99%确定这是正确的做法。 –

+0

+1好的更新,谢谢;信贷给takteek。我很好奇在这种情况下使用'Executor',并发现这有帮助[文章](http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html)。 – trashgod

+0

@Eng:谢谢。我已经删除了我的帖子,现在通过了你的投票。 –