点,那就是存在于设计者头脑中的布局样式仍然没有被明确地描述出来,而是被降级成一个个摆放在一起的零散的组件,虽然这些组件本身是可视的。这个语义断层的存在同样会使得通过可视化界面设计工具设计出来的界面非常脆弱。布局管理器试图通过提供一些常用的布局样式来解决这个问题。但是,这种做法非常僵化,也就是说你只能使用现有的布局管理器,如果它们无法满足你的要求,你也无法自己定制。此外,这些布局管理器仅仅适合于一些简单的情况。对于一些复杂的布局只要给定了一个Rectangle和一个Container,一个Component就可以在界面上指定的布局位置呈现出来。例如,当我们使用布局语言在一个JFrame上坐标位置为(0,0)展示一个width为200,height为60的按钮时,我们可以这样来描述(为了简洁起见,后面的代码实例中均略去Layout名字空间前缀):Button().title(“button1”).at(0,0,200,60).in(this.getContentPane());仅仅提供这样一种原子元素的语言显然无法满足我们前面提到的目标。在我们的界面布局语言中,还提供了两种在布局中非常常用的两种从已有组件构造新组件的组合手段:above和beside。其中above组合子接收3个参数:两个现有Component以及一个比例,它会产生出一个新的复合Component,其中按照给定的比例把第一个Component摆放在第二个Component之上。Beside组合子接收同样的3个参数,并且也产生出一个新的复合Component,其中按照给定的比例把第一个Component摆放在第二个Component左边。例如,如果我们希望在一个给定的ContainerC上的Rectangle(0,0,300,40)中,平行摆放一个TextField和一个Button,且希望TextField占据80%的比例时,可以这样来描述:beside(TextField(),Button().title(“ok”),0.8).at(0,0,300,40).in(C)同样,我们可以使用above来进行如下描述:above(TextField(),Button().title(“ok”),0.5).at(0,0,300,60).in(C)值得注意的是,在我们的界面布局语言中,Component在beside和above操作下是封闭的,也就是说beside和above操作的结果同样也是Component,并完全可以作为基本的Component来再次进行beside和above组合。这样我们就可以使用这两个简单的操作生成更加复杂的Component来,从而完成复杂的界面布局。比如,我们可以这样来进行描述:ComponentL=beside(TextField(),Button().title(“…”),0.8);above(L,Button().title(“ok”),0.5).at(0,0,300,60).in(C)为了保证界面布局语言的完备性,我们增加了一种特殊的原子元素:Empty。它的作用只是占据一定的布局空间。比如,如果我们希望在一个布局空间中右半边放置一个Button,左半边空置,就可以这些描述:beside(Empty(),Button(),0.5).at(0,0,200,40).in(C)读者在后面可以看到,正是这个Empty以及beside和above操作的闭包性质为我们描述任意复杂的布局样式提供了可能。在有了这些基础的布局元素和组合手段后,我们就可以通过组合手段来把一些典型的布局样式抽象出来。在下一小节中读者将会看到,布局语言