Несколько потоков событий Swing - PullRequest
3 голосов
/ 13 мая 2009

Я хотел бы создать новую ветку рассылки событий в Swing, и у меня возникают проблемы с поиском ссылок в Интернете о том, как это сделать. Я сделал это в .NET, создав новый поток и вызвав Application.run (...). Кто-нибудь делал это? Возможно ли это в Swing?

Кстати, причина, по которой я пытаюсь это сделать, заключается в том, что я пишу плагин Eclipse, и я хотел бы открыть диалоговые окна, которые не являются модальными для IDE, но являются модальными (блокирующими) для моей логики пользовательского интерфейса. Я мог бы сделать это, используя немодальные диалоги и обратные вызовы, но это требует дополнительных затрат на создание моего кода многопоточным. Я вернусь к этому, если первое невозможно.

Ответы [ 3 ]

5 голосов
/ 12 августа 2009

Да, это возможно. Я сделал такую ​​многократную логику потоков диспетчеризации EDT в Swing. Тем не менее, чистый результат состоял в том, что он не работал надежно.

(a) Все JVM плохо работают с несколькими потоками EDT (проблемы синхронизации в логике рендеринга графики в собственном коде и т. Д., IBM JVM не удалось с несколькими потоками EDT, Sun JVM и Apple JVM действительно работали)

(b) В логике рендеринга Swing есть несколько ошибок, приводящих к случайным ошибкам рендеринга (например, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6727829).

В любом случае, для этого требуется установить два AppContexts, каждый из которых имеет свой собственный поток EDT.

5 голосов
/ 13 мая 2009

Я немного смущен вашим вопросом, потому что вы упоминаете Swing, но затем говорите, что пишете плагин Eclipse. Поскольку вопрос помечен как Swing, я дам ответ Swing (но опубликованный как CW).

Существует один поток рассылки событий. Всегда существует один поток отправки событий, если его вообще нет. Вы не можете создать еще один.

Однако вы можете изменить ModalityType ваших диалогов или изменить ModalExclusionType окна. В этом случае, если бы вы писали все это сами, вы бы установили для * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1014

Но, опять же, я не понимаю, как это могло бы вам помочь, поскольку Eclipse использует SWT вместо Swing.

2 голосов
/ 13 мая 2009

Я собираюсь выбросить мой последний ответ и начать заново.

В SWT вы можете создавать Shell с (окна) или пользовательские Dialog с, которые являются модальными только для родителя, передавая флаг стиля SWT.PRIMARY_MODAL во время создание.

Обратите внимание, что Dialog является абстрактным классом, поэтому вам придется создать свой собственный. Возможно, просто использовать Shell.

Edit:

Почему SWT? Потому что это то, что использует Eclipse. См. Руководство по разработке подключаемого модуля Eclipse Platform (ZIP-файл PDF) для получения более подробной информации. Самая последняя версия доступна в справочной системе Eclipse (Справка> Содержание справки> Руководство по среде разработки плагинов).

...