JLayeredPane против Контейнерного слоя - PullRequest
7 голосов
/ 13 января 2011

JLayeredPane позволяет размещать несколько компонентов друг над другом, используя JLayeredPane.add (Component, Integer) . Компоненты в верхних «слоях» отображаются поверх Компонентов в нижних «слоях».

Container.add (Component, int) предоставляет аналогичный механизм, при котором Компоненты с индексами ниже отображаются поверх Компонентов с более высокими индексами.

Обратите внимание, что первый механизм использует Integer , а второй механизм использует int . Кроме того, один отображает высокие значения поверх низких, а другой - наоборот. Не смешивайте два:)

Мой вопрос: какой смысл использовать JLayeredPane, когда Container уже предоставляет тот же механизм? Компоненты одного слоя лучше другого?

ОБНОВЛЕНИЕ : Существует также Container.setComponentZOrder (Component, int) для рассмотрения.

Ответы [ 2 ]

6 голосов
/ 13 января 2011

Отвечая на мой собственный вопрос:

Container.add (Component, int) и Container.setComponentZOrder (Component, int) практически идентичны.Первая вызывает removeNotify (), а вторая - нет (по соображениям производительности).

Расслоение контейнера работает только в том случае, если JComponent.isOptimizedDrawingEnabled () возвращает false.Одна из реализаций, которая просто так возвращает ложь, это ... вы уже догадались: JLayeredPane

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

Наконец, стоит отметить, что хотя Container объявляет add (Component, int) , он фактически не рисует слоистые компоненты должным образом. JComponent и его подклассы делают.

Еще одна интересная находка: никогда не вызывайте repaint () для дочернего элемента JLayeredPane.Это заставит компонент рисовать себя сверху независимо от его z-порядка.Вы должны вызывать repaint () только для самого JLayeredPane.

0 голосов
/ 13 января 2011

Я предполагаю, что функции Container.add(Component,int) и JLayeredPane.add(Component,Integer) устанавливают добавляемый компонент с определенным индексом.Именно тогда этот индекс используется менеджерами компоновки для обработки положения, макета и порядка рисования компонента.Я думаю, что JLayeredPane.setLayer(Component c, int layer) - это больше, чем вы ищете, когда речь идет о слояхОн специально создан для наложения компонентов.Только два моих чувства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...