Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Как Использовать Различные Компоненты
Как Использовать Многоуровневые Области
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Использовать Многоуровневые Области

Многоуровневая область является контейнером Swing, который обеспечивает третью размерность для того, чтобы она расположила компоненты: глубина, также известная как Z порядок. Добавляя компонент к многоуровневой области, Вы определяете ее глубину как целое число. Выше число, ближе компонент к "главной" позиции в пределах контейнера. Если компоненты накладываются, "более близкие" компоненты оттягиваются сверху компонентов в более низкой глубине. Отношение между компонентами в той же самой глубине определяется их позициями в пределах глубины.


Отметьте: 

У Контейнера AWT есть API, который позволяет Вам управлять компонентом Z порядок. Для получения дополнительной информации см. Спецификацию Фокуса AWT.


Каждый контейнер Swing, у которого есть корневая область — такой как JFrame, JApplet, JDialog, или JInternalFrame — автоматически имеет многоуровневую область. Большинство программ явно не использует многоуровневую область корневой области, таким образом, этот раздел не будет обсуждать ее. Можно найти информацию об этом в Корневой Области, которая обеспечивает краткий обзор, и Многоуровневую Область, у которой есть более подробная информация. Этот раздел говорит Вам, как создать Вашу собственную многоуровневую область и использовать ее где угодно, можно использовать регулярный контейнер Swing.

Swing обеспечивает два многоуровневых класса области. Первое, JLayeredPane, class, которые базируются, области используют, и class, используемый примером в этом разделе. Второе, JDesktopPane, a JLayeredPane подкласс, который специализируется для задачи содержания внутренних рамок. Для примеров использования JDesktopPane, см., Как Использовать Внутренние рамки.

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

Снимок LayeredPaneDemo

Попробуйте это:: 
  1. Нажмите кнопку Launch, чтобы работать, Демонстрационный пример LayeredPane, использующий Сеть Java™, Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример TreeDemo

  2. Переместите мышь в более низкой части окна. Изображение Герцога перетаскивает позади зеленых и красных меток, но перед другими тремя метками.
  3. Используйте поле комбинированного списка наверху окна, чтобы изменить глубину Герцога. Используйте флажок, чтобы установить, является ли Герцог на ключевой позиции — позиции 0 — в пределах текущей глубины.

Вот код от 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

Можно найти код для этой программы в LayeredPaneDemo2.java. Можно работать, LayeredPaneDemo2 (загрузите JDK 6 или позже). Если Вы хотите скомпилировать пример, консультируйтесь, пример индексируют для списка всех необходимых файлов.

Много программ используют промежуточные контейнеры (такие как панели) и их менеджеры по расположению, чтобы разметить компоненты на том же самом уровне, но использовать абсолютное расположение, чтобы разметить компоненты на различных уровнях. Для получения дополнительной информации об абсолютном расположении, см. Обхождение без менеджера по Расположению (Абсолютное Расположение).

Многоуровневый API Области

Следующие таблицы приводят обычно используемый JLayeredPane конструкторы и методы. Другие методы Вы, наиболее вероятно, вызовете на a JLayeredPane объект - те, он наследовался от его суперклассов, такой как setBorder, setPreferredSize, и так далее. См. API JComponent для таблиц обычно используемых наследованных методов.

API для того, чтобы использовать многоуровневую область попадает в эти категории:

Создание или Получение Многоуровневой Области
Метод или Конструктор Цель
JLayeredPane () Создайте многоуровневую область.
JLayeredPane getLayeredPane ()
JApplet, JDialog, JFrame, и JInternalFrame)
Получите автоматическую многоуровневую область в апплете, диалоговом окне, фрейме, или внутренней рамке.
Компоненты иерархического представления
Метод Цель
пусто добавьте (Компонент)
пусто добавьте (Компонент, Объект)
пусто добавьте (Компонент, Объект, интервал)
Добавьте указанный компонент к многоуровневой области. Второй параметр, когда существующий, Integer это указывает на уровень. Третий параметр, когда существующий, указывает на позицию компонента в пределах своего уровня. Если Вы используете версию с одним параметром этого метода, компонент добавляется к уровню 0. Если Вы используете один - или версия с двумя параметрами этого метода, компонент помещается под всеми другими компонентами в настоящий момент в том же самом уровне.
освободите setLayer (Компонент, интервал)
освободите setLayer (Компонент, интервал, интервал)
Измените уровень компонента. Второй параметр указывает на уровень. Третий параметр, когда существующий, указывает на позицию компонента в пределах своего уровня.
интервал getLayer (Компонент)
интервал getLayer (JComponent)
Получите уровень для указанного компонента.
интервал getComponentCountInLayer (интервал) Получите число компонентов в указанном уровне. Значение, возвращенное этим методом, может быть полезным для вычислительных значений позиции.
Компонент [] getComponentsInLayer (интервал) Получите массив всех компонентов в указанном уровне.
интервал highestLayer ()
интервал lowestLayer ()
Вычислите самый высокий или самый низкий использующийся в настоящее время уровень.
Установка Внутриуровневых Позиций Компонентов
Метод Цель
освободите setPosition (Компонент, интервал)
интервал getPosition (Компонент)
Набор или получает позицию для указанного компонента в пределах его уровня.
освободите moveToFront (Компонент)
освободите moveToBack (Компонент)
Переместите указанный компонент в переднюю сторону или назад ее уровня.

Примеры, который Использование Многоуровневые Области

Эта таблица показывает примеры то использование JLayeredPane и где те примеры описываются.

Пример Где Описано Примечания
LayeredPaneDemo Этот раздел Иллюстрирует уровни и внутриуровневые позиции a JLayeredPane.
LayeredPaneDemo2 Этот раздел Использует менеджера по расположению, чтобы помочь разметить компоненты в многоуровневой области.
RootLayeredPaneDemo Многоуровневая Область Версия LayeredPaneDemo измененный, чтобы использовать многоуровневую область корневой области.
InternalFrameDemo Как Использовать Внутренние рамки Использование a JDesktopFrame управлять внутренними рамками.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Метки
Следующая страница: Как Использовать Списки