2011-05-27 21 views
0

我有一大堆的复选框,单选按钮,允许用户过滤掉的项目在JTable。每次的事件需要被拧避免GUI凝固起来的。如何排队一堆用户驱动的Java Swing事件

我想这样做是排队在他们收到的订单对他们的活动和行为。

目前,我有以下的设计,但我认为必须有一个更好的办法。基本上,我已经为每个潜在的排队方法,一个映射到它的整数。该整数值被添加到每个actionPerformed方法执行循环中的整数并转换为函数调用的列表中。

我可能想使用的EventQueue调用运行就可以了。这种类型的功能最好的模式或技术是什么?

Vector<Integer> taskQueue; 
/** 
* Adds tasks to a queue things are completed in the order they were added. This  allows for 
* threading and concurrency issues.One task is done at a time. 
* @param 
*/ 
private void doTasks() 
{ 
    if(!queueIsRunning) 
    { 
     doTasks = new Thread(){ 
      public void run() 
      { 
       queueIsRunning = true; 
       while(!taskQueue.isEmpty()) 
       { 
        intVal = taskQueue.get(0); 

        taskQueue.remove(0); 
        switch(intVal) 
        { 
         case DOM_HIGHLIGH_TASK: 
          System.out.println("starting dom highlight"); 
          highlightDom(); 
          break; 
         case FLASH_HIGHLIGH_TASK: 
          System.out.println("starting flash highlight"); 
          higlightFlash(); 
          break; 
         case SQL_HIGHLIGH_TASK: 
          System.out.println("starting sql highlight"); 
          highlightSQL(); 
          break; 
         case INFO_HIGHLIGH_TASK: 
          System.out.println("starting infoleak highlight"); 
          highlightInfoLeak(); 
          break; 
         case HTMLCOM_HIGHLIGH_TASK: 
          System.out.println("starting htmlcomm highlight"); 
          highlightHtmlComments(); 
          break; 
         case SORT_EXTENSIONS: 
          sortExtensions(); 
        } 
       } 
       queueIsRunning = false; 

      } 
     }; 
     doTasks.start(); 
    } 

} 

回答

2

Event Dispatch Thread (EDT)有自己的队列

SwingUtilities.invokeLater(new Runnable(){ 
    @Override 
    public void run(){ 
     //do stuff 
    } 
}); 

这是为什么不够?如果这些都是长时间运行的任务(这是很难想象的),我会找SwingWorker

+0

因此,让我们假设功能正在搜索模型两个复选框。如果我们假设每次检查导致大约30秒的过程,该怎么办?如果用户一个接一个地检查,我不想处理并发问题。如果每个函数都在它自己的SwingWorker内部类函数中,它们会被正确处理吗? – steve 2011-05-28 18:07:58

0

如果您要使用该模式,请使用其他答案中提到的事件分派,但也使用从Java 1.5开始提供的ArrayBlockingQueue。然后,你可以只使用take()方法,该方法将阻塞,直到所述命令队列中有元素。