代码:
package com.swing.book.five;//这段代码主要是为读者展示如何使用BorderLayout布局管理器将组件进行布局
import javax.swing.*;
import java.awt.*;public class test1 {
static final int WIDTH = 300;
static final int HEIGHT = 200; public static void main(String[] args) { JFrame jf = new JFrame("测试程序");
jf.setSize(WIDTH, HEIGHT);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
JPanel contentPane = new JPanel();
jf.setContentPane(contentPane);
JButton b1 = new JButton("生活");
JButton b2 = new JButton("工作");
JButton b3 = new JButton("睡觉");
JButton b4 = new JButton("购物");
JButton b5 = new JButton("饮食");
BorderLayout lay = new BorderLayout();// 创建一个布局管理器对象,将中间容器设置为此布局管理

                   jf.setLayout(lay);
//contentPane.setLayout(lay);

contentPane.add(b1, "North");// 将五个普通按钮组件分别按照东、南、西、北、中五个方位添加到中间容器中
contentPane.add(b2, "South");
contentPane.add(b3, "East");
contentPane.add(b4, "West");
contentPane.add(b5, "Center");
jf.pack();
}
}这段代码很简单,只是有一点,我不是很理解
按照我的理解“布局管理器应该是针对内容面板的”
大家看下红色代码部分,
 jf.setLayout(lay);
//contentPane.setLayout(lay);
我发现这2行代码任选一个,得到的程序效果是一样的
如果按照我的理解,代码应该用contentPane.setLayout(lay);
更加合理些。我不明白为什么用 jf.setLayout(lay);

解决方案 »

  1.   

    看看JFrame的源代码:
    public void setLayout(LayoutManager manager) {
            if(isRootPaneCheckingEnabled()) {
                getContentPane().setLayout(manager);
            }
            else {
                super.setLayout(manager);
            }
        }
    你在代码中设置了jf.setContentPane(contentPane); 
      

  2.   

    同楼上,我准备让LZ将你的这段代码:jf.setContentPane(contentPane); 注释下的
      

  3.   

    按照1楼的意思,
    jf.setLayout(lay); 
    contentPane.setLayout(lay); 
    这两个都是一样的效果
      

  4.   

    意思当然不一样,关键是执行效果。就好比:
    你向你爸爸的银行卡存1w元,跟你爸爸自己向他的银行卡存1w元的效果是一致的。他的银行卡里多了1w元。
      

  5.   

    默认的布局就是layout,所以你不设置布局也可以自动调用setlayout
      

  6.   

    JFram默认用BorderLayout
    JPanel默认是FlowLayout在FlowLayout....   EAST常量实际上是   SwingConstaints.EAST
    SwingConstaints好像有很多Swing常用的常量,直接EAST也有对应的常量,,至于 North South有没有我就不知道了,没查过
      

  7.   

    因为Frame继承自contentPane,所以frame也就有了setLayout属性了