第12章Java版面配置近年来,图形用户界面(GraphicalUserInterface,GUI)因其便利的互动沟通方式,使其渐渐成软件程序设计的重心与起点。程序设计师常常需要先站在用户的角度来看界面应如何摆设,然后再将软件功能配在其图形界面中。图形界面的好坏常常成为软件成功与否的关键。但也因着计算机工业的兴盛,各种操作平台与各种显示硬件界面如雨后春笋般地兴起。因此,当考虑到一个软件在各式平台与各种显示器的分辨率的兼容性问题时,就显得复杂与棘手。版面配置管理器一般传统的图形界面,大都采用(x,y)坐标方式,且大小及位置均需由设计者制定。但这种方式的缺点,就是在不同环境下(如不同的分辨率:由1024x480降为640x480)就有可能产生窗口画面超过显示区的困扰,如右图:Java为了解决这些问题,便以版面配置管理器(LayoutManager)来作为版面的代管人,使程序设计师不必为这些琐碎的显示问题伤脑筋。LayoutManager的功能包括:1.计算一个容器的喜好(preferred)及最小(minimum)尺寸2.将容器中的组件大小及位置作合适的安排如下二图所示,当用户调整应用软件窗口大小,或是改变分辨率时,其组件大小会被自动调整。即使在差异很大的分辨率环境下,布置管理器仍然发挥其功用。AWT的版面配置管理器AWT的版面配置管理器被定义在java.awt包中,共有两种界面及5种类:界面LayoutManagerLayoutManager2类FlowLayoutGridLayoutBorderLayoutCardLayoutGridBagLayout各种容器所默认的版面配置管理器容器类默认版面配置管理器ContainernullPanel,AppletFlowLayoutWindowBorderLayoutFrameBorderLayoutDialogBorderLayoutFlowLayout管理器FlowLayout的排版方式,就像流程或文本处理器在处理一段文字般,常用于RadioButton或CheckBox等组件的排列。FlowLayout管理器FlowLayout管理器的特征:1.以由上到下的方式从左到右排列组件。2.第一个组件放在顶部左上角。3.后续的组件将放在它的旁边。4.当组件排满一行时,它将移动到下一行。FlowLayout管理器5.可以指定组件水平对准。6.有三个可用的选项:LeftRightCenter7.默认情况下,组件是居中排列的。8.还可以指定组件之间的垂直和水平间距。范例12_1:FlowLayout设FlowLayoutflowLayout1=newFlowLayout()时:设FlowLayoutflowLayout1=newFlowLayout(FlowLayout.RIGHT,5,15)时:BorderLayout管理器BorderLayout将版面分为北,东,南,西,中5个区域。可用add()方法将组件加到所指定的区域。范例12_2:BorderLayoutBorderLayout管理器BorderLayout的特征是:1.使用“东”、“西”、“南”、“北”和“居中”来指定组件的位置。2.组件将按照指定要求沿着边框排列。3.中间剩余的空间指定给以中心为其位置的组件。CardLayout管理器CardLayout就像数据卡片般,一次只能显示一个容器组件的内容。用next(),previous(),last(),first()方法来达到前后控制。CardLayout管理器CardLayout管理器的特征是:1.组件将排列到各个卡片上。2.并不是所有的组件都能够同时可视,每次只能查看一个卡片。3.组件放在不同的“面板”中。范例12_3:CardLayout以下程序范例的技巧在于将jPanel1.setLayout(cardLayout1);然后其余的panel加在panel1上,例如jPanel1.add(jPanel2,jPanel2);动作的处理则用cardLayout1.next(jPanel1)方法GridLayout管理器GridLayout可将版面分割成行数(rows)×列数(columns)的格子状版面,然后组件按照由左至右,由上而下的次序排列。范例12_4:GridLayoutGridBagLayout管理器GridBagLayout可做复杂的版面配置。其关键技巧在于设置GridBagConstraints()构造函数的字段参数值。构造函数GridBagConstraints(intgridx,intgridy,intgridwidth,intgridheight,doubleweightx,doubleweighty,intanchor,intfill,Insetsinsets,intipadx,intipady)intgridx,gridy组件相对于左上方格子的相对位置intgridwidth,gridheight组件所占格子数(默认值为1,1)doubleweightx,weighty表示被组件的格子所多消耗的空间(使与其它组件相对距离加大,默认值为0.0,0.0)intanchor-将组件拋锚在格子内的东西南北方位,其值包括CENTER(默认值)EASTNORTHNORTHEASTNORTHWESTSOUTHSOUTHEASTSOUTHWESTWESTintfill-组件将其所占有的格子填满的样子BOTHHORIZONTALVERTICALNONE(默认值)Insetsinsets-Insets的意义表示如下:元件(Component)容器(Container)rightinsetbottominsettopinsetleftinsetInsets(inttop,intleft,intbottom,intright)intipadx,ipady-增减组件的偏好大小(preferredsize),可为负值,以pixel为单位,默认值为0,0范例12_5:GridBagLayoutjLabel2.setText(用户名称);jPanel1.add(jLabel2,newGridBagConstraints(0,0,1,1,0.0,0.0,GridBagConstraints.SOUTHEAST,GridBagConstraints.NONE,newInsets(0,21,0,0),19,0));建构函数GridBagConstraints(intgridx,intgridy,intgridwidth,intgridheight,doubleweightx,doubleweighty,intanchor,intfill,Insetsinsets,intipadx,intipady)Null管理器通常第一次用前面这些布置管理器的初学者,都会有点不习惯。因为大部分人的习惯都是直接在画布或Frame中,用(x,y)坐标来绘制。而Null管理器就是近似(x,y)坐标的一种布置管理器。不过请不要高兴的太早,这种布置管理器是有缺点的,因它不能妥善的处理resize事件。所以,这种管理器不适合大量运用,只能偶尔在例如用random()产生(x,y)对象位置的视觉效果上。范例12_6:Null管理器