Путаница между тем, должен ли код выполняться EDT (Thread Dispatch Thread) или нет? - PullRequest
3 голосов
/ 23 января 2010

Я разработал графический интерфейс Swing, который содержит 12 JPanel с. Первоначально весь код JPanel s был написан в основном коде класса JFrame. В результате код стал слишком длинным (более 10 000 строк).

Теперь я хочу провести рефакторинг кода, чтобы разбить код на 13 классов (по 12 классов для одного JPanel и 1 класс для основного JFrame) вместо 1 класса, содержащего весь код.

Но у меня есть некоторые заблуждения, которые заключаются в следующем:

  1. Первоначально эти 12 JPanel были установлены на «Карте» JPanel, а макет «Карты» JPanel был установлен на CardLayout, так что только 1 JPanel из этих 12 JPanel Показывается одновременно в зависимости от кнопки, на которой нажал пользователь. Теперь, когда я отделил эти 12 JPanel s от MainJForm и реализовал каждый из них в своем собственном классе, я думаю, что мне нужно сначала создать соответствующий JPanel всякий раз, когда пользователь нажимает кнопку. Итак, было бы лучше выполнить эту тяжелую задачу в EDT (Event Dispath Thread). Если нет, то сработает ли создание экземпляра JPanel в потоке SwingWorker и передача ссылки. в EDT?

Ответы [ 4 ]

1 голос
/ 23 января 2010

Вы можете установить свои панели точно так же, как это было сделано, когда все они были в одном классе. Таким образом, если предыдущая реализация создала все объекты при создании экземпляра фрейма, вы также можете просто создать свои 12 объектов панели. Если это было сделано, как только панель показала нажатие кнопки, сделайте то же самое.

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

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

0 голосов
/ 23 января 2010

Вы можете посмотреть любую демонстрацию SwingSet, такую ​​как SwingSet2 или SwingSet3 .

0 голосов
/ 23 января 2010

Текущая рекомендуемая практика заключается в том, что все вызовы компонентов свинга выполняются на EDT. См. Java: библиотеки Swing и безопасность потоков и Безопасно ли создавать виджеты Swing / AWT НЕ в потоке диспетчеризации событий? .

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

0 голосов
/ 23 января 2010

Построение 12 экземпляров JPanel в EDT не должно быть проблемой. Я бы пошел вперед и сделал их такими. Это сделает ваш код намного проще для чтения. Остерегайтесь преждевременной оптимизации. Я бы только приступил к оптимизации производительности, если у вас есть проблемы с производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...