2014-09-25 3 views
0

Я пытаюсь понять реальную цель этой темы. Я читал книги, статьи, но не ясно понял, за что отвечает поток ThreadQueue. Я видел много примеров, иногда это используется, иногда нет. Как я понял, этот поток отвечает за ВСЕ GUI OPERATIONS, такие как создание окон, компонентов, вызов собственных функций из OS API и других вещей. Поэтому каждый раз, когда я меняю часть GUI, я должен передать это действие в очередь. Таким образом, использование приложения очереди имеет два потока по умолчанию - основной поток и поток диспетчеризации событий. Поэтому логика всех бизнес-процессов должна выполняться в основном потоке (или создавать новый поток из основного) и всех gui-операций в EventQueue (например, добавление нового элемента в таблицу, изменение текста в списке обновления меток). Futhermore Я должен создать экземпляр основных окон (класс extends jframe) в EventQueue?EventQueue.invokeLater в Java Swing

Я прав? Если нет, объясните пожалуйста. Спасибо всем заранее.

+2

Все события _handlers_ вызывается в потоке обработчика события. Итак, если вы пишете прослушиватель действий для кнопки, в процессе обработчика событий при вызове кнопки будет вызван метод actionPerformed(). Если действие кнопки - это то, что не займет много времени, вы можете просто вызвать методы Swing непосредственно из actionPerformed(). В этом случае не нужно «invokeLater()». –

ответ

2

Похоже, что у вас есть суть этого, да. Если ваше приложение по сути является «чистым графическим интерфейсом», вы можете просто сделать все на EDT (Event Dispatch Thread, который является потоком, который запускает все, что вы передаете, до EventQueue.invokeLater), но вы должны создавать окна на EDT, что означает, что ваш метод main() должен использовать EventQueue.invokeLater хотя бы один раз.

Поскольку все слушатели объектов GUI будут уведомлены об EDT, вам не нужно использовать EventQueue.invokeLater от ваших обработчиков.

+0

Так, например, если я создаю JFrame в EDT, все остальные вещи, такие как добавление элементов, могут быть выполнены без передачи действий в очередь? Поскольку основной кадр был создан в EDT, все будущие действия с ним также будут выполняться в EDT? – ketazafor

+0

Пока ваш «другой материал» работает как обратный вызов GUI, тогда да, все в порядке. – davmac

3

EventQueue управляет одним потоком графического интерфейса пользователя, поскольку он должен полагаться на ресурсы GUI платформы хоста, которые также являются single-threaded. Вы можете запускать не GUI-код на initial thread, но вы должны синхронизировать доступ к любым общим данным самостоятельно. SwingWorker, рассмотренный here, является удобной альтернативой.