JLayeredPane против Контейнерного слоя

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

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

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

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

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

7 голосов | спросил Gili 13 Jpm1000000pmThu, 13 Jan 2011 18:41:32 +030011 2011, 18:41:32

2 ответа


0

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

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

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

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

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

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

ответил Gili 13 Jpm1000000pmThu, 13 Jan 2011 19:22:49 +030011 2011, 19:22:49
0

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

ответил user489041 13 Jpm1000000pmThu, 13 Jan 2011 18:53:30 +030011 2011, 18:53:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132