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

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

Вообще, Вы непосредственно не создаете a JRootPane объект. Вместо этого Вы получаете a JRootPane (хотите ли Вы это или нет!), когда Вы инстанцируете JInternalFrame или один из верхнего уровня контейнеры Swing, такой как JApplet, JDialog, и JFrame.

Используя Верхний уровень Контейнеры говорит Вам основы об использовании корневых областей — получение области контента, установка ее менеджера по расположению, и добавление компонентов Swing к этому. Этот раздел говорит Вам больше о корневых областях, включая компоненты, которые составляют корневую область и как можно использовать их.

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

Поскольку предыдущие данные показывают, у корневой области есть четыре части:

Стеклянная область
Скрытый, по умолчанию. Если Вы делаете стеклянную область видимой, то она походит на лист стекла по всем другим частям корневой области. Это абсолютно прозрачно, если Вы не реализуете стеклянную область paintComponent метод так, чтобы это сделало что-то, и это может прервать входные события для корневой области. В следующем разделе Вы будете видеть пример использования стеклянной области.
Многоуровневая область
Подачи, чтобы расположить его содержание, которое состоит из области контента и дополнительной строки меню. Может также содержать другие компоненты в указанном порядке Z. Для получения информации см. Многоуровневую Область.
Область контента
Контейнер видимых компонентов корневой области, исключая строку меню. Для получения информации об использовании области контента см. Используя Высокоуровневые Контейнеры.
Дополнительная строка меню
Дом для меню контейнера корневой области. Если у контейнера есть строка меню, Вы обычно используете контейнер setJMenuBar метод, чтобы поместить строку меню в соответствующее место. Для получения дополнительной информации об использовании меню и строк меню, см., Как Использовать Меню.

Стеклянная Область

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

Вот изображение приложения, которое демонстрирует стеклянные функции области. Это содержит флажок, который позволяет Вам устанавливать, видима ли стеклянная область — может ли это получить события и краску, непосредственно экранную. Когда стеклянная область видима, она блокирует все входные события от достижения компонентов в области контента. Это также красит красную точку в месте, где это длится, обнаружил нажатое мышью событие.

Снимок GlassPaneDemo

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, GlassPaneDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример GlassPaneDemo
  2. Щелкните по Button 1.
    Появление кнопки изменяется на шоу, что по этому щелкнули.
  3. Щелкните по флажку так, чтобы стеклянная область стала "видимой", и затем щелкните по Button 1 снова.
    Кнопка не действует щелкнутая, потому что стеклянная область прерывает все события от нажатия мыши. Стеклянная область красит красный круг, где Вы выпускаете мышь.
  4. Щелкните по флажку снова так, чтобы стеклянная область была скрыта.
    Когда стеклянная область обнаруживает событие по флажку, это вперед это к флажку. Иначе, флажок не ответил бы на щелчки.

Следующий код от GlassPaneDemo.java шоу и скрывают стеклянную область. Эта программа, оказывается, создает свою собственную стеклянную область. Однако, если стеклянная область не делает никакого рисования, программа могла бы просто присоединить слушателей области стекла значения по умолчанию, как возвращено getGlassPane.

myGlassPane = new MyGlassPane(...);
changeButton.addItemListener(myGlassPane);
frame.setGlassPane(myGlassPane);
...
class MyGlassPane extends JComponent
                  implements ItemListener {
    ...
    //React to change button clicks.
    public void itemStateChanged(ItemEvent e) {
        setVisible(e.getStateChange() == ItemEvent.SELECTED);
    }
...
}

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

...//In the implementation of the glass pane's mouse listener:
public void mouseMoved(MouseEvent e) {
    redispatchMouseEvent(e, false);
}

.../* The mouseDragged, mouseClicked, mouseEntered,
    * mouseExited, and mousePressed methods have the same
    * implementation as mouseMoved. */...

public void mouseReleased(MouseEvent e) {
    redispatchMouseEvent(e, true);
}

private void redispatchMouseEvent(MouseEvent e,
                                  boolean repaint) {
    Point glassPanePoint = e.getPoint();
    Container container = contentPane;
    Point containerPoint = SwingUtilities.convertPoint(
                                    glassPane,
                                    glassPanePoint,
                                    contentPane);

    if (containerPoint.y < 0) { //we're not in the content pane
        //Could have special code to handle mouse events over
        //the menu bar or non-system window decorations, such as
        //the ones provided by the Java look and feel.
    } else {
        //The mouse event is probably over the content pane.
        //Find out exactly which component it's over.
        Component component =
            SwingUtilities.getDeepestComponentAt(
                                    container,
                                    containerPoint.x,
                                    containerPoint.y);

        if ((component != null)
            && (component.equals(liveButton))) {
            //Forward events over the check box.
            Point componentPoint = SwingUtilities.convertPoint(
                                        glassPane,
                                        glassPanePoint,
                                        component);
            component.dispatchEvent(new MouseEvent(component,
                                                 e.getID(),
                                                 e.getWhen(),
                                                 e.getModifiers(),
                                                 componentPoint.x,
                                                 componentPoint.y,
                                                 e.getClickCount(),
                                                 e.isPopupTrigger()));
        }
    }

    //Update the glass pane if requested.
    if (repaint) {
        glassPane.setPoint(glassPanePoint);
        glassPane.repaint();
    }
}

Вот код в MyGlassPane это реализует рисование.

protected void paintComponent(Graphics g) {
    if (point != null) {
        g.setColor(Color.red);
        g.fillOval(point.x - 10, point.y - 10, 20, 20);
    }
}

Многоуровневая Область

Многоуровневая область является контейнером с глубиной, так, что перекрывающей компоненты, может появиться один сверху другого. Общая информация о многоуровневых областях находится в том, Как Использовать Многоуровневые Области. Этот раздел обсуждает подробные сведения того, как корневые области используют многоуровневые области.

Каждая корневая область помещает свою строку меню и область контента в экземпляре JLayeredPane. Упорядочивание Z, которое обеспечивает многоуровневая область, включает поведению, такому как отображение раскрывающихся меню выше других компонентов.

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

Уровни определяются JLayeredPane

Таблица ниже описывает намеченное использование для каждого уровня и приводит JLayeredPane постоянный, который соответствует каждому уровню:

Имя уровня Значение Описание
FRAME_CONTENT_LAYER new Integer(-30000) Корневая область добавляет строку меню и область контента к ее многоуровневой области в этой глубине.
DEFAULT_LAYER new Integer(0) Если Вы не определяете глубину компонента, добавляя это к многоуровневой области, многоуровневая область помещает это в эту глубину.
PALETTE_LAYER new Integer(100) Этот уровень полезен для плавания панелей инструментов и палитр.
MODAL_LAYER new Integer(200) Модальные диалоговые окна внутренней рамки принадлежали бы в этом уровне.
POPUP_LAYER new Integer(300) Раскрывается входят в этот уровень, потому что они должны появиться выше примерно всего.
DRAG_LAYER new Integer(400) Предназначенный, чтобы использоваться, когда компонент перетаскивается. Компонент должен возвратиться к его регулярному уровню когда отброшено.

Вот изображение RootLayeredPaneDemo, который является версией LayeredPaneDemo, который использует многоуровневую область корневой области, вместо того, чтобы создать новую многоуровневую область.

LayeredPaneDemo изменил, чтобы использовать многоуровневую область корневой области

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, RootLayeredPaneDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает RootLayeredPaneDemo
  2. Переместите курсор в окне, так, чтобы Герцог переместился сверху других компонентов.
    Отметьте, что, когда курсор сверху компонентов неметки — является ли это в области контента или в стили Java, обеспеченном панель title — перемещение Герцога временно останавливается. Это - то, потому что события движения мыши идут в компонент, это является самым глубоким в иерархии включения и интересуется событиями от нажатия мыши. Слушатель движения мыши, который перемещает Герцога, регистрируется на многоуровневой области, и у большинства компонентов в той области (за исключением меток), оказывается, есть слушатели движения мыши. Когда мышь отодвигается заинтересованный компонент в многоуровневой области, многоуровневая область не получает событие, и заинтересованный компонент делает.
  3. Удостоверяясь флажок Top Position in Layer устанавливается, уровень Герцога изменения к Желтому (-30000).
    Как прежде, он появляется сверху других компонентов, за исключением Пурпурного (0) и Синий (301) прямоугольники.
  4. Сохраняя Герцога в Желтом уровне, щелкните по флажку, чтобы отправить Герцогу задней части уровня-30000.
    Герцог исчезает, потому что область контента и все компоненты в ней теперь выше его.
  5. Измените уровень Герцога на Синий (301), переместите Герцога вниз немного, таким образом, он стоит на главном краю Желтого прямоугольника, и затем нажмите Пространство, чтобы перевести выпадающий список поля комбинированного списка в рабочее состояние.
    Если стиль реализует выпадающий список как раскрывающийся легкий вес, Герцог появляется сверху выпадающего списка.

Корневой API Области

Таблицы, которые следуют за списком API для того, чтобы использовать корневые области, стеклянные области, и области контента. Для получения дополнительной информации об использовании областей контента пойдите в Использование Высокоуровневых Контейнеров. Вот таблицы в этом разделе:

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

Используя Корневую Область
Метод Цель
JRootPane getRootPane ()
JApplet, JDialog, JFrame, JInternalFrame, и JWindow)
Получите корневую область апплета, диалогового окна, фрейма, внутренней рамки, или окна.
статический JRootPane getRootPane (Компонент)
SwingUtilities)
Если компонент содержит корневую область, возвратите ту корневую область. Иначе, возвратите корневую область (если любой), который содержит компонент.
JRootPane getRootPane ()
JComponent)
Вызовите SwingUtilities getRootPane метод для JComponent.
освободите setDefaultButton (JButton)
JButton getDefaultButton ()
Набор или добирается, какая кнопка (если кто-либо) является кнопкой значения по умолчанию в корневой области. Стиль, который определенное действие, такое как нажатие Вводят, заставляет действие кнопки выполняться.
Установка или Получение Содержания Корневой Области
Следующие методы определяются в JApplet, JDialog, JFrame, JInternalFrame, JRootPane, и JWindow, если не отмечено иначе.
Метод Цель
освободите setGlassPane (Компонент)
Компонент getGlassPane ()
Набор или получает стеклянную область.
освободите setLayeredPane (JLayeredPane)
Контейнер getLayeredPane ()
Набор или получает многоуровневую область.
освободите setContentPane (Контейнер)
Контейнер getContentPane ()
Набор или получает область контента.
освободите setJMenuBar (JMenuBar)
JMenuBar getJMenuBar ()
(не определенный в JWindow)
Набор или получает строку меню.

Примеры тот Корень Использования Области

У каждой программы Swing есть корневая область, но немногие ссылаются на нее непосредственно. Примеры в следующем списке иллюстрируют, как использовать функции JRootPane или стеклянная область. Также см. эти списки:

Пример Где Описано Примечания
GlassPaneDemo Этот раздел Использует стеклянную область, которая красит немного и повторно диспетчеризирует события.
RootLayeredPaneDemo Этот раздел Адаптирует LayeredPaneDemo, чтобы использовать многоуровневую область корневой области.
ListDialog Как Использовать Списки Устанавливает кнопку значения по умолчанию для a JDialog.
FrameDemo2 Как Сделать Фреймы Устанавливает кнопку значения по умолчанию для a JFrame.

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

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