Как поставить в очередь кучу управляемых пользователем событий Java swing

#java #events #swing

#java #Мероприятия #swing

Вопрос:

У меня есть куча флажков и переключателей, которые позволяют пользователю отфильтровывать элементы в 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();
     }

}
  

Ответ №1:

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

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

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

Комментарии:

1. Итак, давайте предположим, что функциональность выполняет поиск по двум флажкам модели. Что, если мы предположим, что каждая проверка вызывает процесс продолжительностью около 30 секунд. Если пользователь проверяет оба события одно за другим, я не хочу иметь дело с проблемами параллелизма. если бы каждое из них находилось в своих собственных функциях внутреннего класса SwingWorker, были бы они обработаны правильно?

Ответ №2:

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