JLayeredPane: в чем функциональная разница между глубиной и положением?

Я работаю над игрой Connect Four для школьного проекта Java. У меня есть «как» для JLayeredPane, и он работает, как ожидалось, но я не совсем понимаю «почему», стоящее за определенной концепцией.

Вот мое понимание:

JLayeredPane - это контейнер, похожий на JPanel, который позволяет вам указывать глубину и положение для каждого компонента. Глубина - это целое число, где 0 - нижний уровень, а n-1 - верхний уровень, где n - количество компонентов. Position - это целое число (да, один использует класс оболочки Integer, а один - просто примитив!), Который определяет положение компонента в слое, где 0 - самый верхний слой, -1 - самый нижний слой, а положительные целые числа в между, чем меньше число, тем выше позиция. Таким образом, четыре компонента в одном слое можно расположить в позиции 0, 1, 2, -1 от самого верхнего до самого нижнего.

Мой вопрос: зачем нужны обе концепции?

Например, я создал три JLabel с изображениями: переднюю панель, заднюю панель и кусок. Часть иногда проходит перед передней панелью, а иногда - между передней и задней панелями. Рассмотрим второй пример.

Я могу получить тот же эффект любым из следующих способов:

1) Я могу установить backBoard на уровень 0, положение 0; деталь к слою 1, позиция 0; и frontBoard к слою 2, позиция 0

 or 

2) Я могу установить backBoard на уровень 0, положение -1; кусок к слою 0, позиция 1; и frontBoard к слою 0, позиция 0

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

Может ли кто-нибудь пролить свет на эту загадку для меня?


person NeutralAngel    schedule 21.11.2010    source источник


Ответы (1)


Во-первых, лучше всего в таком случае взглянуть на учебник, он обычно очень информативен: http://download.oracle.com/javase/tutorial/uiswing/components/layeredpane.html.

Кроме того, javadoc самого класса содержит довольно хорошее объяснение того, как работает JLayeredPane.

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

  • «глубина» - это свойство слоя: они пронумерованы так, что слой с глубиной 0 является самым дальним и самым низким из всех. Слои с большей глубиной покрывают слои с меньшей глубиной.
  • Поскольку слои могут содержать более одного компонента и поскольку компоненты всегда могут перекрываться, должен быть способ определить z-порядок компонентов внутри слоя: это достигается путем перечисления компонентов с помощью < em> значение "position". Если в слое n компонентов и вы начинаете отсчет с 0, то позиция должна быть значением в диапазоне от 0 до n-1.

Теперь вы можете возразить, что, поскольку у вас есть значение «position», вам вообще не нужно несколько слоев, поскольку вы можете позиционировать все компоненты по оси Z просто через их значение «position». Это правда, и никто не удерживает вас от этого.

Обоснование наличия нескольких слоев можно увидеть, когда вы поймете, что есть заранее определенные константы, которые будут использоваться для значения "глубины" слоев:

  • DEFAULT_LAYER
  • PALETTE_LAYER
  • MODAL_LAYER
  • POPUP_LAYER
  • DRAG_LAYER

Это просто логические группировки для сложных многооконных приложений, которые помогут вам убедиться в соблюдении некоторых ограничений стекирования: представьте, что вы хотите создать модальное диалоговое окно, которое появляется поверх основного фрейма вашего приложения. Если вы используете один слой, вы должны сами отслеживать положение всех видимых компонентов и установить положение диалогового окна на n. Теперь добавьте анимацию перетаскивания, всплывающие меню и т. Д., И эта задача становится довольно сложной.

Эта сложность уменьшается за счет использования предопределенных слоев. Если вы хотите отобразить модальное диалоговое окно, вам не нужны компоненты главного окна приложения, вы просто помещаете его в MODAL_LAYER, и все готово: вы можете быть уверены, что оно отображается поверх всех других компонентов .

К счастью, Swing уже делает все это за вас (используя JLayeredPane или его подклассы внутри), поэтому вы можете просто вызвать setVisible (boolean) или setModal (boolean) в JDialog, и все получится так, как вы ожидали.

person Thomas    schedule 30.11.2010
comment
Несомненно, преимущество в простоте использования предопределенных констант. Я надеялся найти реальную функциональную разницу между двумя методами, но считаю, что вы правы, ее нет. Я хотел бы отметить, что в вашем описании позиции не упоминается, что самая нижняя позиция равна -1, самая верхняя позиция - 0, а допустимые значения между ними будут n-2, а не n-1. Спасибо за ответы! - person NeutralAngel; 01.12.2010