Почему макет JFrame не тот, который я установил? - PullRequest
2 голосов
/ 08 июля 2009

Если я установлю макет на JFrame с помощью setLayout, а затем получу его с помощью getLayout, тогда я получу другой LayoutManager. Что здесь происходит ??

public class Lay {
    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                java.awt.Container container =
                    new javax.swing.JFrame();
                    //new javax.swing.JPanel();
                java.awt.LayoutManager layout =
                    new java.awt.GridLayout();
                container.setLayout(layout);
                layout = container.getLayout();
                System.err.println(layout);
            }
        });
    }
}

Придает

java.awt.BorderLayout[hgap=0,vgap=0]

но если я заменю JFrame на JPanel, я получу

java.awt.GridLayout[hgap=0,vgap=0,rows=1,cols=0]

1 Ответ

11 голосов
/ 08 июля 2009

Из Java API для JFrame:

public void setLayout(LayoutManager manager)

Устанавливает LayoutManager. Переопределено для условной переадресации вызова на contentPane. Для получения дополнительной информации см. RootPaneContainer.

А со страницы RootPaneContainer:

Этот интерфейс служит маркером для разработчиков Swing GUI, которым необходимо обрабатывать такие компоненты, как JFrame, которые содержат, в частности, один JRootPane. Для удобства JFrame, JDialog, JWindow, JApplet и JInternalFrame по умолчанию перенаправляют по умолчанию все вызовы методов add, remove и setLayout в contentPane. Это означает, что вы можете позвонить:

rootPaneContainer.add(component);

вместо:

rootPaneContainer.getContentPane().add(component);

A JRootPane - это общий компонент, который все тяжелые компоненты используют, чтобы выглядеть как собственное окно ОС. Он обрабатывает строку меню, кнопки «закрыть / свернуть / развернуть» и т. Д. JFrame пытается скрыть тот факт, что JRootPane действительно выполняет вашу работу, но в этом случае это только запутало.

...