http://www.java3z.com/cwbwebhome/article/article2/2359.html

 

  在过去的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();
     }
   }
                        


输出入下:



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

getContentPane().setBackground(Color.BLACK);
如下面输出:

 

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");
		// this.setBackground(Color.BLACK);
		getContentPane().setBackground(Color.BLACK);

		setLayout(new GridLayout(6, 6, 2, 2)); // 1.4中问题 1
		getContentPane().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
			getContentPane().add(jPanel);
		}
		setSize(400, 400);
		setVisible(true);
	}

	public static void main(String[] args) {
		new FrameTest();
	}
}


下面的这个程序也会很好解释现象

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/*
 FlowLayout()建立一个新的Flow Layout,此FlowLayout默认值是居中对齐,组件彼此有5单位的水平与垂直间距。 
 FlowLayout(int align)建立一个新的Flow Layout,此FlowLayout可设置排列方式,组件彼此有5单位的水平与垂直 间距。 
 FlowLayout(int align,int hgap,int vgap)建立一个新的Flow Layout,此FlowLayout可设置排列方式与组件间距。 
 */

public class FlowLayoutDemo {
	public FlowLayoutDemo() {
		JFrame f = new JFrame();

		/*
		 * 你可以使用有间距的FlowLayout构造函数,使FlowLayout的排列具有间距,并
		 * 并可利用排列方向参数来指定靠什么方向排列,FlowLayout共有五种排列方式,
		 * 依次是CENTER(默认值),LEFT,RIGHT,LEADING,TRAILING,若我们将下面程序第13
		 * 行改成contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));
		 */
		/*
		 * Container contentPane=f.getContentPane(); contentPane.setLayout(new
		 * FlowLayout()); contentPane.add(new JButton("first"));
		 * contentPane.add(new JButton("second")); contentPane.add(new
		 * JButton("third")); contentPane.add(new JButton("fourth"));
		 * contentPane.add(new JButton("fifth")); contentPane.add(new
		 * JButton("Last"));
		 */
		Container contentPane = f.getContentPane();
		contentPane.setLayout(new FlowLayout());
		// setLayout(new FlowLayout());
		JPanel jPanel = new JPanel();
		jPanel.add(new JButton("first"));
		// f.add(new JButton("first"));
		f.add(new JButton("second"));
		f.add(new JButton("third"));
		f.add(new JButton("fourth"));
		f.add(new JButton("fifth"));
		f.add(new JButton("Last"));

		f.setTitle("FlowLayout");
		// f.pack();//必须将f.pach()去掉,否则setSize功能将没有作用
		f.setSize(400, 220);
		f.setVisible(true);
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	private void setLayout(FlowLayout flowLayout) {
		// TODO Auto-generated method stub

	}

	public static void main(String[] args) {
		FlowLayoutDemo b = new FlowLayoutDemo();
	}
}


 

发现在javaSE1.4之中不能直接在JFrame当中直接使用.setLayout .setBackground   .add(JPanel)  方法 
需要使用Container   contentPane = f.getContentPane();方法获得Container对象  然后contentPane使用上述方法,亦可直接使用getContentPane()进行添加

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐