在过去的j2se版本中,部件(components)不能直接添加到最高级(top level)的swing容器,这些容器包括:jframe, jdialog, jwindow, japplet和jinternalframe. 例如现在有一个jframe的instance命名为aframe。 我们要添加一个命名为acomponent的部件(比如一个jpanel)到jframe里。以往我们需要调用jframe的getcontentpane()办法。如下:
aframe.getcontentpane().add(acomponent)
在j2se5.0中,我们可以直接添加部件到最高级的swing容器,也可以直接在容器内设置布局管理(layout manager)和删除部件。这个变化允许我们可以省去调用getcontentpane()而直接在容器内应用add(),setlayout()和remove()。然而,我们还是不能忽略了contentpane,即使我们可能将不会再使用contentpane来添加部件到容器。 先看一个我们以往在j2se1.4及其以前的版本经常应用到的例子。我们要设置一个jframe的布局管理而且添加一些部件到该jframe。查看api关于jframe的文件可以发现,
jframe从java.awt.container继承了add()办法. 该add()是用来添加一个部件到jframe容器. container类里也包含setlayout()办法, 该setlayout()是用来设置继承者(比如上面的jframe容器)的布局管理。
下面是一个简单的例子:
import javax.swing.jframe;
import javax.swing.jpanel;
import java.awt.gridlayout;
import java.awt.color;
public class frametest extends jframe {
//注意在1.4及其以前版本中可以编译,但是运行有问题
//5.0版本运行正常
frametest(){
super("test");
setbackground(color.black);
setlayout(new gridlayout(6,6,2,2)); // 1.4中问题 1
for ( int i=0;i<36; i++){
jpanel jpanel = new jpanel();
jpanel.setbackground(new color (
(int)(math.random()*16777215)));
add(jpanel); // 1.4中问题 2
}
setsize(400,400);
setvisible(true);
}
public static void main(string[] args){
new frametest();
}
运行效果1如下:
这时我们注意到上面输出的jframe的背景颜色并不是黑色而是白色, 也就是说上面的setbackground(color.black)编译后该jframe的背景颜色并没有被显示,如果要让jframe背景颜色为黑色--grid之间颜色为黑色还需要调用getcontentpane(),
getcontentpane().setbackground(color.black);
运行效果2如下:
from:http://mindprod.com/jgloss/contentpane.html