2010-11-21 2 views
3

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

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

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

Мой вопрос в том, что нужно иметь обе концепции?

Например, я создал три JLabels с изображениями: frontBoard, backBoard и часть. Кусок иногда идет перед frontBoard и иногда идет между frontBoard и backBoard. Рассмотрим второй пример.

можно получить тот же эффект, через любого из этих средств:

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

or 

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

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

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

ответ

1

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

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

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

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

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

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

  • DEFAULT_LAYER
  • PALETTE_LAYER
  • MODAL_LAYER
  • POPUP_LAYER
  • DRAG_LAYER

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

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

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

+0

Легкость использования предопределенных констант, безусловно, является плюсом. Я надеялся найти какую-то фактическую функциональную разницу между этими двумя методами, но я верю, что вы правы, их нет. Я хотел бы указать, что ваше описание «положения» не упоминает, что самое нижнее положение - -1, верхнее положение - 0, а допустимые значения между ними будут n-2, а не n-1 , Спасибо за ответ! – NeutralAngel

Смежные вопросы