Я знаю, что код GUI в Java Swing должен быть помещен в SwingUtilities.invokeAndWait
или SwingUtilities.invokeLater
.Таким образом, многопоточность работает нормально.
К сожалению, в моей ситуации графический интерфейс обновляет его, что занимает гораздо больше времени, чем фоновые потоки.Более конкретно: я обновляю JTree всего с 400 записями, глубина вложения составляет максимум 4, так что ничего страшного не должно быть, верно?Но иногда это занимает одну секунду!Мне нужно убедиться, что пользователь может печатать в JTextPane без задержек.Ну, угадайте, что медленные обновления JTree do вызывают задержки для JTextPane во время ввода.Он обновляется только после обновления дерева.
Я использую Netbeans и эмпирически знаю, что приложение Java может обновлять большое количество информации, не блокируя остальную часть пользовательского интерфейса.
Как это можно сделать?
ПРИМЕЧАНИЕ 1. Все эти DefaultMutableTreeNode
подготовлены за пределами invokeAndWait
.
ПРИМЕЧАНИЕ 2. При заменеinvokeAndWait
с invokeLater
дерево не обновляется.
ПРИМЕЧАНИЕ 3. Обратите внимание, что рекурсивное расширение дерева занимает гораздо больше времени.
ПРИМЕЧАНИЕ 4: Я использую пользовательское средство рендеринга ячеек дерева, попробую без него и сообщу.
ПРИМЕЧАНИЕ 4a: Мой рендерер ячеек дерева использует карту для кэширования и повторного использования созданных JTextComponent
s, в зависимости от узла дерева (как ключ).
КЛИВ 1 : Ух ты! Без настройки пользовательского средства визуализации ячеек это в 10 раз быстрее .Думаю, мне понадобятся несколько хороших руководств по написанию пользовательских средств визуализации древовидных ячеек.К сожалению, мне нужно пользовательское средство визуализации ячеек.
Этот учебник, включающий отложенную загрузку, может помочь, я разберусь с этим.