Компоненты Swing дергаются при изменении размера JFrame

У меня есть недекорированный JFrame, внутри которого много components (например, JSplitPanes, JPanels with GridBagLayouts, BoxLayouts, BorderLayouts и т. д.). Код построения этого JFrame имеет длину 2500 строк, поэтому я бы не стал его здесь размещать, или это упрощенная версия, извините.

Когда я перетаскиваю JFrame на сторону right или bottom, размер меняется нормально, но когда я перетаскиваю его на сторону left или top, components внутри JFrame сильно подергивается, поэтому выглядит очень некрасиво.

У меня вопрос: почему это происходит? Как я могу предотвратить это (если я могу)? Кто-нибудь исправляет это на своей практике?

UPD: я написал собственный ресайзер для JFrame. Он работает нормально для других окон, в которых меньше компонентов.


person SeniorJD    schedule 01.07.2013    source источник
comment
пожалуйста, как возможно, что undecorated JFrame может вызвать JFrame by right or bottom side, it resizes OK   -  person mKorbel    schedule 01.07.2013


Ответы (1)


Изменение размера фрейма неявно подтверждает вложенный Container, что приводит к вызову doLayout() для затронутых компонентов каждый раз при изменении размера. Вы можете увидеть аналогичный эффект при повторных вызовах paintComponent() при изменении размера этого AnimationTest. Как вы заметили, использование тысяч компонентов плохо масштабируется. В качестве альтернативы используйте шаблон облегченного веса для отображения только видимых ячеек. , как это делается в JTable, JTree, JList и т. д. Если вы не можете использовать один из них, CellRendererPane см. здесь, может поможет.

person trashgod    schedule 01.07.2013
comment
Как применить шаблон легковеса к JSplitPane? - person SeniorJD; 02.07.2013
comment
Вам также потребуется реализовать редакторы, и вы можете работать только с подмножеством компонентов; профиль, чтобы быть уверенным; обратите внимание, что invalidate() нужно выполнять быстро. - person trashgod; 02.07.2013