2014-11-12 2 views
0

Я запускаю несколько экземпляров (потоков) класса java, которые получают «вход» и на основе которого генерируется «выход» на стандартном выходе (экране). Я хотел бы добавить параметр, который позволит мне отправить этот вывод в один JFrame (текстовая область). Каков наилучший способ сделать это? До этого момента моя программа была полностью GUIless, но я хотел бы сделать ее немного более дружественной графикой и добавить эту опцию.Отображение информации из нескольких потоков в одном JFrame

Задача состоит в том, что в любой заданной точке я мог бы работать с несколькими потоками. Любой дизайн или фрагменты кода были бы весьма полезны.

+1

Начать с [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/), и если вы можете использовать [Рабочие потоки и SwingWorker] (http://docs.oracle. ком/JavaSE/учебник/uiswing/параллелизм/worker.html) – MadProgrammer

ответ

2

Как указывает MadProgrammer, хороший, инкапсулированный способ сделать это: SwingWorker.

Тем не менее, здесь есть общая теория:

Все обновления для компонентов Swing должно быть сделано на свинг отправки потока событий (есть некоторые исключения, но не имеет значения здесь). Это достигается SwingUtilities.invokeLater() (и иногда invokeAndWait()).

Время выполнения Swing будет стоять в очереди на изменения, которые вы хотите сделать, и называть их по одному. Это делает всю проблему обновления текстовой области довольно тривиальной: просто создайте Runnable с текстом, который вы хотите добавить, перейдите к invokeLater() и попросите Runnable захватить модель документа в текстовой области и добавить к ней нужный текст.

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

1

Вам не нужно преобразовывать существующие темы в SwingWorker s. Просто дайте им время от времени посылать сообщения JFrame таким образом, как это:

EventQueue.invokeLater(new Runnable(){ 
     // update GUI 
    }); 

Чтобы избежать шаблонный код, хорошо завернуть интерфейс программирования на экран с java.lang.reflect.Proxy. Пример такой упаковки - SwingProxyActorTest.java.

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