Spec-Zone .ru
спецификации, руководства, описания, API
|
Многоуровневая область является контейнером Swing, который обеспечивает третью размерность для того, чтобы она расположила компоненты: глубина, также известная как Z порядок. Добавляя компонент к многоуровневой области, Вы определяете ее глубину как целое число. Выше число, ближе компонент к "главной" позиции в пределах контейнера. Если компоненты накладываются, "более близкие" компоненты оттягиваются сверху компонентов в более низкой глубине. Отношение между компонентами в той же самой глубине определяется их позициями в пределах глубины.
У Контейнера AWT есть API, который позволяет Вам управлять компонентом Z порядок. Для получения дополнительной информации см. Спецификацию Фокуса AWT.
Каждый контейнер Swing, у которого есть корневая область — такой как JFrame
, JApplet
, JDialog
, или JInternalFrame
— автоматически имеет многоуровневую область. Большинство программ явно не использует многоуровневую область корневой области, таким образом, этот раздел не будет обсуждать ее. Можно найти информацию об этом в Корневой Области, которая обеспечивает краткий обзор, и Многоуровневую Область, у которой есть более подробная информация. Этот раздел говорит Вам, как создать Вашу собственную многоуровневую область и использовать ее где угодно, можно использовать регулярный контейнер Swing.
Swing обеспечивает два многоуровневых класса области. Первое, JLayeredPane
JDesktopPane
, a JLayeredPane
подкласс, который специализируется для задачи содержания внутренних рамок. Для примеров использования JDesktopPane
, см., Как Использовать Внутренние рамки.
Вот изображение приложения, которое создает многоуровневую область и наложение мест, покрашенное метками в различных глубинах:
Вот код от LayeredPaneDemo.java
это создает многоуровневую область:
layeredPane = new JLayeredPane(); layeredPane.setPreferredSize(new Dimension(300, 310)); layeredPane.setBorder(BorderFactory.createTitledBorder( "Move the Mouse to Move Duke")); layeredPane.addMouseMotionListener(new MouseMotionAdapter() { ... });
Использование кода JLayeredPane
's только конструктор — конструктор без параметров — чтобы создать многоуровневую область. Остальная часть кода использует методы, наследованные от суперклассов, чтобы дать многоуровневой области привилегированный размер и границу, и добавить слушателя движения мыши этого. Слушатель движения мыши только перемещает изображение Герцога вокруг в ответ на перемещение мыши. Хотя мы не показываем код здесь, пример добавляет многоуровневую область к области контента фрейма.
Поскольку мы покажем Вам немного позже, Вы добавляете компоненты к многоуровневой области, используя add
метод. Добавляя компонент к многоуровневой области, Вы определяете компонентную глубину, и дополнительно, ее позиция в пределах ее глубины. Многоуровневая область в демонстрационной программе содержит шесть меток — пять цветных меток и шестой, который выводит на экран изображение Герцога. Поскольку программа демонстрирует, и глубина компонента и его позиция в пределах той глубины могут измениться динамически.
Остальная часть этого раздела затрагивает эти темы:
Вот код из примера программы, который добавляет цветные метки к многоуровневой области:
for (int i = 0; i < ...number of labels...; i++) { JLabel label = createColoredLabel(...); layeredPane.add(label, new Integer(i)); ... }
Можно найти реализацию createColoredLabel
метод в исходном коде для программы. Это только создает непрозрачное JLabel
инициализированный с цветом фона, границей, некоторым текстом, и размером.
Пример программы использует версию с двумя параметрами add
метод. Первым параметром является компонент, чтобы добавить, второе Integer
объект, определяя глубину. Эта программа использует for
итеративная переменная цикла, чтобы определить глубины. Фактические значения не имеют значения очень. Что вопросы является относительным значением глубин и что Вы являетесь непротиворечивыми в пределах своей программы в том, как Вы используете каждую глубину.
Если Вы используете многоуровневую область корневой области, убедитесь, что использовали ее соглашения глубины. Обратитесь к Многоуровневой Области для деталей. Тот раздел показывает Вам, как изменить LayeredPaneDemo
использовать многоуровневую область корневой области. С модификациями можно видеть, как Герцог перетаскивания изображение касается поля комбинированного списка в панели управления.
Как можно видеть из примера программы, если компоненты накладываются, компоненты в более высокой глубине сверху компонентов в более низкой глубине. Чтобы изменить компонентную глубину динамически, используйте setLayer
метод. В примере пользователь может изменить уровень Герцога, делая выбор от поля комбинированного списка. Вот actionPerformed
метод слушателя действия зарегистрировался на поле комбинированного списка:
public void actionPerformed(ActionEvent e) { int position = onTop.isSelected() ? 0 : 1; layeredPane.setLayer(dukeLabel, layerList.getSelectedIndex(), position); }
setLayer
метод, используемый здесь, берет три параметра: компонент, глубина которого должна быть установлена, новая глубина, и позиция в пределах глубины. JLayeredPane
имеет версию с двумя параметрами setLayer
это берет только компонент и новую глубину. Тот метод помещает компонент в нижнюю позицию в ее глубине.
Добавляя компонент к многоуровневой области Вы определяете уровень с Integer
. При использовании setLayer
чтобы изменить уровень компонента, Вы используете int
. Вы могли бы думать это, если Вы используете int
вместо Integer
с add
метод, компилятор жаловался бы, или Ваша программа выдаст недопустимое исключение параметра. Но компилятор не говорит ничего, которое приводит к общей многоуровневой проблеме области. Можно использовать таблицы API в конце этого раздела, чтобы проверить типы параметров и возвращаемых значений для методов то соглашение с уровнями.
Следующий код создает метку, которая выводит на экран изображение Герцога, и затем добавляет метку к многоуровневой области.
final ImageIcon icon = createImageIcon("images/dukeWaveRed.gif"); ... dukeLabel = new JLabel(icon); ... dukeLabel.setBounds(15, 225, icon.getIconWidth(), icon.getIconHeight()); ... layeredPane.add(dukeLabel, new Integer(2), 0);
Этот код использует версию с тремя параметрами add
метод. Третий параметр определяет позицию метки Герцога в пределах своей глубины, которая определяет отношение компонента с другими компонентами в той же самой глубине.
Позиции определяются с int
между-1 и (n - 1), где n является числом компонентов в глубине. В отличие от чисел уровня, чем меньший число позиции, тем выше компонент в пределах его глубины. Используя-1 то же самое как использующий n - 1; это указывает на самую нижнюю позицию. Используя 0 определяет, что компонент должен быть в самой верхней позиции в пределах ее глубины. Поскольку следующие данные показывают, за исключением-1, более низкое число позиции указывает на более высокую позицию в пределах глубины.
Позиция компонента в пределах ее уровня может измениться динамически. В примере можно использовать флажок, чтобы определить, является ли метка Герцога на ключевой позиции в его глубине. Вот actionPerformed
метод для слушателя действия зарегистрировался на флажке:
public void actionPerformed(ActionEvent e) { if (onTop.isSelected()) layeredPane.moveToFront(dukeLabel); else layeredPane.moveToBack(dukeLabel); }
Когда пользователь устанавливает флажок, moveToFront
метод перемещает Герцога в переднюю сторону (позиция 0). И когда пользователь снимает флажок, Дюк перемещается в спину с moveToBack
метод. Можно также использовать setPosition
метод или версия с тремя параметрами setLayer
изменить позицию компонента.
По умолчанию у многоуровневой области нет никакого менеджера по расположению. Это означает, что обычно необходимо писать код, что позиции и измеряют компоненты, Вы вставляете многоуровневую область.
Пример использует setBounds
метод, чтобы установить размер и позицию каждой из меток:
dukeLabel.setBounds(15, 225, icon.getIconWidth(), icon.getIconHeight()); ... label.setBounds(origin.x, origin.y, 140, 140);
Когда пользователь перемещает мышь, вызовы программы setPosition
изменить позицию Герцога:
dukeLabel.setLocation(e.getX()-XFUDGE, e.getY()-YFUDGE);
Хотя у многоуровневой области нет никакого менеджера по расположению по умолчанию, можно все еще присвоить менеджера по расположению многоуровневой области. Все менеджеры по расположению, предоставленные платформой Java, располагают компоненты, как будто они были всеми на одном уровне. Вот версия предыдущего демонстрационного примера, который устанавливает менеджера по расположению многоуровневой области в экземпляр GridLayout
, использование того менеджера по расположению, чтобы разметить шесть цветных меток.
Можно найти код для этой программы в LayeredPaneDemo2.java
. Можно
Много программ используют промежуточные контейнеры (такие как панели) и их менеджеры по расположению, чтобы разметить компоненты на том же самом уровне, но использовать абсолютное расположение, чтобы разметить компоненты на различных уровнях. Для получения дополнительной информации об абсолютном расположении, см.
Следующие таблицы приводят обычно используемый JLayeredPane
конструкторы и методы. Другие методы Вы, наиболее вероятно, вызовете на a JLayeredPane
объект - те, он наследовался от его суперклассов, такой как setBorder
, setPreferredSize
, и так далее. См. API JComponent для таблиц обычно используемых наследованных методов.
API для того, чтобы использовать многоуровневую область попадает в эти категории:
Метод или Конструктор | Цель |
---|---|
JLayeredPane () | Создайте многоуровневую область. |
(в JApplet , JDialog , JFrame , и JInternalFrame ) |
Получите автоматическую многоуровневую область в апплете, диалоговом окне, фрейме, или внутренней рамке. |
Метод | Цель |
---|---|
|
Добавьте указанный компонент к многоуровневой области. Второй параметр, когда существующий, Integer это указывает на уровень. Третий параметр, когда существующий, указывает на позицию компонента в пределах своего уровня. Если Вы используете версию с одним параметром этого метода, компонент добавляется к уровню 0. Если Вы используете один - или версия с двумя параметрами этого метода, компонент помещается под всеми другими компонентами в настоящий момент в том же самом уровне. |
|
Измените уровень компонента. Второй параметр указывает на уровень. Третий параметр, когда существующий, указывает на позицию компонента в пределах своего уровня. |
|
Получите уровень для указанного компонента. |
|
Получите число компонентов в указанном уровне. Значение, возвращенное этим методом, может быть полезным для вычислительных значений позиции. |
|
Получите массив всех компонентов в указанном уровне. |
|
Вычислите самый высокий или самый низкий использующийся в настоящее время уровень. |
Метод | Цель |
---|---|
|
Набор или получает позицию для указанного компонента в пределах его уровня. |
|
Переместите указанный компонент в переднюю сторону или назад ее уровня. |
Эта таблица показывает примеры то использование JLayeredPane
и где те примеры описываются.
Пример | Где Описано | Примечания |
---|---|---|
LayeredPaneDemo |
Этот раздел | Иллюстрирует уровни и внутриуровневые позиции a JLayeredPane . |
LayeredPaneDemo2 |
Этот раздел | Использует менеджера по расположению, чтобы помочь разметить компоненты в многоуровневой области. |
RootLayeredPaneDemo |
Многоуровневая Область | Версия LayeredPaneDemo измененный, чтобы использовать многоуровневую область корневой области. |
InternalFrameDemo |
Как Использовать Внутренние рамки | Использование a JDesktopFrame управлять внутренними рамками. |