Почему происходит нарушение EDT? - PullRequest
1 голос
/ 28 апреля 2010

Я начал использовать CheckThreadViolationRepaintManager для выявления нарушений EDT.

жалуется на:

partner = getParameter("partner",generatePartnerSelectionPanel(),Design.partnerSelectionDuration);

Потому что ему не нравится generatePartnerSelectionPanel(), потому что ему не нравится JPanel panel = new JPanel(); в этом методе. Но я не могу понять, почему вокруг этого должна быть проблема.

Более подробно, generatePartnerSelectionPanel() генерирует JPanel (я делаю это не в EDT), но затем в getParameter я добавляю JPanel к основному JFrame и делаю это в EDT (используя invokeLater ).

Итак, почему должна быть проблема?

Ответы [ 4 ]

3 голосов
/ 28 апреля 2010

Нарушение EDT не означает, что что-то обязательно действительно пошло не так, это означает, что вы пытались выполнить действие, связанное с GUI, для потока, отличного от EDT (ситуация, когда что-то может пойти не так).

Создание нового компонента Swing покрывается «выполнением чего-либо связанного с GUI», отсюда и предупреждение о нарушении.

На этом форуме довольно много рассуждений о том, почему не рекомендуется создавать компоненты Swing в других темах.

2 голосов
/ 04 сентября 2010

Обычно это происходит, если вы создаете какие-либо компоненты GUI в потоке, переданном вам в main.

Теперь, на самом деле, ничего плохого не случится, если вы не измените его после того, как поняли (setVisible(true) или pack() реализует кадр), НО Sun обнаружила крайний случай, который, как они утверждают сделайте так, чтобы это могло вызвать проблему.

Итак, чтобы быть совершенно правильным, сделайте так, чтобы ваш главный конструктор создал ваше первое окно внутри и invokeLater или invokeAndWait.

На самом деле, мне интересно, может ли выход из основного потока сразу после invokeLater позволить завершить работу всего вашего приложения (поскольку окно почти наверняка еще не успело появиться) ... Возможно, вы захотите использовать invokeAndWait, если ваш основной поток не выходит.

0 голосов
/ 04 сентября 2010

В дополнение к использованию CheckThreadViolationRepaintManager я использовал Aspect Oriented решение для обнаружения, когда какие-либо компоненты Swing построены вне EDT. Это элегантный способ устранения нарушений EDT, если вы используете AspectJ.

Подробности смотрите в этом блоге:

Отладка Swing, итоговая сводка

0 голосов
/ 28 апреля 2010

Swing является враждебным потоком. Даже если компонент не реализован, он все равно может получить доступ к общим ресурсам или вызвать EventQueue.invokeLater. Был период, когда было широко заявлено, что компоненты Swing могут быть созданы вне, но это было неправильно.

...