Java桌面程序开发第4章-容器与布局.ppt
大连理工大学出版社大连理工大学出版社 Java桌面程序开发桌面程序开发 目目 录录第1章认识Java桌面程序第2章开发第一个Java桌面程序第3章事件处理机制第4章容器与布局第5章使用Swing常用组件第6章使用Swing高级组件第7章连上DB的Java桌面程序第8章 Java桌面程序实例:联系人管理第第4章章 容器与布局容器与布局教学要求 1掌握:Swing组件类的层次、用Swing创建图形用户界面的基本方法,JFrame、JPanel和布局管理器的基本使用方法及功能 2理解:Swing容器与布局管理器的作用、计算器的实现4.1Swing组组件件类类的的层层次次pSwing是围绕着一个称为JComponent的新组件构建的,而JComponent则由AWT的容器类扩展而来。pSwing组件分为:u顶层容器u中间层容器u基本组件Swing组组件的件的层层次次结结构构p组件从功能可以分为:u 特殊容器:在GUI上起特殊作用的中间层,如JInternalFrame、LayeredPane,JRootPane。u 基本控件:实现人机交互的组件,如Jbutton,、ComboBox,、JList、JMenu,、JSlider,、JtextField。u 不可编辑信息的显示:向用户显示不可编辑信息的组件,例如JLabel、JProgressBar、ToolTip。u 可编辑信息的显示:向用户显示能被编辑的格式化信息的组件,如JColorChooser、JFileChoose,、JFileChooser,、Jtable,JtextArea。4.2创创建窗体:建窗体:JFramepJFrame:Swing中用于创建桌面窗体的类p对JFrame添加组件有两种方式:1、用getContentPane()方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childComponent)2、建立一个JPanel或 JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板:JPanel contentPane=new JPanel();/把其它组件添加到Jpanel中;frame.setContentPane(contentPane);/把contentPane对象设置成为frame的内容面板;JFrame窗口中的各面板窗口中的各面板pJFrame类的常用变量:static int EXIT_ON_CLOSE:退出应用程序后的默认窗口关闭操作,用于setDefaultCloseOperation(int)方法中pJFrame类的构造方法JFrame():构造一个初始时不可见的新窗体 JFrame(GraphicsConfiguration gc):以屏幕设备的指定 GraphicsConfiguration 和空白标题创建一个窗体JFrame(String title):创建一个新的、初始不可见的、具有指定标题的窗体JFrame(String title,GraphicsConfiguration gc):创建一个具有指定标题和指定屏幕设备的 GraphicsConfiguration窗体pJFrame的常用方法Container getContentPane():返回此窗体的容器对象 JMenuBar getJMenuBar():返回此窗体上设置的菜单栏。JLayeredPane getLayeredPane():返回此窗体的 layeredPane 对象。void remove(Component comp):从该容器中移除指定组件。void setContentPane(Container contentPane):设置 contentPane 属性。void setDefaultCloseOperation(int operation):设置用户在此窗体上发起 close 时默认执行的操作。void setIconImage(Image image):设置此 frame 要显示在最小化图标中的图像。void setJMenuBar(JMenuBar menubar):设置此窗体的菜单栏。void update(Graphics g):只是调用 paint(g)。示例示例例4-2 创建JFrame的实例(对象)来调用JFrame的方法,以此设计界面窗口。例4-3演示了JFrame的基本使用方式,点击关闭窗口按钮采用了事件处理,利用WindowAdapter实现了退出程序。4.3帮助帮助实现实现布局的容器:布局的容器:JPanelpJPanel是一个放置其他图形组件(包括其它JPanel)的中间层容器,不能独立存在,必须被添加到其他容器中(如JFrame)。pJPanel是一个空白容器类,提供容纳组件的空间,通常用于集成其他的若干组件,使这些组件形成一个有机的整体,再增加到别的容器上。pJPanel是Swing包中一个非常重要的控件,在程序的开发中,经常会使用到JPanel,这样可以大大的规范布局pJPanel的构造方法:JPanel():创建具有双缓冲和流布局的新 JPanel。JPanel(boolean isDoubleBuffered):创建具有 FlowLayout 和指定缓冲策略的新 JPanel。JPanel(LayoutManager layout):创建具有指定布局管理器的新缓冲 JPanel。JPanel(LayoutManager layout,boolean isDoubleBuffered):创建具有指定布局管理器和缓冲策略的新 JPanel。pJPanel类主要方法:AccessibleContext getAccessibleContext():获取与此 JPanel 关联的 AccessibleContext。PanelUI getUI():返回呈现此组件的外观(L&F)对象。String getUIClassID():返回指定呈现此组件的 L&F 类名的字符串。protected String paramString():返回此 JPanel 的字符串表示形式。void setUI(PanelUI ui):设置呈现此组件的外观(L&F)对象。void updateUI():利用当前外观的值重置 UI 属性。示例示例JPanel类具有简单容器显示图形的画布的双重功能。例4-5的小应用程序创建了三个JPanel实例:一个包含“Name:”选项卡和文本域的控制面板、一个专门用作显示文本和图形的画布的窗格,以及包含上述控制面板和画面的第三个面板。帮助布局的帮助布局的JScrollPanep常用的帮助布局的还有JScrollPane,Swing中的滚动面板。pJScrollPane 是具有可选的垂直/水平滚动条,可选的行/列标题的中间层面板。pJScrollPane 基本上由 JScrollBar、一个 JViewport 以及它们之间的连线组成。JViewPort主要负责显示内容区域的大小,形状为一平面矩形JScrollBar主要产生窗口滚动条,让用户可以看到更多的内容除了滚动条和视口之外pJScrollPane的构造方法:JScrollPane():创建一个空的(无视口的视图)JScrollPane,需要时水平和垂直滚动条都可显示。JScrollPane(Component view):创建一个显示指定组件内容的 JScrollPane,只要组件的内容超过视图大小就会显示水平和垂直滚动条。JScrollPane(Component view,int vsbPolicy,int hsbPolicy):创建一个 JScrollPane,它将视图组件显示在一个视口中,视图位置可使用一对滚动条控制。JScrollPane(int vsbPolicy,int hsbPolicy):创建一个具有指定滚动条策略的空(无视口的视图)JScrollPane。p滚动条显示策略vsbPolicy和hsbPolicy的值可使用下面的静态常量来进行设置,它们是在接口ScrollPaneConstants中定义的:HORIZONTAL_SCROLLBAR_ALWAYS:总是显示水平滚动条HORIZONTAL_SCROLLBAR_NEVER:总不显示水平滚动条HORIZONTAL_SCROLLBAR_AS_NEEDED:必要时(显示的组件的水平区域大于JScrollPane组件的水平区域时)显示VERTICAL_SCROLLBAR_ALWAYS:总是显示垂直滚动条VERTICAL_SCROLLBAR_NEVER:总不显示垂直滚动条VERTICAL_SCROLLBAR_AS_NEEDED:必要时(显示的组件的垂直区域大于JScrollPane组件的垂直区域时)显示示例示例4.4常用的布局管理器常用的布局管理器pJava为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的所有组件安排给一个布局管理器负责管理,如:排列顺序,组件的大小、位置,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。4.4.1 使用流式布局使用流式布局FlowLayoutpFlowLayout 是JPanel,JApplet的缺省布局管理器。p其组件的放置规律是从上到下、从左到右进行放置,如果容器足够宽,第一个组件先添加到容器中第一行的最左边,后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。pFlowLayout的构造方法:FlowLayout():构造一个新的 FlowLayout,它是居中对齐的,默认的水平和垂直间隙是 5 个单位。FlowLayout(int align):构造一个新的 FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是 5 个单位。FlowLayout(int align,int hgap,int vgap):创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。pFlowLayout类常用方法:void setAlignment(int align):设置此布局的对齐方式。int getAlignment():获得此布局的对齐方式。void setHgap(int hgap):设置组件之间以及组件与 Container 的边之间的水平间隙。int getHgap():获得组件之间以及组件与 Container 的边之间的水平间隙 void setVgap(int vgap):设置组件之间以及组件与 Container 的边之间的水平间隙。int getVgap():获得组件之间以及组件与 Container 的边之间的水平间隙。void addLayoutComponent(String name,Component comp):将指定的组件添加到布局中。void removeLayoutComponent(Component comp):从布局中移除指定的组件。pFlowLayout的静态成员变量:static int CENTER:此值指示每一行组件都应该是居中的。static int LEADING:此值指示每一行组件都应该与容器方向的开始边对齐,例如,对于从左到右的方向,则与左边对齐。static int LEFT:此值指示每一行组件都应该是左对齐的。static int RIGHT:此值指示每一行组件都应该是右对齐的。static int TRAILING:此值指示每行组件都应该与容器方向的结束边对齐,例如,对于从左到右的方向,则与右边对齐。p设置组件的布局方式有两种方法:一种直接在构造方法中设置,如:JPanel jp=new JPanle(new FlowLayout(FlowLayout.LEFT);/设置面板中组件靠左对齐一种是先实例化布局对象,再设置,如:FlowLayout fl=new FlowLayout(FlowLayout.CENTER,20,40);jp1.setLayout(fl);jp2.setLayout(fl);示例示例4.4.2 使用使用边框布局框布局BorderLayoutpBorderLayout 是JWindow,JFrame和JDialog的缺省布局管理器。BorderLayout布局管理器把容器分成5个区域:North,South,East,West和Center,每个区域只能放置一个组件。p在使用BorderLayout的时候,如果容器的大小发生变化,其变化规律为:组件的相对位置不变,大小发生变化。pBorderLayout的构造方法:BorderLayout():构造一个组件之间没有间距的新边框布局。BorderLayout(int hgap,int vgap):构造一个具有指定组件间距的边框布局。pBorderLayout的静态成员变量:static String CENTER:中间区域的布局约束(容器的中央)。static String EAST:东区域的布局约束(容器的右边)。static String NORTH:北区域的布局约束(容器的顶部)。static String SOUTH:南区域的布局约束(容器的底部)。static String WEST:西区域的布局约束(容器的左边)。pBorderLayout的常用方法:void setHgap(int hgap):设置组件之间的水平间距。void setVgap(int vgap):设置组件之间的垂直间距。int getHgap():返回组件之间的水平间距。void removeLayoutComponent(Component comp):从此边界布局中移除指定组件。4.4.3 使用网格布局使用网格布局GridLayoutpGridLayout将容器划分成若干行列的网格。在容器上添加组件时,它们会按从左到右、从上到下的顺序在网格中排列。p在GridLayout的构造方法里,我们需要指定希望将容器划分成的网格的行、列数。GridLayout布局管理器总是忽略组件的最佳大小,所有单元的宽度是相同的,是根据单元数对可用宽度进行平分而定的。同样地,所有单元的高度是相同的,是根据行数对可用高度进行平分而定的。pGridLayout的构造方法:GridLayout():创建具有默认值的网格布局,即每个组件占据一行一列。GridLayout(int rows,int cols):创建具有指定行数和列数的网格布局。GridLayout(int rows,int cols,int hgap,int vgap):创建具有指定行数和列数的网格布局。pGridLayout类常用的方法:void setRows(int rows):将此布局中的行数设置为指定值。int getRows():获取此布局中的行数。void setColumns(int cols):将此布局中的列数设置为指定值。int getColumns():获取此布局中的列数。void setHgap(int hgap):将组件之间的水平间距设置为指定值。int getHgap():获取组件之间的水平间距。void setVgap(int vgap):将组件之间的垂直间距设置为指定值。int getVgap():获取组件之间的垂直间距。void removeLayoutComponent(Component comp):从布局移除指定组件。pGridLayout的属性int numColumns:设置容器的列数,组件从左到右按列放置,当组件数大于列数时,下一个组件将自动添加新的一行。默认值为1 列。boolean makeColumnsEqualWidth:强制使列都具有相同的宽度,默认值为false。int marginWidth:设置组件与容器边缘的水平距离,默认值为5。int marginHeight:设置组件与容器边缘的垂直距离,默认值为5。int horizontalSpacing:设置列与列之间的间隔,默认值为5。int verticalSpacing:设置行与行之间的间隔,默认值为5。4.4.4 使用箱式布局使用箱式布局BoxLayoutpBoxLayout是在Swing中新增加的一种布局管理器,它允许多个组件全部垂直摆放或全部水平摆放。嵌套组合多个使用BoxLayout布局管理器的Panel,可以帮助实现类似GridBagLayout的功能,但却要比直接使用GridBagLayout简单许多。pBoxLayout布局管理器按照自上而下(y轴)或者从左到右(x轴)的顺序布局依次加入组件。建立一个BoxLayout对象,必须指明两个参数:被布局的容器和BoxLayout的主轴。缺省情况下,组件在纵轴方向上居中对齐。pBoxLayout 管理器是用 axis 参数构造的,该参数指定了将进行的布局类型。有四个选择:X_AXIS:从左到右水平布置组件。Y_AXIS:从上到下垂直布置组件。LINE_AXIS:根据容器的 ComponentOrientation 属性,按照文字在一行中的排列方式布置组件。PAGE_AXIS:根据容器的 ComponentOrientation 属性,按照文本行在一页中的排列方式布置组件。pBoxLayout的构造方法:BoxLayout(Container target,int axis):创建一个将沿给定轴放置组件的布局管理器。pBoxLayout类常用方法:int getAxis():返回用于布局组件的轴。float getLayoutAlignmentX(Container target):返回容器沿 X 轴的对齐方式。float getLayoutAlignmentY(Container target):返回容器沿 Y 轴的对齐方式。4.4.5 使用自由布局使用自由布局 nullp如果不希望使用某种布局策略,而想精确地指定各个组件的位置和大小,我们可以使用容器的setLayout()方法,将参数设为null,即可以取消容器的布局管理器设置。p若采用了null布局,就需要我们为各个组件设置位置和大小,可以使用组件的setBounds()方法。4.5实例:例:实现计算器算器该计算器综合运用了常用的布局策略,并完成如下功能:1、点击按钮中的数字键和运算符键就能进行简单的加、乘、乘、除四则运算;2、如果输入有误时可以按(BackSpace)键返回上一步或者(C)撤销后重新输入新数据。实训任务实训任务p实训4-1 定义按钮若干让它们按照从左向右的顺序依次排列 并显示,按钮上显示的名称分别为“按钮 l”、“按钮 2”、“按钮 3”、“按钮 4”和“按钮 5”。p实训4-2 设计一个简单的通用名片录入界面,名片的信息包括姓名、称谓、工作单位、工作地址、电话 1、电话 2、手机、传真、邮编等基本内容。使用FlowLayout 布局管理器对界面进行管理。p实训4-3 在一个 BorderLayout 布局的东,西,南,北区域分别添加 4 个使用BoxLayout的容器,要求每个容器中有若干个组件,东,西区域的容器使用列式BoxLayout,南,北区域的容器使用行式BoxLayout。