Чтобы поместить компонент в другой слой, надо сначала указать ему новый слой методами:
□ setLayer(Component comp, int layer) — указать компоненту comp слой с номером layer и позицию -1 в новом слое;
□ setLayer(Component comp, int layer, int pos) — указать компоненту comp слой layer и позицию pos в новом слое.
После этого надо поместить компонент в новый слой методом add ().
Слоеная панель обычно не используется напрямую. Она содержится в
Класс JRootPane определяет
JWindow, JDialog, JFrame, JInternalFrame, JApplet, но может использоваться и в других контейнерах, реализующих интерфейс RootPaneContainer.
Корневая панель сама содержит несколько панелей размером во все окно, наложенных друг на друга. Нельзя просто положить компонент на корневую панель. Его надо положить на одну из панелей, содержащихся в корневой панели.
Ниже всех панелей лежит
getContentPane().setLayout(new FlowLayout());
Таким же образом надо помещать компоненты на панель содержимого, например:
Container c = getContentPane();
c.add(new JLabel("0KHO регистрации", JLabel.CENTER), BorderLayout.NORTH); c.add(new JTextArea(5, 50));
Начиная с пятой версии Java SE, панель содержимого сделана панелью по умолчанию. Приведенные ранее строки теперь не требуют указания ссылки на контейнер c, можно написать просто
add(new JLabel("0KHO регистрации", JLabel.CENTER), BorderLayout.NORTH); add(new JTextArea(5, 50));
Панель содержимого располагается в нижнем слое frame_content_layer слоеной панели класса JLayeredPane. Кроме панели содержимого в этом же слое, в его верхней части, может находиться необязательная строка меню класса JMenuBar.
Итак, корневая панель JRootPane не содержит панель содержимого непосредственно. Она хранит экземпляр класса JLayeredPane, который и помещает панель содержимого в свой нижний слой.
Компоненты можно помещать в различные слои слоеной панели, получив ссылку на нее:
getLayeredPane().add(toolBar, JLayeredPane.PALETTE LAYER);
На самом верху корневой панели, выше слоеной панели, лежит невидимая
Дело в том, что обычно действия мыши обрабатываются компонентом, над которым расположен ее курсор, точнее, обработчиком событий мыши MouseEvent, присоединенным к этому компоненту. Такой обработчик можно присоединить к прозрачной панели и обрабатывать события мыши одинаково на всей корневой панели, независимо от того, над каким компонентом расположен курсор мыши. Это можно сделать, например, так:
getGlassPane().addMouselnputListener(this);
Кроме того, прозрачная панель удобна для рисования. Линии и фигуры, нарисованные на ней, будут видны поверх всех компонентов, свободно пересекая их границы. По умолчанию прозрачная панель невидима. Для того чтобы рисунки, сделанные на ней, были видны, надо обратиться к методу setVisible(true).
Всеми панелями корневой панели распоряжается специально разработанный менеджер размещения. Его замена может привести к нарушению взаимодействия компонентов, находящихся на корневой панели. Но всегда можно создать новый экземпляр панели содержимого, слоеной панели или прозрачной панели и поместить его на корневую панель методами setContentPane(Container), setLayeredPane(JLayeredPane) и setGlassPane(Component) .
Очень часто разработчика не устраивает то, что панель содержимого — это простой контейнер библиотеки AWT, экземпляр класса Container. Ее можно легко заменить панелью другого типа, например:
JFrame fr = new JFrame("0KHO верхнего уровня");
JPanel c = new JPanel(); c.add(new JTextField(50)); c.add(new JButton("OK")); fr.setContentPane(c);
Обычно окно, в котором расположена корневая панель, оформляется по правилам текущего оконного менеджера графической оболочки операционной системы. Но метод setwindowDecorationStyle (int) позволяет задать другой стиль оформления. Аргумент этого метода может принимать одно из значений none (по умолчанию), frame, plain_dialog, IN FORMAT I ON_DIALOG, ERROR_DIALOG, COLOR_CHOOSER_DIALOG, FILE_CHOOSER_DIALOG, QUESTI ON_DIALOG,
warning_dialog. Подробнее о стилях оформления Look and Feel написано в
Окно