Предотвращение зависания графического интерфейса Swing при вызове метода, который одновременно обращается к компонентам Swing и отнимает много времени - PullRequest
3 голосов
/ 03 мая 2011

Следующая строка:

SwingUtilities.updateComponentTreeUI(aComponent);

делает мой GUI не отвечающим.

При вызове этого метода для обновления laf на большой части GUI, это занимает много времени, и поэтому делает GUI не отвечающим во время этой операции.

Поскольку эта операция манипулирует GUI, для этого также нельзя использовать SwingWorker.Из документации SwingWorker:

  • Не следует запускать трудоемкие задачи в потоке диспетчеризации событий.В противном случае приложение перестает отвечать на запросы.

  • Доступ к компонентам Swing возможен только в потоке диспетчеризации событий.

Хотя проблема здесь,заключается в том, что операция обращается к компонентам Swing , а отнимает много времени.

Есть ли хороший способ предотвратить эту безответственность?

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

Поскольку то, что вы делаете, меняет L & F, и это может серьезно повлиять на внешний вид и удобство использования GUI, спросите себя, действительно ли вы хотите, чтобы приложение реагировало в течение этого времени. Может быть лучше отобразить сообщение («Пожалуйста, подождите ...» или что-то в этом роде), используя стеклянную панель , и заморозить графический интерфейс при обновлении L & F.

Теперь, как уже предлагали другие, вы можете выяснить, почему обновление дерева компонентов происходит так медленно.

0 голосов
/ 04 мая 2011

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

Вы предложили разделить вызовы на updateComponentTree на несколько подзадач, которые позволяют происходить между ними событиями, которые могут быть«взлом», но не так уж и плохо, если только изменение шрифта не изменит размеры элементов и может привести к тому, что пользователь пропустит кнопку и т. д.

Если возможно, я бы посоветовал взглянуть на код вкомпонент выбора даты и посмотрите, сможете ли вы переписать его, чтобы вместо скрытия компонентов во всплывающем окне он фактически удалял / удалял их и при необходимости воссоздавал.Это не должно оказывать заметного влияния на отзывчивость средства выбора даты при его использовании, но, безусловно, ускорит обновление дерева компонентов, когда всплывающее окно не отображается.

...