如何将一堆用户驱动的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内部类函数中,它们会被正确处理吗?