2013-06-30 7 views
1

Я кодирую приложение Java 7 Swing, которое вызывает класс non-GUI, чтобы что-то делать в цикле. К сожалению, я не могу взаимодействовать с графическим интерфейсом во время работы цикла. Можно ли принудительно обрабатывать события GUI в этом цикле?Обработать другие события GUI в то время как в цикле

Я ищу что-то, что сообщает JVM обрабатывать другие события GUI, такие как щелчки на кнопках, прежде чем продолжить цикл.

Есть ли что-то в Java 7 Качели, что делает то, что я хочу, или мне действительно нужно общаться с многопоточными (я еще не так далеко ...)?

+0

Что препятствует запуску потока (-ов) для цикла? –

+0

Тот факт, что я еще многому научился о потоках. – wullxz

+0

то теперь его время учиться ;-) Но специальные ответы, такие как swingworker, уже даны! – Stefan

ответ

7

Не блокируйте EDT (Event Dispatch Thread) - графический интерфейс «замерзнет», когда это произойдет. Вместо того, чтобы звонить Thread.sleep(n), выполните Swing Timer для повторения заданий или SwingWorker для выполнения длительных задач. См. Concurrency in Swing для более подробной информации.

+1

+1 ... @wullxz см. Также [this] (http://stackoverflow.com/questions/12641887/swingworker-in-java/12642215#12642215) пример, демонстрирующий 'SwingWorker'. И [this] (http://stackoverflow.com/questions/14074329/using-sleep-for-a-single-thread/14074427#14074427), который идет дальше в комментарий Эндрюса к 'Thread.sleep (..)' –

+1

SwingWorker сделал трюк. Но хорошо знать, что есть что-то вроде таймера. :) – wullxz

5

Использовать SwingWorker. В основном, обработка всех событий пользовательского интерфейса всегда выполняется в одном конкретном потоке, который называется Thread Dispatch Thread, и что-то еще в этом потоке не позволяет обрабатывать события пользовательского интерфейса (щелчки мыши, ввод с клавиатуры и т. Д.) И, таким образом, ,

Класс SwingWorker был добавлен в JRE специально для выполнения трудоемких задач «в фоновом режиме» (не в потоке пользовательского интерфейса) и позволяет вам легко выполнять тяжелую работу в другом месте, при необходимости обновлять интерфейс с интервалами (думаю, индикатор выполнения), и, опять же, необязательно, обновите интерфейс после завершения. Вы делаете это просто путем переопределения определенных методов (doInBackground() и done()), и вам никогда не нужно напрямую заниматься потоковой обработкой.

SwingWorker Javadoc page имеет все необходимое, чтобы начать использовать его, включая пример кода.

Смежные вопросы