上一章里面我们说到了组件与容器的关系:容器里面是可以加入组件和另一容器;

组件里面不可以添加任何容器或组件。

需要注意的是:

顶级容器(JFrame、JApplet、JDialog和JWindow)不能被添加到另一个容器上面;

上一章已经说过小程序的应用了,AWT的组件也同时给了介绍,所以这一章我们只介绍SWING。毕竟SWING是在AWT的基础上扩展的,能用SWING就尽量用SWING吧。

知识框架

一、SWING常用容器

1.框架(JFrame)通过SWING创建的框架在一开始是不可见的,必须调用Windows类的show()方法或者Component类的setVisible()方法来显示该框架,要在你的所有组件添加完之后再设置窗体可见,否则你之后的组件就看不到了;

无论对于JFrame还是Frame,单击关闭图标是不会终止应用程序的。对于Frame,什么也不执行,对于JFrame则是把框架隐藏;

可以调用setDefaultCloseOperation()方法,设置其属性为“EXIT_ON_CLOSE”或者“3”来设置点击关闭图标就退出应用程序,此方法是通过调用system.exit(0)结束程序的;

一般不会直接定义JFrame类的对象,而是先定义一个JFrame的子类,在该类的构造函数中调用JFrame的构造函数,并将需要的组件或者面板加入该框架;

JFrame内部由各种组件构成,处理框架时通常不是直接处理框架,而是处理内部的组件,这就要用到其中的内容格;

//这样获取JFrame的内容格,默认的是边框布局Container contentPane=this.getContentPane();

//也可以自己设置,设为面板之类的就变成流式布局了JPanel contentPane = new JPanel();//实例化一个面板,this.setContentPane(contentPane);//把这个面板设置为这个框架的内容格

2.面板(JPanel)面板必须包含在另一个容器里面,同时在它的内部还可以包含面板或者其他组件;

JPanel组件以双缓冲(双缓冲使用更多内存空间实现快速、无闪烁的更新)绘制,并且其周围还可以设置边框;

JPanel contentPane = new JPanel();
contentPane.setBorder(BorderFactory.createLineBorder(Color.gray, 3));

//给面板加了一个酷酷的灰色边框JPanel默认是流式布局的。

二、布局管理器

1.FlowLayout布局FlowLayout布局是将组件按照加入的先后顺序从左至右一排排列,排满之后就转到下一行,继续从左至右排列;

默认方式下,FLowLayout布局是将组件放在每行的最中央,但是可以通过构造函数的参数指定组件的对齐方式;

public FlowLayout()//构造一个新的 FlowLayout,它是居中对齐的public FlowLayout(int align)//构造一个新的 FlowLayout,它具有指定的对齐方式public FlowLayout(int align,int hgap,int vgap)//创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。

align有五个属性:FlowLayout.LEFT: 左对齐;

FlowLayout.RIGHT :右对齐;

FlowLayout.CENTER :居中;

FlowLayout.LEADING : 与容器方向的开始边对齐,例如,对于从左到右的方向,则与左边对齐;

FlowLayout.TRAILING : 与容器方向的结束边对齐,例如,对于从左到右的方向,则与右边对齐。

hgap表示水平间隔,默认为5个单位;

vgap表示垂直间隔,默认为5个单位。

2.BorderLayout布局BorderLayout布局将容器的空间分为东西南北中五个区域;

当发生缩放时,中间组件的大小变化量最大,其余部分的额组件只是需要的时候才发生相应的变化来填满容器的空间;

在向BorderLayout类的布局管理器对象加入组件时,必须指定组件所处的位置。(EAST、WEST、NORTH、SOUTH、CENTER)

public BorderLayout()

//构造一个组件之间没有间距的新边框布局public BorderLayout(int hgap,int vgap)

//构造一个具有指定组件间距的边框布局。水平间距由 hgap 指定,垂直间距由vgap 指定。

3.GridLayout布局将空间划分为网格状,各个组件占据大小相同的区域;

public GridLayout()
//创建具有默认值的网格布局,即每个组件占据一行一列。
public GridLayout(int rows,int cols)
//创建具有指定行数和列数的网格布局。给布局中的所有组件分配相等的大小。
public GridLayout(int rows,int cols,int hgap,int vgap)
//创建具有指定行数和列数的网格布局。给布局中的所有组件分配相等的大小。

//此外,将水平和垂直间距设置为指定值。水平间距将置于列与列之间。将垂直间距将置于行与行之间。rows 和 cols中的一个可以为零(但不能两者同时为零),这表示可以将任何数目的对象置于行或列中

4.CardLayout布局有时程序需要多种组件,但是屏幕大小有限制,不可能将其同时显示,这就需要将这些组件分成组,每组放在一个面板中,再把这些面板按照CardLayout方式布置在程序的窗口中;

卡片布局是一个比较复杂的布局,步骤如下:获取JFrame的内容格(contentPane);

再实例化一个准备使用CardLayout的面板(jp);

实例化一个CardLayout对象(adl),也就是一个卡片布局管理器;

把2中的面板的内容格布局设置为卡片布局;

实例化卡片(card1,实际上也是一个面板);

用add方法向卡片(card1)添加组件;

把卡片(card1)放入面板(jp)上;

把面板(jp)添加到JFrame的内容格(contentPane)中。

Container contentPane=frame.getContentPane();
Jpanel jp=new Jpanel();
CardLayout adl=new CardLayout();
jp.setLayout(adl);
JPanel card1=new JPanel();
card.add(new JLabel("卡片一"));
jp.add(card1,"卡片一");

contentPane.add(jp,BordLayout.WEST);我们有时候希望单击卡片片头的方式来选择一个卡片大概就像这样

CardLayout不允许这样做,但是Java提供了JTabbedPane容器来实现这个功能,自己去探索吧,嘿嘿。

SWING的各种控件的功能在知识框架里面都有提到,最好的方法还是自己动手尝试,里面有一些好玩的,比如JProgressBar、JToolTip、JColorChooser、JFileChooser……都是比AWT要强很多的控件,Come on!