如何将一堆用户驱动的java swing事件排队

如何将一堆用户驱动的java swing事件排队,java,events,swing,Java,Events,Swing,我有一堆复选框和单选按钮,允许用户过滤出JTable中的项目。每个事件都需要线程化,以避免GUI冻结 我想做的是将事件排队,并按照收到的顺序对其采取行动 目前我有以下设计,但我认为一定有更好的方法。基本上,对于每个潜在的排队方法,我都有一个映射到它的整数。该整数值被添加到每个actionPerformed方法执行中的一个列表中,该方法执行的整数循环并转换为函数调用 我可能在考虑使用EventQueue来调用run。这类功能的最佳模式或技术是什么 Vector<Integer> tas

我有一堆复选框和单选按钮,允许用户过滤出
JTable
中的项目。每个事件都需要线程化,以避免GUI冻结

我想做的是将事件排队,并按照收到的顺序对其采取行动

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

我可能在考虑使用EventQueue来调用run。这类功能的最佳模式或技术是什么

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();
     }

}
向量任务队列;
/**
*将任务添加到队列中按添加顺序完成任务。这就允许
*线程和并发问题。一次完成一项任务。
*@param
*/ 
私有void dotask()
{
如果(!queueIsRunning)
{
doTasks=新线程(){
公开募捐
{
queueIsRunning=true;
而(!taskQueue.isEmpty())
{
intVal=taskQueue.get(0);
taskQueue.remove(0);
开关(intVal)
{
案例DOM_HIGHLIGH_任务:
System.out.println(“启动dom高亮显示”);
highlightDom();
打破
案例闪光灯高亮度任务:
System.out.println(“启动闪光高亮显示”);
higlightFlash();
打破
案例SQL\u HIGHLIGH\u任务:
System.out.println(“启动sql高亮显示”);
highlightSQL();
打破
案例信息\u高亮度\u任务:
System.out.println(“启动信息泄漏突出显示”);
highlightInfoLeak();
打破
案例HTMLCOM\U高亮度任务:
System.out.println(“启动htmlcomm高亮显示”);
highlightHtmlComments();
打破
案例排序单元扩展:
sortExtensions();
}
}
queueIsRunning=false;
}
};
doTasks.start();
}
}

事件调度线程(EDT)有自己的队列

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

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

如果您选择这种模式,请使用另一个答案中提到的事件调度,但也可以使用Java 1.5以后出现的
ArrayBlockingQueue
。然后您可以使用
take()
方法,该方法将一直阻塞,直到命令队列包含元素。

因此,假设功能正在搜索模型两个复选框。如果我们假设每次检查都会导致一个大约30秒的过程呢。如果用户一个接一个地检查这两个问题,我不想处理并发性问题。如果每一个都在其自己的SwingWorker内部类函数中,它们会被正确处理吗?