版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章布局管理和容器本章要点·AWT与Swing·Java常用容器·Java常用布局
AWT与Swing⑴AWT抽象窗口工具包(AbstractWindowtoolkit,AWT)提供了一套与本地图形界面进行交互的接口。AWT中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,称之为peers。当利用AWT来构建图形用户界面时,实际上是在利用操作系统所提供的图形库,但是不同操作系统的图形库所提供的功能不一样,在一个平台上存在的功能在另外一个平台上则可能不存在,所以为了实现Java语言所宣称的“一次编译,到处运行”,AWT不得不通过牺牲功能来实现其平台无关性,也就是说,AWT所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT是依靠本地方法来实现其功能的,通常把AWT组件称为重量级组件。AWT是Java最早用于编写图形界面应用程序的开发包。AWT与Swing(续)⑵SwingSwing是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT所能够提供的所有功能,并且用纯粹的Java代码对AWT的功能进行了大幅度的扩充。由于在Swing中没有使用本地方法来实现图形功能,通常把Swing组件称为轻量级组件。
⑶两者比较AWT是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。对于一个嵌入式应用来说,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT当然成了嵌入式Java的第一选择;而在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素,所以在标准版的Java中则提倡使用Swing,也就是通过牺牲速度来实现应用程序的功能。常用容器Container类是所有容器类的父类,可以将组件添加到容器中。Container也是Component的子类,
因此也可以作为组件添加到其他容器上。Object的主要子类如图7.1所示。容器从功能上可分为顶层容器、中间容器和特殊容器三种。图7.1Object主要子类图顶层容器开发人员在使用Java进行图形编程时,其组件需要放置在能够提供图形绘制的容器中,这样的容器就是顶层容器,也可以认为是一个窗口。在Swing中,有JFrame、JDialog和JApplet三种常用的顶层容器。
JFrame①JFrameJFrame用来设计类似于Windows系统中的窗口形式的应用程序。JFrame的常用方法:JFrame()创建一个无标题的窗口,窗口的默认布局为BorderLayout布局JFrame(Strings)创建一个标题为s的窗口,窗口的默认布局为BorderLayout布局setBounds(inta,intb,intwidth,intheight)移动组件并调整其大小。由a和b指定左上角的新位置,由width和height指定新的大小setSize(intwidth,intheight)设置窗口的大小,窗口在屏幕出现的默认位置是(0,0)setVisible(Booleanb)设置窗口是可见还是不可见,窗口默认是不可见的JFrame(续)setResizable(Booleanb)设置窗口是否可调整大小,窗口默认是可调整大小的setExtendedState(intstate)设置窗口的扩展状态,其中参数state取Frame类中的下列类常量:MAXIMIZED_HORIZ、MAXIMIZED_VERT、MAXIMIZED_BOTHsetDefaultCloseOperation(int
operation)设置用户在此窗体上发起“close”时默认执行的操作dispose()窗口调用该方法可以撤销当前窗口,并释放当前窗口所使用的资源add(Component
comp)将指定组件追加到此容器的尾部pack()调整此窗口的大小,以适合其子组件的首选大小和布局。如果该窗口和/或其所有者仍不可显示,则两者在计算首选大小之前变得可显示。JFrame(续)其中方法publicvoidsetDefaultCloseOperation(intoperation)的功能是设置用户在此窗体上发起“close”时默认执行的操作。必须指定以下选项之一:DO_NOTHING_ON_CLOSE(在WindowConstants中定义):不执行任何操作;要求程序在已注册的WindowListener对象的WindowClosing方法中处理该操作。HIDE_ON_CLOSE(在WindowConstants中定义):调用任意已注册的WindowListener对象后自动隐藏该窗体。DISPOSE_ON_CLOSE(在WindowConstants中定义):调用任意已注册WindowListener的对象后自动隐藏并释放该窗体。EXIT_ON_CLOSE(在JFrame中定义):使用Systemexit方法退出应用程序。仅在应用程序中使用。默认情况下,该值被设置为HIDE_ON_CLOSE。JFrame(续)例如,在JFrame窗口上放置一个按钮。程序主要代码如下:
JFramejf=newJFrame("JFrame");//采用构造方法JFrame(Strings)JButtonjb=newJButton("JButton");//创建一个按钮
jf.setLayout(newFlowLayout());//布局方式,详见7.3.3jf.add(jb);//将按钮放置在窗口中
jf.setBounds(50,50,150,80);//设置窗口大小
jf.setVisible(true);//设置窗口可见JDialogJDialog与JFrame用法相同,只不过它是设计对话框。一般而言对话框都会依附在容器或对话框上,在使用上,JDialog与JFrame非常相似,由图7.1可以看出来,JDialog是继承AWT的Dialog类而来,因此JDialog为一个重量级组件。要将组件加入到JDialog上其方法与JFrame一样。JDialog(续)
JDialog常用方法:JDialog(Framef,Strings)创建一个具有标题的初始不可见的对话框,参数s是标题的名字,f是对话框所依赖的窗口JDialog(Framef,Strings,booleanb)创建一个具有标题s的初始不可见的对话框。参数b决定对话框是否为有模式或无模式,,参数f是对话框所依赖的窗口getTitle()获取对话框的标题setTitle()设置对话框的标题setModal(booleanb)设置对话框的模式setSize()设置对话框的大小setVisible(booleanb)显示或隐藏对话框JDialog(续)例如,依赖上面所画JFrame窗体,对话框中放置一个按钮。程序主要代码如下:JDialogd=newJDialog(jf,"JDialog");//依赖窗体的对话框
JButtonjb=newJButton("JButton");//创建一个按钮d.setLayout(newFlowLayout()); d.add(jb);//按钮加入对话框中
d.setSize(120,80); d.setVisible(true);
JAppletJApplet用来设计可以在嵌入在网页中的Java小程序,具体内容在8.3.4中介绍。中间容器在Swing中,常用的中间容器有JPanel、JScrollPane、JToolBar和JSplitPane等面板(JPanel)JPanel是在实际项目开发中使用频率最高的面板之一。JPanel是一个轻量容器组件,用于容纳界面元素。JPanel常用方法:JPanel()创建具有双缓冲和流布局的新JPanelJPanel(LayoutManager
layout)创建具有指定布局管理器的新缓冲JPanelsetLayout(LayoutManager
mgr)设置此容器的布局管理器。mgr为布局管理器setBounds(int
a,int
b,int
width,int
height)移动组件并调整其大小。由x和y指定左上角的新位置,由width和height指定新的大小setVisible(boolean
b)根据参数b的值显示或隐藏此组件add(Component
comp)将指定组件comp追加到此容器的尾部滚动窗口(JScrollPane)JScrollPane是带滚动条的面板,可以用来显示文本、表格等内容。当内容超过了JScrollPane面板的大小时,系统会自动添加滚动条。JScrollPane常用方法:
JScrollPane()
创建一个空的(无视口的视图)JScrollPane,需要时水平和垂直滚动条都可显示JScrollPane(int
vsbPolicy,int
hsbPolicy)创建一个具有指定滚动条策略的空(无视口的视图)JScrollPanecreateHorizontalScrollBar()
默认返回水平的JScrollPane.ScrollBarcreateVerticalScrollBar()
默认返回垂直的JScrollPane.ScrollBarsetHorizontalScrollBarPolicy(int
hsbpolicy)确定水平滚动条何时显示在滚动窗格上setVerticalScrollBarPolicy(int
vsbpolicy)确定垂直滚动条何时显示在滚动窗格上setLayout(LayoutManager
mgr)设置此容器的布局管理器。mgr为布局管理器滚动窗口(JScrollPane)setBounds(int
a,int
b,int
width,int
height)移动组件并调整其大小。由a和b指定左上角的新位置,由width和height指定新的大小setVisible(boolean
b)根据参数b的值(true或false)显示或隐藏JScrollPaneadd(Component
comp)将指定组件comp追加到JScrollPane.的尾部其中:参数vsbpolicy和hsbpolicy分别指定垂直滚动条策略和水平滚动条策略的一个整数,其中vsbpolicy选项有:ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDEDScrollPaneConstants.VERTICAL_SCROLLBAR_NEVERScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYShsbpolicy选项有:ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDEDScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVERScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS工具栏(JToolBar)JToolBar是用于放置各种常用的工具或控件组件。将一般常用的功能以工具栏方式呈现在菜单下,可以提高用户的使用效率。
JToolBar常用方法:JToolBar()创建新的工具栏JToolBar(int
orientation)创建具有指定orientation的新工具栏JToolBar(String
name)创建名称为name的工具栏,名称用作浮动式(undocked)工具栏的标题。JToolBar(String
name,int
orientation)创建名称为name、方向为orientation的工具栏getComponentIndex(Componentc)返回指定组件的索引(从0开始),用于指示组件c的位置getComponentAtIndex(inti)得到一个指定索引号的组件其中,参数orientation指工具栏的方向,其选项有HORIZONTAL和VERTICAL两种,默认的方向为HORIZONTAL。工具栏(JToolBar)例如,在滚动窗口中放置一个文本区组件,将其置于面板的正中间,面板上方放置一具有三个按钮的工具栏。程序主要代码如下://创建三个普通按钮组件
JButtonbutton1=newJButton("图标一");JButtonbutton2=newJButton("图标二");JButtonbutton3=newJButton("图标三");//创建一个工具条,再将上面创建的三个普通按钮组件添加到工具条中
JToolBarbar=newJToolBar();bar.add(button1);bar.add(button2);bar.add(button3);JTextAreaedit=newJTextArea(8,40);//创建一个文本区组件
JScrollPanescroller=newJScrollPane(edit);JPanelpane=newJPanel();BorderLayoutbord=newLayout();pane.setLayout(bord);//采用Border布局,参看7.3.3布局管理器
pane.add("North",bar);pane.add("Center",scroller);setContentPane(pane);分隔板(JSplitPane)JSplitPane面板用于分隔两个(只能两个)组件,并且这两个组件可以由用户交互式调整大小。JSplitPane常用方法:JSplitPane()创建一个配置为将其子组件水平排列、无连续布局、为组件使用两个按钮的新JSplitPanesetOneTouchExpandable(boolean
newValue)设置oneTouchExpandable属性的值,要使JSplitPane在分隔条上提供一个UI小部件来快速展开/折叠分隔条(比如箭头),此属性必须为truesetContinuousLayout(boolean
newContinuousLayout)
设置continuousLayout属性的值,newContinuousLayout默认值为false,当为true时,分隔条改变位置时组件连续重绘setOrientation(int
orientation)
设置方向或者分隔窗格的方式,参数orientation的选项有:JSplitPane.VERTICAL_SPLIT(组件的上/下方向)和JSplitPane.HORIZONTAL_SPLIT(组件的左/右方向)两种setDividerLocation(int
location)设置分隔条的位置,location指定特定于UI值的一个整数(通常以像素为单位)分隔板(JSplitPane)setDividerSize(int
newSize)设置分隔条的大小,newSize给定分隔条大小的一个整数,以像素为单位setLeftComponent(Component
comp)将组件comp设置到分隔条的左边(或上面)setRightComponent(Component
comp)将组件comp设置到分隔条的右边(或下面)setPreferredSize(Dimension
preferredSize)设置此组件的首选大小。如果preferredSize为新的首选大小,若为null,则要求UI提供首选大小,Dimension类封装单个对象中组件的宽度和高度(精确到整数)例如,将JFrame窗口分成左右两个窗格,用两个标签分别指出“左窗格”和“右窗格”。程序主要代码如下:分隔板(JSplitPane)JLabell1=newJLabel("左窗格");//创建两个标签组件
JLabell2=newJLabel("右窗格"); JSplitPanesp=newJSplitPane();//创建一个分隔板
sp.setOneTouchExpandable(true);//让分割条显示出箭头
sp.setContinuousLayout(true);//用户操作分割条箭头时,系统重绘图形
sp.setPreferredSize(newDimension(200,100));//设置尺寸
sp.setOrientation(JSplitPane.HORIZONTAL_SPLIT); sp.setLeftComponent(l1); sp.setRightComponent(l2); sp.setDividerSize(3);//设分割条的粗细
sp.setDividerLocation(100);//此处为100/200,在中间位置
JFramejf=newJFrame("JSplitPane"); jf.add(sp);//将分割板加入窗体中
jf.setVisible(true); jf.pack();//加载splitPane之后调用特殊容器特殊容器是在GUI上起特殊作用的中间层,常见的有JLayeredPane、JInternalFrame和JRootPane等分层面板(JLayeredPane)Swing提供两种分层面板:JLayeredPane和JDesktopPane。JLayeredPane为JFC/Swing容器添加了深度,允许组件在需要时互相重叠;JDesktopPane是桌面窗格,用来实现桌面上内部窗体(JInternalFrame)的特定界面样式行为。向一个分层面板中添加组件时,需要指明将其加入哪一层,指明组件在该层中的位置。
JLayeredPane的常用方法:setLayer(Component
c,int
layer)设置指定组件c的layer属性,使之成为该层中最底部的组件。layer是指定的要设置的层,值越小越接近底部。getLayer(Component
c)返回指定组件c当前层的int值setPosition(Component
c,int
position)将该组件移到当前层中的position处,其中0表示该层中的最顶层位置,-1表示最底层位置getLayeredPane()返回此内部窗体的layeredPane对象getLayeredPane()获得分层面板setLayeredPane(JlayeredPanelp)设置分层面板分层面板(JLayeredPane)例如,在窗口中添加两个按钮,利用分层面板,将两个按钮进行重叠,程序的主要代码如下:JLayeredPanelp=this.getLayeredPane();//要用到的层,获取JLayeredPaneJButtonJLP_a=newJButton("A");JButtonJLP_b=newJButton("B");lp.setLayer(JLP_a,200);//将组件添加到JLayeredPane中,指定所在的层lp.add(JLP_a);lp.setLayer(JLP_b,300);lp.add(JLP_b);JLP_a.setBounds(newRectangle(100,100,100,100));//Button出现位置JLP_b.setBounds(newRectangle(50,50,100,100));内部框架(JInternalFrame)内部框架JInternalFrame的使用与JFrame几乎一样,可以最大化、最小化、关闭窗口、加入菜单等功能,唯一不同的是JInternalFrame不能单独出现,通常加入到桌面窗格(JDesktopPane)中,从而方便管理。其中JDesktopPane是一种特殊的分层面板(JLayeredPane),用来创建虚拟桌面(VirtualDesktop),它可以显示并管理众多的JInternalFrame之间的层次关系。内部框架(JInternalFrame)
JInternalFrame构造方法:JInternalFrame()创建不可调整大小的、不可关闭的、不可最大化的、不可图标化的、没有标题的JInternalFrameJInternalFrame(String
title)创建不可调整大小的、不可关闭的、不可最大化的、不可图标化的、具有指定标题的JInternalFrameJInternalFrame(String
title,boolean
resizable)创建不可关闭的、不可最大化的、不可图标化的,以及具有指定标题和可调整大小的JInternalFrameJInternalFrame(String
title,boolean
resizable,boolean
closable)创建不可最大化的、不可图标化的,以及具有指定标题、可调整大小和可关闭的JInternalFrameJInternalFrame(String
title,boolean
resizable,boolean
closable,boolean
maximizable)创建不可图标化的,但具有指定标题、可调整大小、可关闭和可最大化的JInternalFrameJInternalFrame(String
title,boolean
resizable,boolean
closable,boolean
maximizable,boolean
iconifiable)创建具有指定标题、可调整、可关闭、可最大化和可图标化的JInternalFrame内部框架(JInternalFrame)例如,创建两个JInternalFrame窗口,将这两个窗口放到一个顶层容器中。JFramejf=newJFrame("JInternalFrame");jf.setSize(300,150);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);JPanelcontentPane=newJPanel();/*创建一个面板,并且将之添加到顶层容器内,将之设置为流布局*/jf.setContentPane(contentPane);contentPane.setLayout(newFlowLayout());JDesktopPanedp=newJDesktopPane();/*创建一个虚拟桌面容器,将dp添加到以上创建的中间容器中*/dp.setLayout(newFlowLayout());contentPane.add(dp);JInternalFramejif=newJInternalFrame("第一个窗口",true,true,true);内部框架(JInternalFrame)/*创建两个JIntenaFrame容器,并且创建六个标签组件,分别将它们添加到两个JInternaFrame容器内*/JInternalFramejif1=newJInternalFrame("第二个窗口",true,true,true);JLabell1=newJLabel("这是第一个窗口");JLabell4=newJLabel("这是第二个窗口");jif.setLayout(newFlowLayout());jif1.setLayout(newFlowLayout());jif.add(l1);jif1.add(l4);dp.add(jif);dp.add(jif1);jif.setVisible(true);jif1.setVisible(true);根面板(JRootPane)JRootPane面板是由许多部分组成的,它可以直接从顶层容器中获得一个JRootPane对象直接使用,而不需要创建新对象。JRootPane面板由一个玻璃面板(GlassPane)和一个分层面板(JLayeredPane)组成。其中分层面板是由内容面板(ContentPane)和一个可选择的菜单条(JMenuBar)组成。玻璃面板是完全透明的,缺省为不可见,为接收鼠标事件或在所有组件上绘图提供方便。实际上JRootPane只是一个容器,是一个可以装载其他容器类的容器,它可以装载菜单、内容面板或其他容器等。JLayeredPane为Swing容器添加了深度,允许组件在需要时互相重叠。为方便起见,JLayeredPane将该深度范围分成几个不同的层,将组件放入相应的层,更容易确保组件正确地重叠。根面板(JRootPane)JRootPane常用方法:getContentPane()获得内容面板setContentPane(Containercon)设置内容面板getMenuBar()活动菜单条setMenuBar(JMenuBarmenubar)设置菜单条getGlassPane()获得玻璃面板setGlassPane(Componentc)设置玻璃面板布局管理器所谓布局管理器,就是为容器内的组件提供若干布局策略,每个容器都拥有某种默认的布局管理器,用于负责其内部组件的排列。目前常用有FlowLayout、BorderLayout、GridLayout、CardLayout、GridBagLayout、BoxLayout等布局。其中前5种布局均由AWT包提供,Swing新增加了BoxLayout布局,其显示效果与AWT略有不同。
FlowLayout布局管理器FlowLayout(流布局或顺序布局管理器)是最简单的布局。它的排版原则是将组件从左向右,从上向下排列,默认情况下每一行的组件都是居中排列。FlowLayout是JPanel和JApplet缺省的布局方式。FlowLayout布局效果如图所示。FlowLayout布局管理器(续)
FlowLayout常用方法:FlowLayout()构造一个新的FlowLayout,居中对齐,默认的水平和垂直间隙是5个单位FlowLayout(int
align)构造一个新的FlowLayout,对齐方式是指定的,默认的水平和垂直间隙是5个单位FlowLayout(int
align,int
hgap,int
vgap)创建一个新的流布局管理器,具有指定的对齐方式以及指定的水平和垂直间隙getAlignment()获得此布局的对齐方式getHgap()获得组件之间以及组件与容器的边之间的水平间隙getVgap()获得组件之间以及组件与容器的边之间的水平间隙setAlignment(int
align)设置此布局的对齐方式setHgap(int
hgap)设置组件之间以及组件与容器的边之间的水平间隙setVgap(int
vgap)设置组件之间以及组件与容器的边之间的水平间隙FlowLayout布局管理器(续)其中参数align是对齐方式,其值有FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEADING或FlowLayout.TRAILING;参数hgap是组件之间以及组件与容器的边之间的水平间隙;参数vgap是组件之间以及组件与容器的边之间的垂直间隙。其他布局方式的方法中相同参数属性相同。采用setLayout(LayoutManagermgr)方法设置组件容器采用的布局方式例如,采用流布局,对齐方式为左对齐的语句如下:setLayout(newFlowLayout(FlowLayout.LEFT));此外,FlowLayout中还可以设置横向和纵向的间隔,设置间隔可以使用下面的语句:例如,将横向和纵向间隔设置成10像素的语句如下:
setLayout(newFlowLayout(FlowLayout.CENTER,10,10));BorderLayout布局管理器BorderLayout是一种简单的布局,该布局把容器分为上(North)、下(South)、左(West)、右(East)、中间(Center)5个区域,每个组件将占据每个区域。其中前4个方向占据屏幕的四边,而Center方向占据中间剩下的空白。这种布局一般用于给自己定义的JPanel添加边框。BorderLayout是JFrame和JDialog缺省的布局。BorderLayout布局效果如图所示。
BorderLayout常用方法:BorderLayout()构造一个组件之间没有间距的新边界布局BorderLayout(int
hgap,int
vgap)用指定的组件之间的水平间距构造一个边界布局setHgap(int
hgap)设置组件之间的水平间距setVgap(int
vgap)设置组件之间的垂直间距getVgap()返回组件之间的垂直间距getHgap()返回组件之间的水平间距例如,采用BorderLayout布局,并将按钮放在窗口上方的语句如下:setLayout(newBorderLayout());JButtonb=newJButton("Button");add(b,BorderLayout.NORTH);BorderLayout布局管理器GridLayout布局管理器GridLayout有点像围棋盘,将布局空间划分成若干行若干列的网格区域。添加的组件就在这些小的网格区域内。GridLayout布局效果如图所示。GridLayout布局管理器(续)GridLayout常用方法:GridLayout()创建具有默认值的网格布局,即每个组件占据一行一列GridLayout(int
rows,int
cols)创建具有指定行数和列数的网格布局GridLayout(int
rows,int
cols,int
hgap,int
vgap)创建具有指定行数
rows和列数cols的网格布局setColumns(int
cols)将此布局中的列数设置为指定值colssetHgap(int
hgap)将组件之间的水平间距设置为指定值setRows(int
rows)将此布局中的行数设置为指定值rowssetVgap(int
vgap)将组件之间的垂直间距设置为指定值getColumns()获取此布局中的列数getHgap()获取组件之间的水平间距getRows()获取此布局中的行数getVgap()获取组件之间的垂直间距GridLayout布局管理器(续)例如,采用GridLayout布局,设置一行两列,放置两个按钮的语句如下:setLayout(newGridLayout(1,2));JButtonb1=newJButton("Button1");JButtonb2=newJButton("Button2");add(b1);add(b2);CardLayout布局管理器CardLayout将容器中的每个组件当作一张卡片,在一个容器中可以加入多个卡片,但每次只有一个卡片是可见的。CardLayout常用方法:CardLayout()创建一个间隙大小为0的新卡片布局CardLayout(int
hgap,int
vgap)创建一个具有指定的水平和垂直间隙的新卡片布局addLayoutComponent(Component
comp,Object
constraints)将指定的组件添加到此卡片布局的内部名称表。其中参数comp是要添加的组件;参数constraints是标识布局中特定卡片的标记setHgap(int
hgap)设置组件之间的水平间隙setVgap(int
vgap)设置组件之间的垂直间隙previous(Container
parent)翻转到指定容器parent的前一张卡片next(Container
parent)翻转到指定容器parent的下一张卡片last(Container
parent)翻转到容器
parent的最后一张卡片first(Container
parent)翻转到容器
parent的第一张卡片CardLayout布局管理器(续)getHgap()获得组件之间的水平间隙getLayoutAlignmentX(Container
parent)返回容器
parent中组件沿x轴的对齐方式。返回值应该在0和1之间,其中0表示根据原点进行对齐,1表示根据距离原点最远的点对齐,0.5表示居中对齐等。getLayoutAlignmentY(Container
parent)返回容器
parent中组件沿y轴的对齐方式。返回值应该在0和1之间,其中0表示根据原点进行对齐,1表示根据距离原点最远的点对齐,0.5表示居中对齐等等。getVgap()获得组件之间的垂直间隙例如,采用CardLayout布局,将两个按钮放在卡片中的语句如下:JButtonb1=newJButton("First");JButtonb2=newJButton("Last");setLayout(newCardLayout());add(b1,"1");add(b2,"2");
GridBagLayout布局管理器GridBagLayout是一种非常灵活的布局,也是最复杂的。它是在将屏幕划分成网格的基础上,允许每个组件占据一个或多个区域。与GridLayout不同,GridBagLayout是按照开发人员自己的需要安排组件位置。GridBagLayout布局效果如图所示。GridBagLayout布局管理器(续)
GridBagLayout常用方法:GridBagLayout()
创建网格包布局管理器arrangeGrid(Container
parent)布置网格。其中参数parent是布局容器addLayoutComponent(Component
comp,Object
constraints)使用指定constraints对象将指定组件添加到布局中。其中参数constraints是确定如何将组件添加到布局的对象getConstraints(Component
comp)获取指定组件的约束。返回实际GridBagConstraints对象的副本getLayoutDimensions()确定布局网格的列宽度和行高度,大多数应用程序并不直接调用此方法setConstraints(Component
comp,GridBagConstraints
constraints)设置此布局中指定组件的约束条件constraints其中参数comp是制定的组件。GridBagLayout布局管理器(续)GridBagLayout需要创建约束对象GridBagConstraints,GridBagConstraints类指定使用GridBagLayout类布置的组件的约束。GridBagConstraints的常用参数参数意义gridx组件的横向坐标girdy组件的纵向坐标gridwidth组件的横向宽度,也就是指组件占用的列数。使用RELATIVE指定组件的显示区域从gridx到它所在行的倒数第二个单元格;使用REMAINDER指定组件的显示区域为从gridx到该行(针对gridwidth)中的最后一个单元gridheight组件的纵向长度,也就是指组件占用的行数weightx指行的权重,告诉布局管理器如何分配额外的水平空间weighty指列的权重,告诉布局管理器如何分配额外的垂直空间anchor当组件小于其显示区域时使用此属性fill如果显示区域比组件的区域大的时候,可以用来控制组件的行为。控制组件是垂直填充,还是水平填充,或者两个方向一起填充insets指组件与表格空间四周边缘的空白区域的大小ipadx
组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值ipady
组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值GridBagLayout布局管理器(续)例如,采用GridBagLayout布局,在窗体上放置b1-b5共五个按钮。b1、b2和b3位于第一行,填充整个区域;后两个按钮位于第二行,其中b4按钮占据两个按钮的位置的主要代码如下:JFramef=newJFrame("GridBagLayout");GridBagLayoutgridbag=newGridBagLayout();GridBagConstraintsc=newGridBagConstraints();f.setLayout(gridbag);c.fill=GridBagConstraints.BOTH;//使组件完全填满其显示区域
c.weightx=1.0;//分布额外的水平空间
gridbag.setConstraints(b1,c);//指定按钮b1的约束条件为cgridbag.setConstraints(b2,c);
GridBagLayout布局管理器(续)c.gridwidth=GridBagConstraints.REMAINDER;/*组件的显示区域为从gridx到该行(针对gridwidth)中的最后一个单元*/c.weightx=0.0;gridbag.setConstraints(b3,c);c.weightx=0.0;c.gridwidth=GridBagConstraints.RELATIVE;//指定组件为其行中的倒数第二个组件
gridbag.setConstraints(b4,c);c.gridwidth=GridBagConstraints.REMAINDER;gridbag.setConstraints(b5,c);BoxLayout布局管理器BoxLayout(盒式布局或箱式布局)与前面几种布局不同的是BoxLayout是由Swing提供的布局方式,功能上同GridBagLayout一样强大,而且更加易用。BoxLayout将几个组件以水平或垂直的方式组合在一起,其中各个组件的大小随窗口的大小变化而变化。
BoxLayout常用方法:BoxLayout(Container
target,int
axis)创建一个将沿给定轴放置组件的布局管理器,target是需要布置的容器,参数axis是布置组件时使用的轴。它可以是以下值之一:BoxLayout.X_AXIS、BoxLayout.Y_AXIS、BoxLayout.LINE_AXIS或BoxLayout.PAGE_AXIScreateGlue()创建一个不可见的“glue”组件,在其可见组件有一个最大宽度(对于横向box)或高度(对于纵向box)的Box中,该组件可能很有用createHorizontalBox()创建一个从左到右显示其组件的BoxcreateHorizontalGlue()创建一个横向glue组件createHorizontalStrut(int
width)创建一个不可见的、固定宽度为width的组件BoxLayout布局管理器(续)createVerticalBox()创建一个从上到下显示其组件的BoxcreateVerticalGlue()创建一个纵向glue组件createVerticalStrut(int
height)创建一个不可见的、固定高度height的组件getAccessibleContext()获得与此Box相关联的AccessibleContext例如,采用BoxLayout布局的语句,并将两个按钮水平从上到下放于一列的主要代码如下:Containerc=this.getContentPane();//需要布置的容器
BoxLayoutbox1=newBoxLayout(c,BoxLayout.Y_AXIS);//指定按钮从上到下放置
c.setLayout(box1);//设置布局方式为BoxLayout布局
c.add(newJButton("first"));c.add(Box.createVerticalStrut(10));//创建一个不可见的、固定高度的空间量
c.add(newJButton("second"));本章小结⑴抽象窗口工具包(AbstractWindowtoolkit,AWT)提供了一套与本地图形界面进行交互的接口。AWT中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,称之为peers。当利用AWT来构建图形用户界面时,实际上是在利用操作系统所提供的图形库,但是不同操作系统的图形库所提供的功能不一样,在一个平台上存在的功能在另外一个平台上则可能不存在,所以为了实现Java语言所宣称的“一次编译,到处运行”,AWT不得不通过牺牲功能来实现其平台无关性,也就是说,AWT所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT是依靠本地方法来实现其功能的,通常把AWT组件称为重量级组件。AWT是Java最早用于编写图形界面应用程序的开发包。Swing是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT所能够提供的所有功能,并且用纯粹的Java代码对AWT的功能进行了大幅度的扩充。由于在Swing中没有使用本地方法来实现图形功能,通常把Swing组件称为轻量级组件。本章小结(续)AWT是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。对于一个嵌入式应用来说,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT当然成了嵌入式Java的第一选择;而在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素,所以在标准版的Java中则提倡使用Swing,也就是通过牺牲速度来实现应用程序的功能。⑵容器从功能上可分为顶层容器、中间容器和特殊容器三种。⑶开发人员在使用Java进行图形编程时,其组件需要放置在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《奥美基础训练营》课件
- 协助老人导尿护理
- 2024年山东省滨州市中考化学真题【附答案】
- 一建法规培训
- 复杂性先天性心脏病
- 《周获利能力分析》课件
- 数学学案:课堂导学空间向量的线性运算
- 产假返岗培训
- 智慧树知到《研究生学术规范与医学伦理(浙江中医药大学)》章节测试答案
- 安全行车知识培训
- 《企业员工薪酬激励问题研究10000字(论文)》
- ICU脓毒血症护理查房
- 2023-2024学年安徽省天长市小学数学五年级下册期末自测考试题
- 2023年象山县特殊教育岗位教师招聘考试笔试模拟试题及答案解析
- GB/T 28222-2011服务标准编写通则
- GB/T 20671.7-2006非金属垫片材料分类体系及试验方法第7部分:非金属垫片材料拉伸强度试验方法
- GB/T 14337-1993合成短纤维断裂强力及断裂伸长试验方法
- GB/T 10001.4-2021公共信息图形符号第4部分:运动健身符号
- 修剪指甲培智五年级上册生活适应教案
- 计算机信息系统灾难恢复计划(完整版)资料
- 脚手架搭设及基本知识教程课件
评论
0/150
提交评论