我在构造方法里写了 setLayout(new GridBagLayout()), 但是运行后还是BorderLayout,怎么办?

解决方案 »

  1.   

    直接设置contentPane吧。
    把组件都加到panel里面。
      

  2.   

    api中有说明:
    JFrame 类与 Frame 轻微不兼容。与其他所有 JFC/Swing 顶层容器一样,JFrame 包含一个 JRootPane 作为其唯一的子容器。根据规定,根窗格所提供的内容窗格应该包含 JFrame 所显示的所有非菜单组件。这不同于 AWT Frame。为了方便地使用 add 及其变体,已经重写了 remove 和 setLayout,以在必要时将其转发到 contentPane
    测试:
    import java.awt.GridLayout;
    import java.awt.LayoutManager;
    import javax.swing.JFrame;public class Main{
        public static void main(String[] args) {
            JFrame  frame = new JFrame("Test");
            frame.setLayout(new GridLayout(3,3));
            LayoutManager manager = frame.getLayout();
            System.out.println(manager);
            manager = frame.getContentPane().getLayout();
            System.out.println(manager);
        }
    }看得出设置之后contentPane的布局管理器改了。
      

  3.   

    http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html
      

  4.   

    新手应该多看API,那样才能进步
      

  5.   

     哦,就是说不能直接往JFrame里加组件,要往ContentPane里加?
     最近在看AWT的书(看布局管理器),忘了这回事了...
      

  6.   

    也可以直接往JFrame里加,因为API里说:
    根据规定,根窗格所提供的内容窗格应该包含 JFrame 所显示的所有非菜单组件。这不同于 AWT Frame。为了方便地使用 add 及其变体,已经重写了 remove 和 setLayout,以在必要时将其转发到 contentPane。这意味着可以编写:       frame.add(child);
     子级将被添加到 contentPane
      

  7.   

    再看一下你的程序是不是写错了,api里讲的清楚,表格布局有些设置是根据行列参数的具体情况自动变的。
      

  8.   

    frame.getContentPane().setLayout();
    frame.getContentPane().add(child);
      

  9.   

    你如果用frame.setLayout(new GridBagLayout());是会出现问题的,因为你默认给frame布局了,而并没有给frame.getContentPane()得到的Container布局,你所有的控件都是放在frame.getContentPane()上面的,所以就会出现你所说的成为了BorderLayout布局了.