天天看点

Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?

  在过去的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如下:

Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?

这时我们注意到上面输出的jframe的背景颜色并不是黑色而是白色, 也就是说上面的setbackground(color.black)编译后该jframe的背景颜色并没有被显示,如果要让jframe背景颜色为黑色--grid之间颜色为黑色还需要调用getcontentpane(),

getcontentpane().setbackground(color.black); 

运行效果2如下:

Javax.swing中JFrame.getContentPane().add(pane)与JFrame.add(pane)有何区别?

from:http://mindprod.com/jgloss/contentpane.html

继续阅读