大一下学期开始学习JAVA,这个星期开始学JAVA的Swing,对于JFrame顶级容器并不了解,通过查询网上的一些信息结合自己的推理,得到以下的一些猜测。如有不对,实属正常,请指出错误,勿喷。首先我创建一个JFrame窗口,并用其引用设置窗口背景颜色,显然窗口颜色没有改变,(图一)。后面用getContentPane().setBackground()方法设置窗口颜色,运行后窗口背景颜色确实改变了(图二)。说明在创建JFrame实例的过程中就已经自动为JFrame加上了一个默认的ContentPane,PS(默认的这个ContentPane是什么类型的容器,有人说是JPanel类型,但是JPanel的默认布局管理器是FlowLayout,而这个默认的ContentPane的布局管理器是BorderLayout,这就是为什么通过JFrame的add()方法添加组件只能显示最后添加一个。所以我觉得默认的ContentPane类型应该不是JPanel类型。)所以只有使用getContentPane().setBackground()才能够改变窗口的背景颜色,因为现在我们在窗口看见的是这个默认的ContentPane而不是JFrame。接着利用getContentPane()方法,创建了两个引用,ct1,ct2,这里说明一下,使用getContentPane()方法返回的对象都是同一个对象,例如我通过ct2也改变了窗口的颜色,通过ct1,ct2的add()方法添加组件也就相当于JFrame实例的add()方法添加组件。同理,用setContentPane(XX)为JFrame设置窗口面板,将使得JFrame的默认面板改为XX。(图三图四图五图六)。接下来,我又创建了一个JPaneld的实例,并把这个实例添加到JFrame实例中。这里有个问题,就是添加的这个JPanel的实例是与默认的ContentPane同级还是被添加到默认的ContentPane面板上?答案是和其它组件一样被添加到默认的ContentPane面板上,可以通过下面这个程序证明,利用.getParent()方法,知道JPanel实例被添加到了默认的ContentPane上。还有System.out.println(jf1.getContentPane()==jf1.getRootPane().getContentPane());也是得到true。因为JFrame一共分为RootPane,LayeredPane,ContentPane。我们得到那个默认的ContentPane就是在ContentPane这层。之后加入的JPanel容器与实例等这些都将加入到这层上,不会被加到LayeredPane上,但是菜单栏例外。(结构图在图七)。以上全部为我猜想的,如果有误请大哥们指出。我马上改正。


java get 参数太长 java getcontentpane_.setContentPane

java get 参数太长 java getcontentpane_java_02

java get 参数太长 java getcontentpane_java get 参数太长_03

java get 参数太长 java getcontentpane_java get 参数太长_04

java get 参数太长 java getcontentpane_java get 参数太长_05

java get 参数太长 java getcontentpane_java_06