LayoutManager панели содержимого JFrame

Как упоминалось здесь: Добавление компонентов на панель содержимого,

Панель содержимого по умолчанию — это простой промежуточный контейнер, наследуемый от JComponent и использующий BorderLayout в качестве менеджера компоновки.

и вот доказательство:

JFrame frame = new JFrame();
LayoutManager m = frame.getContentPane().getLayout();
System.out.println(m instanceof BorderLayout); // prints true

Однако можете ли вы объяснить вывод следующего кода?

JFrame frame = new JFrame();

LayoutManager m = frame.getContentPane().getLayout();
System.out.println(m);
System.out.println(m.getClass().getName());

LayoutManager m2 = new BorderLayout();
System.out.println(m2);
System.out.println(m2.getClass().getName());

ВЫВОД:

javax.swing.JRootPane$1[hgap=0,vgap=0]
javax.swing.JRootPane$1
java.awt.BorderLayout[hgap=0,vgap=0]
java.awt.BorderLayout

person Eng.Fouad    schedule 09.07.2012    source источник
comment
если сомневаетесь, читайте источник :-)   -  person kleopatra    schedule 09.07.2012


Ответы (1)


это объясняет ваш результат:

 protected Container createContentPane() {
        JComponent c = new JPanel();
        c.setName(this.getName()+".contentPane");
        c.setLayout(new BorderLayout() {
            /* This BorderLayout subclass maps a null constraint to CENTER.
             * Although the reference BorderLayout also does this, some VMs
             * throw an IllegalArgumentException.
             */
            public void addLayoutComponent(Component comp, Object constraints) {
                if (constraints == null) {
                    constraints = BorderLayout.CENTER;
                }
                super.addLayoutComponent(comp, constraints);
            }
        });
        return c;
    }

Метод, создающий область содержимого, создает анонимный внутренний класс, наследуемый от BorderLayout. Таким образом, тестирование instanceof вернет true, но это другой класс, поэтому имя класса будет другим.

person Peter    schedule 09.07.2012
comment
Кроме того, $ в имени класса является явным признаком того, что в игру вступает внутренний класс. В этом случае внутренний класс является анонимным, поэтому вы видите $1 вместо фактического имени. - person DPlusV; 09.07.2012