如何排队一堆用户驱动的Java Swing事件

问题描述

| 我有一堆复选框和单选按钮,它们允许用户过滤ѭ0中的项目。每个事件都需要进行线程处理以避免GUI冻结。 我想做的是将事件排入队列,并按接收到的顺序对其进行操作。 目前,我有以下设计,但我认为必须有更好的方法。基本上,对于每个潜在的排队方法,我都有一个映射到它的整数。该整数值会在每次“ 1”方法执行整数时加到列表中,这些整数会循环遍历并转换为函数调用。 我可能正在考虑使用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();
     }

}
    

解决方法

        
Event Dispatch Thread (EDT)
有自己的队列
SwingUtilities.invokeLater(new Runnable(){
    @Override
    public void run(){
        //do stuff
    }
});
为什么那还不够?如果这些是长期运行的任务(很难想象),我将签出SwingWorker。     ,        如果您要使用该模式,请使用其他答案提到的事件分发,也可以使用Java 5以后的ѭ5。然后,您可以使用
take()
方法,该方法将阻塞直到命令队列中包含元素。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...