Почему в контейнере на качелях слишком много слоев?

Может ли кто-нибудь сказать мне, в чем разница между приведенным ниже кодом

JFrame jf=new JFrame();
JButton jb=new JButton();
jf.add(jb);

а также

JFrame jf=new JFrame();
Container c=jf.getContentPane();
JButton jb=new JButton();
c.add(jb);

Даже я не совсем понимаю RootPane, LayeredPane, GlassPane. Какая польза от RootPane ?? Я никогда не использовал его в кодировании. Я прочитал это по ссылке ниже

http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html

но не слишком ясно, потому что нет практической ситуации, в которой я использовал бы вышеизложенное. Спасибо за Ваш ответ!!


person Jatin Khurana    schedule 12.04.2013    source источник


Ответы (2)


Начиная с Java 5, нет никакой разницы между вашими примерами кода. JFrame#add теперь перенаправлен на JFrame#getContentPane от вашего имени.

До Java 5 он генерировал исключение, что означало, что вам приходилось добавлять компоненты непосредственно в панель содержимого.

JRootPane используется для создания легкого контейнера, в который могут быть добавлены другие компоненты Swing. Что еще более важно, он предоставляет средства, с помощью которых могут организовываться контейнеры Swing верхнего уровня.

JRootPane состоит из слоев. Внизу находится JMenuBar и панель содержимого, а над ней - стеклянная панель.

Благодаря своей конструкции JRootPane может иметь несколько дополнительных слоев (обычно между панелью содержимого и стеклянной панелью), это обычно используется для таких вещей, как всплывающие окна.

Стеклянная панель действует как наложение, которое можно использовать для визуализации контента поверх всего остального (а также для блокировки событий мыши и клавиатуры).

Взгляните на Как использовать корневые панели.

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

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

person MadProgrammer    schedule 12.04.2013

Оба одинаковы ...
Оба добавлены в объект java.awt.Container.

JFrame и контейнер имеют следующую иерархию
Случай 1: JFrame # add () -> Frame # add () -> Window # add () -> Container # add () // Компонент добавляется в контейнер

Случай 2: JFrame # getContentPane () -> getRootPane (). GetContentPane (); он вернет объект контейнера (контейнер # добавить)

person Rajeshkumar Natarajen    schedule 12.04.2013
comment
Случай 1 (частично) неверен. Начиная с Java 5, addImpl делегирует права панели содержимого. Раньше он генерировал исключение - person MadProgrammer; 12.04.2013