Как поставить в очередь кучу пользовательских событий Java-свинга - PullRequest
0 голосов
/ 28 мая 2011

У меня есть несколько флажков и переключателей, которые позволяют пользователю отфильтровывать элементы в JTable. Каждый из событий должен быть пронизан, чтобы избежать зависания графического интерфейса.

Я бы хотел поставить в очередь события и действовать в том порядке, в котором они были получены.

В настоящее время у меня есть следующий дизайн, но я думаю, что должен быть лучший способ. По сути, у меня есть для каждого потенциального метода в очереди, целое число, которое отображается на него. Это целочисленное значение добавляется в список при каждом выполнении метода 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();
     }

}

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

У Event Dispatch Thread (EDT) есть собственная очередь

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

Почему этого недостаточно?Если это долгосрочные задачи (которые трудно представить), я бы проверил SwingWorker .

0 голосов
/ 28 мая 2011

Если вы собираетесь использовать этот шаблон, используйте диспетчеризацию событий, как указано в другом ответе, но также ArrayBlockingQueue, который присутствует в Java 1.5 и далее.Затем вы можете просто использовать метод take(), который будет блокировать, пока в очереди команд не будет элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...