Хорошо, я знаю, что только что задал аналогичный вопрос, но я попытался упростить его, поэтому я использовал то, что казалось плохим примером, с проблемой, которую я не ожидал, таким образом получив ответы, которые не решили мою проблему. вопрос.
У меня такая установка:
У меня есть метод в EDT. Он циклически перебирает кучу JTextAreas и удаляет пустые.
Так в чем подвох?
Каждый раз, когда JTextArea удаляется, запускается прослушиватель, который затем визуально обновляет графический интерфейс (вытягивает все визуальные объекты ниже JTextArea вверх).
Так что же происходит? Что ж, по мере выполнения цикла JTextAreas не удаляются визуально, они добавляются в очередь EDT (я предполагаю), а затем все они удаляются сразу после завершения цикла. Что происходит тогда, так это то, что все слушатели срабатывают одновременно и портят весь графический интерфейс.
Поскольку все запускается в EDT, я ожидал, что код будет действовать следующим образом:
- Начать цикл
- Найти пустой JTextArea
- Completly remove an empty JTextArea -> triggers the listener
- Execute the code in the listener
- Продолжить цикл
- Найдите следующий пустой JTextArea
- Промойте и повторяйте, пока не будет достигнут конец цикла.
Как я могу заставить свою программу вести себя так?
Должен ли я создать новый поток, который ищет пустые JTextAreas, и выполнять удаление в invokeLater(new Runnable())? Фактический код, который выполняет поиск, на самом деле не предназначен для процессора, он проходит только через arrayList JTextAreas, а проверка getText().equals(""), поэтому я действительно не думаю, что это необходимо...
SwingUtilities.invokeAndWait
, который будет ждать, пока методrun
runnable
не завершится, в отличие отinvokeLater
, который поместитrunnable
в конец очереди событий и вернет (почти) немедленно ... - person MadProgrammer   schedule 01.03.2013revalidate/repaint
вызовы родительского контейнера, из которого удаляются компоненты? Это может быть одной из проблем, но без кода сложно получить верный ответ. - person nIcE cOw   schedule 01.03.2013As it is, the visual removal seems to happen only after the method has ran it's course.
Это верно. Код в EDT выполняется последовательно. Поэтому, когда вы нажимаете кнопку, чтобы начать обработку, которая, в свою очередь, выполняет цикл, тогда графический интерфейс не перерисовывается до тех пор, пока не завершится выполнение исходного цикла. Если вы хотите удалить по одному компоненту за раз, это подразумевает какую-то анимацию, а это значит, что вы должны использовать таймер. Таким образом, каждый раз, когда срабатывает таймер, вы находите компонент и удаляете его. Когда больше нет компонентов для удаления, вы останавливаете таймер. - person camickr   schedule 01.03.2013