Как отлаживать ненужное перекрашивание, происходящее в Swing - PullRequest
1 голос
/ 21 марта 2011

У меня возникли некоторые странные проблемы с перерисовкой в ​​приложении Swing, которое я разрабатываю. Я обнаружил, что когда я устанавливаю текст определенного компонента (это просто текстовая метка строки состояния в самом низу окна), вся таблица в совершенно другой области экрана получает указание перекрасить. Это вызывает некоторые проблемы с производительностью, потому что кажется, что в основном все окно просят перекрасить каждый раз, когда я устанавливаю текст строки состояния.

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

Я использовал Swing Explorer, чтобы попытаться визуализировать границы макета, чтобы удостовериться, что все не перекрывается каким-то сумасшедшим образом, и все выглядит хорошо.

Я ищу подход, чтобы определить, какая последовательность вызовов запрашивает перерисовку JTable. Когда я добавляю точку останова к его paintComponent () и поднимаюсь по стеку, я в конечном итоге в вызове RepaintManager paintDirtyRegions (), в котором весь мой основной JPanel (который содержит все в окне) находится внутри переменной tmpDirtyComponents.

Кто-нибудь может объяснить, как вся моя JPanel могла быть помечена как грязная, когда я изначально просто устанавливал одну текстовую метку статуса? Если нет, не могли бы вы дать некоторые указания относительно того, где можно подключиться, чтобы найти ошибку?

Большое спасибо за любую помощь, которую вы можете оказать!

Ответы [ 3 ]

1 голос
/ 21 марта 2011

Каким-то образом мне удалось обойти эту проблему, изменив мой менеджер раскладки.Моя главная панель использовала GroupLayout.Поскольку общий GroupLayout был настолько прост, я решил вместо этого попробовать BorderLayout с содержимым основного окна в JPanel, добавленным в BorderLayout.CENTER, и меткой строки состояния в BorderLayout.PAGE_END.Это исправляет странную аннулирование и перерисовку всего окна, когда я устанавливаю текст метки состояния!Спасибо всем за отличные предложения!

1 голос
/ 17 июля 2016

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

Недостатком является то, что если изменение вашего компонента isValidateRoot действительно требует, чтобы компонент изменил размер, вам потребуется принудительно выполнить повторную проверку вручную (myValidateRoot.getParent (). Invalidate () должен сделать это). ).

1 голос
/ 21 марта 2011

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

Я не уверен, как обойти это.

...