第5章 Java图形用户界面.doc_第1页
第5章 Java图形用户界面.doc_第2页
第5章 Java图形用户界面.doc_第3页
第5章 Java图形用户界面.doc_第4页
第5章 Java图形用户界面.doc_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 Java图形用户界面本章将用面向对象的编程方法来编写带图形用户界面的程序。图形用户界面(Graphical User Interface,GUI(读作goo-ee)为用户提供了一个直观、方便、快捷的图形化操作界面。借助Java中的菜单、输入区、按钮、对话框、窗口等标准界面元素可以创建个性化的图形用户界面,再加上鼠标、键盘等设备的操作,用户可以方便地向计算机系统发出指令,启动操作,并将系统运行的结果在同一个用户界面上显示出来。虽然现在有许多Java开发环境都能够自动或很方便地生成图形界面,但我们仍然有必要掌握Java的图形用户界面程序的基本原理。这包括:Java的图形用户界面程序有哪些基本组件类,这些类的层次关系是怎样的;在屏幕上如何摆放这些组件,怎样用这些基本的组件设计出专业的图形界面;这些组件如何响应用户的行为,也就是如何响应用户事件,即事件驱动原理。如果没有掌握这些基本内容,那么这方面的编程水平将停留在做“表面文章”上。 核心内容:1. Swing简介2. 图形用户界面与事件驱动的程序设计基础3. 布局管理器4. 事件处理机制5. Swing容器6. Swing基本组件7. Swing高级组件8. Java 图形绘制5.1 Swing简介应用程序的界面是人机之间的接口,早期的操作系统仅支持命令操作,对系统的任何操作都通过输入命令来执行,也没有鼠标可以点击,系统对用户的命令也是以文本形式反馈,这样的界面即为文本界面。图形用户界面中的图形是相对于文本界面而言的,实际上主要指的是窗体。用户可以借助图形化的菜单、按钮等加上鼠标的点击向系统发出操作命令,并将程序运行结果通过图形界面反馈给用户。如今的操作系统都是基于窗口操作并提供鼠标支持,微软的操作系统更是直接命名为视窗(Windows)。当前几乎所有的桌面应用程序(Desktop Application)和客户端服务器程序(Client/Server Application)的客户端都采用图形用户界面。每种操作系统都会提供窗体部件API(Application Programming Interface)以供系统自身调用显示和供程序开发人员创建GUI应用程序时调用。Java在图形用户界面编程方面提供了功能强大的工具包。在JDK1.0中,图形组件存放在抽象窗口工具集AWT(Abstract Window Toolkit)的库中。目标是希望构建一个通用的GUI,使利用它编写的程序能够运行在所有的平台上,以实现SUN公司提出的口号“一次编写,随处运行”(Write once, run anywhere)。考虑到跨平台的原因,AWT只提供了各个平台都支持的,构建GUI必需的一些基本组件,因此AWT包小而简单。由于AWT直接调用本地操作系统的图形构件来实现图形界面,使得用AWT构建的GUI往往在不同的操作系统平台上具有不同的风格,而且GUI的性能也受到了限制。例如,生成一个AWT的复选框会导致AWT直接调用下层本地程序来生成一个复选框。不幸的是,一个Windows平台上的复选框同Mac OS平台或者各种UNIX风格平台上的复选框并不是那么相同。其结果是一个AWT应用可能在Windows上表现很好,可是到了Mac OS上几乎不能使用,或者正好相反。这影响了Java程序的跨平台性。AWT最根本的缺点是在原生的用户界面之上仅提供了一个非常薄的抽象层。为了弥补这个不足,在JDK l.2中,Sun公司推出更加稳定、通用和灵活的用户界面组件库Swing。Swing是建立在AWT体系之上,完全用Java编写的一套轻量级的图形工具包。与AWT组件相比,Swing组件占用的资源较少,类比较小,不借助本地系统来绘制自身。Swing不仅重写了AWT的组件,还为这些组件增添了新的功能,并且提供了许多AWT没有的,创建复杂图形用户界面的组件,增强了GUI与Java程序的交互功能。大多数的Swing组件都直接使用Java代码绘制,能够保持外观风格的一致性,可以更少地依赖平台和更少地使用本地的GUI资源。Swing是AWT的扩展,它提供了许多新的图形界面组件。为了与AWT组件类相区别,Swing GUI组件类的开头都有前缀字母J。例如按钮组件在AWT中是Button类,而在Swing中为JButton类。除了有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本组件外,还增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。与AWT的部件不同,许多Swing组件如按钮、标签,除了使用文字外,还可以使用图标修饰自己。Swing组件被称为轻量组件(Lightweight Component),而依赖平台的AWT组件被称为重量组件(Heavyweight Component)。但是,Swing并没有代替AWT。在JDK l1中,AWT事件处理模型有了根本改变。Swing使用的仍然是Java 1的事件处理模型。Swing组件位于javax包中,AWT组件位于java包中。为了使用javax.swing和java.awt中的对象建立高效的图形用户界面,我们必须学习事件驱动的程序设计(Event-Driven Programming)的程序控制方式。事件在用户和GUI对象交互时产生。例如,当你移动光标,点击按钮或选择菜单时,事件就发生了。在事件驱动程序中,通过定义事件处理方法,使对象对这些事件做出相应。在这一章中,我们将学习事件驱动程序设计的基本方法。几乎所有基于GUI的现代应用软件都是事件驱动的,因此学好这种程序设计风格是非常重要的。因此本章的学习目的是学习最常用的GUI对象和事件驱动的程序设计,而不是详尽地介绍Swing类。对于提到的类,也不会讨论其所有方法。本章的目的是为读者打一个坚实的基础,让读者熟悉其中的基本概念。如果你需要更复杂的功能,只要深入研究,Swing几乎可以实现任何你想要的功能。5.2图形用户界面与事件驱动的程序设计基础5.2.1 Java图形用户界面的构成在Java中,GUI组成元素都放在java.awt和 javax.swing包内,它们都包含了大量的类。Java的图形用户界面(GUI)由组件(Component)和容器(Container)构成。1. 组件(Component)组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,是构成图形用户界面的基本单位,里面不再包含其他成分。例如,按钮(JButton/Button), 标签(JLabel/Label)和文本框(JTextField/TextField)等类。2. 容器(Container)容器也是组件,它的最主要的作用是装载其它组件。容器是若干个组件和容器的集合。Java提供了相应的容器类,例如,框架(JFrame/Frame),面板(JPanel/Panel)及滚动面板(JScrollPane/ScrollPane)等类。组件在容器中的位置和尺寸由布局管理器(Layout Manager)决定。3布局管理器(Layout Manager)为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器(LayoutManager)这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。常用的布局管理器有顺序布局管理器(FlowLayout),网格布局管理器(GridLayout),边界布局管理器(BorderLayout)等。4事件处理机制(Event Handling)事件处理机制是用来接收和处理事件的机制。通过事件处理机制能够让生成的图形用户界面动起来,通过监听和响应鼠标,键盘等设备所触发的事件来完成系统所需要的各项功能。Java采用委托事件处理模型来实现事件处理。5.2.2 Java图形用户界面的实现使用Swing创建图形用户界面的一般步骤:1. 选取组件:创建组件对象。2. 设计布局:将组件对象按照一定布局加入到容器中。3. 响应事件: 初始化组件对象,并对组件对象注册某事件监听器。Swing图形用户界面程序设计有两个关键的方面。一方面是GUI对象在框架的内容面板上的布局,在Swing中通过布局管理器(Layout Manager)来实现;另一方面是处理这些GUI对象产生的事件,通过事件处理机制来实现。本章5.3 和5.4 节将分别介绍Swing布局管理器和事件处理机制。5.2.3 Swing的类层次结构在javax.swing包中,定义了两种类型的组件:顶层容器(JFrame,JApplet,JDialog和JWindow)和轻量级组件。Swing组件都是AWT的Container类的直接子类和间接子类。swing包是Swing提供的最大包,它包含将近100个类和25个接口,几乎所有的Swing组件都在swing包中。图5-1 和5-2描述了Swing与AWT的关系以及Swing组件层次结构。由图5-1可以看出,除了使用Swing包中的容器和组件外,Swing仍然使用AWT包中的Font,Color,Graphics等类设置字体,颜色和绘图。图5-2则列出了所有的Swing轻量级组件。图5-1 Swing与AWT关系图图5-2 Swing组件层次图从图5-2可以看出,JComponent是所有Swing轻量组件的父类。JComponent是一个抽象类,用于定义所有子类组件的一般方法。Swing组件从功能上分可分为:1) 顶级容器:是放置其他 Swing 组件和容器的顶层容器。JFrame:框架窗体用于框架窗口的类,此窗口带有边框、标题、用于关闭和最小化窗口的图标等。通常用作Swing应用程序的主窗口。JDialog:对话框用作二级窗口。JApplet:Java小程序用于能够在浏览器中显示的Java类。2) 中间容器:必须放置在上层容器中,不能独立存在,但是可以容纳其他组件和容器。JPanel:面板 最灵活、最常用的中间容器。JScrollPane:滚动面板 与 JPanel 类似,但还可在大的组件或可扩展组件周围提供滚动条。JTabbedPane:选项板 包含多个组件,但一次只显示一个组件。用户可在组件之间方便地切换。JToolBar:工具栏 按行或列排列一组组件(通常是按钮)。JSplitPane:分隔窗格 包含用分割栏(divider)分隔开的两个组件。3) 特殊容器:在GUI上起特殊作用的中间层,如JInternalFrame,JLayeredPane,JRootPane。4) 基本控件:实现人际交互的组件,如Jbutton, JComboBox, JList, JMenu, JSlider, JTextField。5) 不可编辑信息的显示:向用户显示不可编辑信息的组件,例如JLabel, JProgressBar, ToolTip。6) 可编辑信息的显示:向用户显示能被编辑的格式化信息的组件,如JColorChooser, JFileChooser, JTable, JTextArea。5.2.4 使用Swing的基本规则:与AWT组件不同,Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(content pane)上。内容面板是顶层容器包含的一个Container类型的普通容器,它是一个轻量级组件。基本规则如下:(1)把Swing组件放入一个顶层Swing容器的内容面板上;(2)避免使用非Swing的重量级组件。以顶层容器JFrame为例,首先创建一个JFrame对象frame:JFrame frame = new JFrame();对frame添加组件有两种方式:1) 用getContentPane( )方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childComponent)2) 建立一个JPanel或 JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板:JPanel contentPane = new JPanel( );/把其它组件添加到JPanel中;frame.setContentPane(contentPane); /把contentPane对象设置成为frame的内容面板5.2.5 第一个Swing窗体应用程序例5-1 在Swing窗体中显示“Hello,Swing!”的信息。当点击窗体右上方的“X”图标时,关闭该窗体。1 import javax.swing.*;2 public class HelloSwing 3 public static void main(String args) 4 JFrame frame = new JFrame(HelloSwing);5 JLabel label = new JLabel(Hello,Swing!);6 frame.getContentPane().add(label);7 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);8 frame.setSize(300,200);9 frame.setVisible(true);10 11 程序运行效果如图5-3: 图5-3 第一个窗体应用程序程序分析:在该程序中,1)行1导入了Swing包,通常还需导入:import java.awt.*;import java.awt.event.*。2)行4设置一个顶级框架窗体容器JFrame对象frame。 3)行5创建一个Swing标签组件JLabel对象label。4)行6将标签组件label添加到容器frame的内容窗格中;注意:在Swing中,JFrame窗体中的组件不能直接添加到JFrame窗体对象中,需要通过调用JFrame窗体对象的getContentPane()方法获得该JFrame对象的内容窗格后,再调用内容窗格的add()方法将组件添加到内容窗格中。5)行7通过调用JFrame窗体对象frame的setDefaultCloseOperation()方法,实现了在单击框架窗体右上方的“X”按钮时,可以关闭窗口的功能。在这里setDefaultCloseOperation()的调用参数设置为JFrame的静态常量EXIT_ON_CLOSE,表示当点击“X”按钮时将使用 System.exit(0) 方法退出应用程序。其他参数还包括:HIDE_ON_CLOSE, DO_NOTHING_ON_CLOSE和DISPOSE_ON_CLOSE。其中,HIDE_ON_CLOSE是默认状态,表示当点击“X”按钮时,窗体将隐藏,但是应用系统并没有退出。 注意:如果使用的早期版本的平台,没有为窗体对象提供setDefaultCloseOperation()方法来关闭窗体。关闭窗口的功能则需要通过事件监听器实现。关于事件监听器详见本章5.4.3部分。 6)行8设置窗体frame的长为300像素点,高为200像素点。7)行9 setVisible()方法参数为true表示将显示该窗体对象。注意:JFrame窗体对象创建后默认是隐藏的。8)以上是一个简单的Swing窗体应用程序。所有构建窗体和组件以及对窗体和组件进行设置的代码都放置在应用程序的main()方法中。5.2.5 使用Swing创建窗体应用程序的实现步骤在例5-1中,我们使用Swing组件创建了一个简单的窗体,该窗体中只有一个标签组件。通常情况下,窗体中的组件更多,布局更复杂,并且需要对事件进行监听、响应和处理。将所有构建窗体和组件以及对窗体和组件进行设置的代码都放置在应用程序的main()方法中显然是不合适的。本章的其他示例将采用以下方法来创建窗体应用程序:1) 创建自定义窗体,继承JFrame类,并实现所需要的监听器接口(如果需要监听某一个或者多个事件);2) 将窗体中包含的控件组件,定义成自定义窗体类的私有成员变量;3) 在自定义窗体类的构造方法里设置窗体的布局管理器并初始化控件组件;4) 实现监听接口的方法;5) 在自定义窗体的main()方法中,创建自定义窗体的实例,并设置窗体的其他属性。5.3 布局管理器由于Java图形界面要考虑平台的适应性,因此,容器内元素的排列通常不采用直接通过坐标点确定部件位置的方式,而是采用特定的布局方式来安排部件。布局管理就是确定组件的尺寸和位置的过程。布局设计是通过为容器设置布局管理器来实现的。java.awt包中共定义了5种布局管理器,与之对应有5种布局策略: 顺序布局(FlowLayout)、边界布局(BorderLayout)、网格布局(GridLavout)、卡片布局(CardLayout)以及网格块布局(GridBagLayout)。这些布局管理器在Swing程序中能够继续使用,Swing还增加了BoxLayout(盒式布局),OverlayLayout(叠式布局)和SpringLayout(弹式布局)等布局方式。通过setLayout()方法可设置容器的布局方式。具体格式如下:public void setLayout(LayoutManager mgr) 如不进行设定,则各种容器采用默认的布局管理器,窗体容器默认采用BorderLayout,而面板容器默认采用FlowLayout。当我们在容器中添加组件时,组件在容器中位置会按照布局管理器所指定的位置来放置。如果需要改变默认的布局管理器,我们需要重新设置布局方式。设置一个容器的布局方式步骤如下:1)创建一个布局管理器对象,例如: BorderLayout b1 new BorderLayout();2)调用容器的setLayout()方法,例如 JPanel jp new JPanel(); jp.setLayout(b1); 通过上面两步,即将JPanel对象jp的布局管理器从默认的FlowLayout改变为BorderLayout。也可将上面两步合为一步: JPanel jp new JPanel();jp.setLayout(new BorderLayout(); 这样代码看上去更加简洁清晰。5.3.1 FlowLayout布局管理器 FlowLayout顺序布局管理器是JPanel和JApplet的缺省布局管理器,是最简单的布局。在这种布局管理器中,组件按照它们添加到容器中的次序从左到右,从上向下依次放置。如果容器宽度不够则从一个新行开始继续排列组件。当容器被重置大小后,布局管理器会按照上述的布局规则重新调整布局,组件的大小不变,组件间相对位置将发生变化。将组件添加到具有FlowLayout布局管理器的容器时,缺省情况下是居中放置,用户也可以在构造方法中设置自己需要的布局方式:1 FlowLayout() 使得容器中的组件居中放置,组件间水平间距和垂直间距都为5个像素 FlowLayout (int align) 可设置容器中组件的对齐方式,如左、右对齐,共有5种对齐方式:FlowLayout.LEFT,FlowLayout.RIGHT,FlowLayout.CENTER,FlowLayout.LEADING,FlowLayout.TRAILING。组件间水平间距和垂直间距都为5个像素。FlowLayout(int align, int hgap, int vgap) 可设置容器内组件的对齐方式和组件间水平与垂直间距。例5-2FlowLayout示例:下例创建了一个包含5个按钮的使用顺序布局的框架窗体应用程序。本例是参照本章5.2.5节的步骤实现的。1 import java.awt.*;2 import javax.swing.*;3 public class FlowWindow extends JFrame 4 public FlowWindow() 5 Container contentPane = getContentPane();6 contentPane.setLayout(new FlowLayout();7 contentPane.add(new JButton(Button 1);8 contentPane.add(new JButton(Button 2);9 contentPane.add(new JButton(Button 3);10 contentPane.add(new JButton(Button 4);11 contentPane.add(new JButton(Button 5);12 13 public static void main(String args) 14 FlowWindow win = new FlowWindow();15 win.setTitle(FlowLayout);16 win.pack();17 win.setVisible(true);18 win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);19 20 程序运行效果如图5-4:图5-4 FlowLayout运行效果图程序分析:在该程序中,1)行1,2导入了Java AWT和Swing包。2)行3声明了类FlowWindow,该类继承自JFrame类,表示该类是一个窗体类。由于在该类中没有事件处理代码,所以该类不需要实现任何事件监听器。3)行4-12是FlowWindow类的构造方法。在构造方法中,首先行5获得了该框架窗体的内容面板,然后行6设置布局管理器为顺序布局。注意:这里只能对内容面板设置布局管理器,而不能直接对框架窗体设置。行7-11分别向内容面板中添加了5个按钮。4)行13-19是该类的主方法。在main()方法中,创建了一个FlowWindow对象win,然后分别对win的标题和显示模式等属性进行设置。注意:框架窗体的pack()方法表示框架窗体将设定一个适当的大小,以便能够以“紧缩”的形式包容各个组件。当使用pack()方法时,就不需要调用setSize()的方法来设置大小了。因此如图5-4所示,win窗体在一行中容纳5个按钮,窗体中没有其它多余的空间。在如图5-4的情况下, 如果对框架窗体进行缩小的鼠标操作,5个按钮大小保持不变,按钮的位置会相应地调整,如图5-5所示。如果进一步缩小,可出现如图5-6所示的情况。可以看出,该窗体采用的是默认居中的顺序布局方式。 图5-5 框架的宽度被缩小图5-6框架的宽度进一步被缩小5.3.2 BorderLayout布局管理器BorderLayout布局管理器是JFrame和JDialog的缺省布局管理器。采用布局管理器的容器将划分为五个区域:North、South、West、East和Center,它们分别代表上北、下南、左西、右东和居中五个区域,如图5-7所示。图5-7 BorderLayout区域划分 当拉伸使用BorderLayout布局管理器的容器,各组件相对位置不变,组件尺寸发生变化:East和west位置的组件宽度不变,高度改变,而South和North位置的组件高度不变,宽度改变。 倘若上面5个区域中有些区域没有被设置,组件会自动地扩展,遵循的原则是“边上没有中间补,中间没有则空”。也就是说5个区域中如果缺少East或west区域,会用Center位置上放置的组件进行延伸填充;如果缺少South或North,East, west和Center位置上放置的组件会共同延伸进行填充;若缺少Center部分,该区域就空着。 BorderLayout的构造方法如下:1 BorderLayout()使用默认设置所包含的组件间没有距离;2 BorderLayout(int hgap,int vgap) 可设置容器中各组件的水平与垂直间距; 使用BorderLayout布局管理器时,在添加组件时需指明添加的位置,否则就不能显示该组件,可以用BorderLayout的5个static的成员EAST、WEST、SOUTH、NORTH和CENTER表示五个区域。从JDKl.4开始,北、南、西、东四个区有了新名字,分别是页首(PAGESTART)、页尾(PAGEEND)、行首(LINESTART)、行尾(LINEEND)。例5-3BorderLayout示例: 本例将例5-2改写成BorderLayout布局方式。1 import java.awt.*;2 import javax.swing.*;3 public class BorderWindow extends JFrame 4 public BorderWindow() 5 Container contentPane = getContentPane();6 contentPane.setLayout(new BorderLayout();7 contentPane.add(new JButton(Button 1(NORTH),BorderLayout.NORTH);8 contentPane.add(new JButton(Button 2(CENTER),BorderLayout.CENTER);9 contentPane.add(new JButton(Button 3(WEST),BorderLayout.WEST);10 contentPane.add(new JButton(Button 4(SOUTH),BorderLayout.SOUTH);11 contentPane.add(new JButton(Button 5(EAST),BorderLayout.EAST);12 13 public static void main(String args) 14 BorderWindow win = new BorderWindow();15 win.setTitle(BorderLayout);16 win.pack();17 win.setVisible(true);18 win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);19 20 程序运行效果如图5-8:图5-8 BorderLayout运行效果图程序分析:在该程序中,行6设置该框架窗体的布局为BorderLayout。并在行7-11中,将5个按钮分别放置到NORTH,CENTER, WEST, SOUTH和EAST五个区域中。注意:这里add()方法的第2个参数用于设置组件在边界布局中的方位。读者思考:该程序中行6可以不要。为什么?5.3.3 GridLayout布局管理器 Grid在英文中是格子的意思。GridLayout布局管理器将容器划分为网格,在使用GridLayout布局管理器的容器中添加组件时,其顺序为从网格左上角开始,从左至右排满一行后,再从下一行开始,依次下去。当改变容器大小时与FlowLayout相反,组件相对位置不变,而组件大小随之改变。 GridLayout的构造方法如下:1 GridLayout() 使用默认设置,所有组件位于一行中,各占一列。2 GridLayout(int rows, int co1s) 通过参数指定布局的行数和列数,0代表不限。3 GridLayout(int rows, int cols, int hgap, int vgap) 通过参数指定布局的行数、列数及组件间水平与垂直间距。注意:每个网格中都必须填入组件,如果希望某个网格为空白,可以为它加入一个空的标签: add (new Label();例5-4GridLayout示例: 本例将例5-2改写成GridLayout布局方式。1 import java.awt.*;2 import javax.swing.*;3 public class GridWindow extends JFrame 4 public GridWindow() 5 Container contentPane = getContentPane();6 contentPane.setLayout(new GridLayout(3,2);7 contentPane.add(new JButton(Button 1);8 contentPane.add(new JButton(Button 2);9 contentPane.add(new JButton(Button 3);10 contentPane.add(new JButton(Button 4);11 contentPane.add(new JButton(Button 5);12 13 public static void main(String args) 14 GridWindow win = new GridWindow();15 win.setTitle(GridLayout);16 win.pack();17 win.setVisible(true);18 win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);19 20 程序运行效果如图5-9:图5-9 GridLayout运行效果图程序分析:在该程序中,行6设置该框架窗体的布局为3x2的网格布局。并在行7-11中,将5个按钮按照从上到下,从左到右的次序分别放置到网格中。进一步的思考:如果窗体中的组件很多,不需要事先决定网格的行数,可以用0来表示。行6也可以写成:contentPane.setLayout(new GridLayout(0,2);5.3.4 CardLayout布局管理器 CardLayout是一种卡片式布局,它将容器中的组件处理成一组卡片。这组卡片在同一容器区域内重叠放置,每一时刻只显示一张卡片,通过用户操作或者自动处理,可以在卡片间进行切换。使用CardLayout布局管理器的first(), last(), next(), previous()和show()方法均可使卡片成为可见的。每张卡片又可以有自己的布局管理。 CardLayout的构造方法如下:1 CardLayout() 创建CardLayout类的对象。 2 CardLayout(int hgap,int vgap) 创建CardLayout类的对象,并设置水平间距为hgap,垂直间距为vgap。例5-5CardLayout示例: 下例创建了一个包含5张卡片的使用卡片式布局的框架窗体应用程序。1 import java.awt.*;2 import javax.swing.*;3 public class CardWindow 4 public static void main(String args) 5 JFrame f = new JFrame(CardLayout);6 CardLayout card = new CardLayout();7 Container contentPane = f.getContentPane();8 contentPane.setLayout(card);9 JButton buttonl = new JButton(Card 1);10 JButton button2 = new JButton(Card 2);11 JButton button3 = new JButton(Card 3);12 JButton button4 = new JButton(Card 4);13 JButton button5 = new JButton(Card 5);14 contentPane.add(buttonl, Card 1);15 contentPane.add(button2, Card 2);16 contentPane.add(button3, Card 3);17 contentPane.add(button4, Card 4);18 contentPane.add(button5, Card 5);19 f.pack();20 f.setVisible(true);21 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);22 while (true) 23 try 24 Thread.sleep(1000);25 26 catch(Exception e)27 28 card.next(contentPane);29 30 31 程序运行效果为:窗体中显示的内容在五个按钮间每隔一秒变换一次,程序中Thread.sleep(1000)功能就是令当前线程暂停1000毫秒。程序说明:该窗体中包含5张卡片,每张卡片中包含一个按钮。行6-8将窗体的布局设置为CardLayout。行9-13创建了5个JButton对象,行14-18将5个按钮对象分别定义为一张卡片,添加到窗体的内容面板中。这里add()的第2个参数表示卡片的名称,如button5命名为“Card 5”。行22-29是一个无限while循环,在行28中调用了CardLayout对象的next()方法来获取下一张卡片。Thread.sleep(1000)功能就是调用Thread(线程)类的静态方法sleep,令当前线程休眠(暂停)1000毫秒。因为sleep方法可能抛出异常,所以这里用到了异常处理代码(异常处理将在下章讲到)。所以最后运行的结果就是五个按钮每隔一秒轮流出现。进一步的思考:如果需要显示button5所在的卡片,可以使用show()方法。代码如下:card.show(contentPane ,“Card 5”);5.3.5 GridBagLayout布局管理器GridBagLayout布局管理器是AWT中最复杂、最灵活的同时功能也是最强大的一种布局管理器。使用这种布局要配置大量的参数,工作起来非常复杂,但是几乎可以完全地控制容器的布局方式。这布局主要给开发IDE工具的编程人员使用,以实现组件的拖放功能和代码自动生成。作者并不建议初学者深入研究。GridBagLayout同GridLayout一样,在容器中以网格形式来管理组件.但GridBagLayout功能要来得强大得多:1. GridBagLayout管理的所有行和列都可以是大小不同的。2. GridLayout把每个组件限制到一个单元格,而GridLayout并不这样:组件在容器中可以占据任意大小的矩形区域。 GridBagLayout通常由一个专用类来对布局行为进行约束,该类叫GridBagConstraints.其中的所有成员都是public的, 因此要学习如何使用GridBagLayout首先要了解有那些约束变量,以及如何设置这些约束变量。以下是GridBagConstraints的公有成员变量:public int anchorpublic int fillpublic int gridheightpublic int gridweightpublic int girdxpublic int gridypublic Insets insetspublic int ipadxpublic int ipadypublic double weightxpublic double weighty看起来有很多约束需要进行设置,但事实上许多约束只需设置一次,并对多个组件重用,每次添加组件时只有少数的项需要修改。其中:1)gridx, gridy 这两个属性是用来描述组件在布局时应处于哪个网格位置,即描述网格开始的位置,gridwidth,gridheigh这两个属性用来描述组件在布局中的所占的网格的个数,gridwidth描述了该组件在横向上所占网格的个数,gridheight描述了该组件在纵向上所占网格的个数。也可以通过GridBagConstraints类的常量RELETIVE,和REMAINDER来进行指定,它的用法是:当把gridx值设置为GridBagConstriants.RELETIVE,在添加一个组件时,将被放置在前一个组件的右侧。同理,对gridy 值设置为GridBagConstraints.RELETIVE时,在添加组件时,将被放置在前一个组件的下方,(这是一种根据前一个组件而决定当前组件的相对放置方式)。对gridweight和gridheight也可以应用GridBagConstraints的REMAINDER方式,创建的组件会从创建的起点位置 开始一直延伸到容器所能允许的限度为止。该功能使得你可以创建跨越某些行或列的组件,从而改变相应方向上组件的数目,即使其后在布局的其他地方添加额外的组件也是如此。2)通过设置Insets属性可以调整组件周围的空间大小。3)weightx和weighty属性用来控制在容器变形时,单元格本身如何缩放。这两个属性都是浮点数值,描述了每个单元格在拉伸时横向或纵向得到的分配比例。下面是一个具有简单约束的GridBagLayout示例:例5-6GridBagLayout示例。该窗体中包含三个按钮和一个文本框。1 import java.awt.*;2 import javax.swing.*;3 4 public class GridBagWindow extends JPanel 5 public GridBagWindow() 6 this.setLayout(new GridBagLayout();7 this.setOpaque(true);8 GridBagConstraints c = new GridBagConstraints();9 JButton b = new JButton(One);10 c.gridx = 0 ;11 c.gridy = 0;12 c.gridwidth = 2;13 c.gridheight = 1;14 this.add(b,c);/button 1 added15 c.gridy+;16 b= new JButton(Two);17 this.add(b,c);18 19 c.gridx = 2;20 c.gridy = 0;21 c.gridwidth = 2;22 c.gridheight = 2;23 b = new JButton(Three);24 this.add(b,c);25 26 c.gridx = 0 ;27 c.gridy = 2;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论