《Java程序设计与应用开发》第6章GUI编程.ppt





《《Java程序设计与应用开发》第6章GUI编程.ppt》由会员分享,可在线阅读,更多相关《《Java程序设计与应用开发》第6章GUI编程.ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第6章 GUI编程 现代的用户倾向于使用可以由鼠标方便操作的图形用户界面(GUI-Graphical User Interface)程序。本章的内容就是介绍如何使用JFC(Java Foundation Class)中的Swing组件(Component)来构建GUI应用程序。6.1 Swing起步-Swing概述 l在Java1.0中,已经有一个用于GUI编程的类库AWT(Abstract Window Toolkit),称之为抽象窗口工具箱。遗憾的是,AWT中的组件(例如按钮,类名为Button)在实现中使用了本地代码(Native Code),这些组件的创建和行为是由应用程序所在平台上的
2、本地GUI工具来处理的。因此,AWT组件要在不同的平台上提供给用户一致的行为就受到了很大的限制。同时,AWT组件中还存在很多bug,这就使得使用AWT来开发跨平台的GUI应用程序困难重重。l1996年,SUN公司和Netsacpe公司在一个称为Swing的项目中合作完善了Netsacpe公司原来开发的一套GUI库,也就是现在所谓的Swing组件。Swing组件和原来的AWT组件完全不同,最大的区别就是Swing组件的实现中没有使用本地代码,这样对底层平台的依赖型就大为降低,并且可以给不同平台的用户一致的感觉。此外,和原来的AWT相比,Swing中提供了内容更多、使用更为方便的组件。l读者在阅读
3、一些书籍时,常会遇到名词JFC(Java Foundation Class)。JFC的概念是在1997年的JavaOne开发者大会上首次提出的,是指用于构建GUI的一组API。实际上,Swing只是JFC的一部分,其它的还有二维图形(Java 2D)API以及拖放(Drag and Drop)API等等。Swing概述-续l在GUI编程中,使用什么样的GUI组件固然很重要,但是采用什么事件处理模型同样也很重要。Java 1.0中,AWT的事件处理模型是很不完善的。Java 1.1中使用新的AWT事件处理模型,在此之后,未作变动。在编写本书时,使用的仍旧是1.1的事件处理模型。lSwing并不是
4、完全取代了AWT,Swing只是使用更好的GUI组件(如JButton)代替AWT中相应的GUI组件(如Button),并且增加了一些AWT中原来所没有的GUI组件。并且,Swing仍使用AWT 1.1的事件处理模型。l虽然现在AWT组件仍得到支持,但是建议在你的应用程序中尽量使用Swing组件和1.1的事件模型。6.1.2 一个GUI实例 下面的这个应用程序很简单,只是在屏幕上显示一个框架组件(JFrame):import javax.swing.*;public class FirstGUI public static void main(String args)JFrame f=new
5、JFrame();/创建一个框架对象f f.setTitle(FirstFrame);/设定框架的标题 f.setSize(250,100);/设定框架的大小 f.show();/显示框架 GUI实例续Swing中的组件是“轻量级”(lightweight)组件,并且每个组件都可以是一个容器。可以向任何一个组件中添加其它的组件,但是顶层容器类型的组件不能添加到任何其它组件中。此外,任何一个Swing组件要想在屏幕上显示出来,最终都必须由一个顶层容器来容纳。Swing中组件的类名通常以J开头(如JFrame),以区别于AWT中相应的组件(如Frame)。Swing位于包javax.swing中,
6、javax是java extension的缩写形式,表示Swing包是java的一个扩展包。6.1.3 面板 JPanel 是常用的Swing组件之一。JPanel本身也是一个容器,可以向其中添加其它GUI组件(如按钮JButton);但是JPanel不是顶层容器,因此,要在屏幕上显示JPanel,必须将它添加到一个顶层容器(如JFrame)中。JPanel还具备在自身表面绘制图形的功能,可以通过定制的方式在面板表面绘制各种图形。Swing中允许组件嵌套添加,例如:可以将一个JButton添加到一个JPanel中,再将JPanel添加到JFrame中。在构建复杂的用户界面时,常常需要使用这种嵌
7、套添加的方式。Swing中还允许将一个组件添加到同类型的组件中,例如:可以将一个JPanel添加到另一个JPanel中去。6.1.3.1作为容器 import javax.swing.*;import java.awt.*;public class FirstPanel public static void main(String args)JLabel labOne=new JLabel(这是标签);JTextField txtOne=new JTextField(这是文本框);JPanel p=new JPanel();/生成面板对象 /将标签和文本框添加到面板容器中 p.add(labO
8、ne);p.add(txtOne);/给面板增加一个边框 /Border border=BorderFactory.createEtchedBorder();/p.setBorder(border);JFrame f=new JFrame();/创建一个框架对象f f.setSize(300,300);/设定框架的大小 /取得框架的内容窗格 Container contentPane=f.getContentPane();/将面板添加到框架的内容窗格中 contentPane.add(p);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.s
9、how();/显示框架 分为两步:(1)将一个标签和一个文本框添加到面板中。(2)再将面板添加到框架中,然后显示框架。6.1.3.2表面重绘lpaintComponent(Graphics g)方法。lrepaint()方法。l在覆盖组件的paintComponent(Graphics g)方法时,记得首先调用super.paintComponent(g)。6.1.4 改变应用程序的观感 lUIManager.setLookAndFeel(String lnfName)方法。lSwingUtilities.updateComponentTreeUI()方法。例如,要设定Windows的观感:t
10、ryString lnfName=com.sun.java.swing.plaf.windows.WindowsLookAndFeel;UIManager.setLookAndFeel(lnfName);catch(Exception e)e.printStackTrace();6.2 AWT事件处理 6.2.1事件处理简介 用户对应用程序进行操作时会产生事件(Event),事件源的事件发生后,可以被传递给任何对象,前提是该对象实现(implements)了适当的接口并且注册到该事件源。例如,可以给按钮的动作事件(ActionEvent)注册(Register)一个动作事件侦听器(Action
11、Listener);任何一个实现了ActionListener接口的类所生成的对象都可以注册成为按钮的动作事件侦听器。这样,当按钮的动作事件发生时,动作事件就会传递给已注册的所有侦听器。给事件源注册事件侦听器,使用该事件源中的addXXXListener(aListener)方法。依据事件类型的不同,注册的方法名也不同。例如给按钮注册一个动作事件侦听器:aButton.addActionListener(aActionListener);而给框架注册一个窗口事件侦听器:aFrame.addWindowListener(aWindowListener);一个事件源可以注册多个侦听器,一个侦听器也
12、可以被注册到多个事件源。6.2.2事件处理实例 该程序提供了一个按钮,点击该按钮可以使得应用程序在Windows和Metal观感之间进行切换,源代码见例6.2.1,图6.2.1显示了运行过程中两种不同的观感。在例6.2.1中,内部类LookAndFeelListener实现了动作事件侦听接口ActionListener。接口ActionListener只有一个需要实现的方法public void actionPerformed(ActionEvent e)。在类ActionFrame中,使用语句:ActionListener al=new LookAndFeelListener();创建了对象
13、al,由于内部类LookAndFeelListener实现了接口ActionListener,因此对象al可以被注册到动作事件源btnLookAndFeel:btnLookAndFeel.addActionListener(al);这样,当事件源btnLookAndFeel发生动作事件时,就会调用侦听器al对象中的actionPerformed(ActionEvent e)方法,并且所发生的动作事件以一个ActionEvent类型的对象传递进来。事件处理实例续l不仅是JButton类型的事件源能产生动作事件(ActionEvent),也有其它类型的事件源可以产生动作事件。例如点击菜单(JMen
14、uItem)选项、双击列表框中(JList)的选项以及在文本输入框(JTextField、JPasswordField)中按下回车键等,也会产生动作事件。l本小节介绍了三种(独立的类、内部类以及匿名内部类,具体内容参见教材)方式来注册事件侦听器,希望读者都能够掌握。因为,这三种方式都可能在别的程序员编写的程序中出现,而你很可能需要阅读这样的程序。6.2.3使用事件适配器 前面我们已经知道,在缺省情形下,关闭框架(JFrame)只是使之隐藏。可以通过 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);使得在关闭框架时应用程序退出。由于在关闭框架时,
15、会发生一个窗口事件(WindowEvent),因此也可以通过捕获该事件,然后让应用程序退出。任何实现了WindowListener接 口 的 类 所 生 成 的 对 象 均 可 以 注 册 到 窗 口 事 件 源。由 于WindowListener接口中包含了如下的七个方法:public interface WindowListenervoid windowActivated(WindowEvent e);void windowClosed(WindowEvent e);void windowClosing(WindowEvent e);void windowDeactivated(Windo
16、wEvent e);void windowDeiconified(WindowEvent e);void windowIconified(WindowEvent e);使用事件适配器续 因此,一个类要实现WindowListener接口,就必须实现该接口中的所有七个方法。例如,可以按如下方式定义一个WindowExit类,并且实现WindowListener接口:class WindowExit implements WindowListener public void windowActivated(WindowEvent e)public void windowClosed(WindowE
17、vent e)public void windowClosing(WindowEvent e)System.exit(0);/强制应用程序退出 public void windowDeactivated(WindowEvent e)public void windowDeiconified(WindowEvent e)public void windowIconified(WindowEvent e);public void windowOpened(WindowEvent e)然后就可以将WindowExit生成的对象注册为窗口事件侦听器:JFrame f=new JFrame();Wind
18、owListener wl=new WindowExit();f.addWindowListener(wl);使用事件适配器续然而,在很多时候我们只对其中某个或是某几个方法感兴趣,例如在本例中,就只对其中的windowClosing(WindowEvent e)方法感兴趣,如果像上面一样直接定义一个类去实现WindowListener接口,对那些不感兴趣的方法也必须实现。尽管只是用空方法去实现那些不感兴趣的方法,这也是一件麻烦的事情。AWT事件模型中使用适配器(Adapter)类来帮助程序员做这件事情:对于那些具有不止一个方法的事件侦听接口(例如WindowListener),都提供了一个用空
19、方法实现接口中全部方法的适配器类(例如WindowAdapter)。这样当程序员只需要继承适配器类,然后覆盖自己感兴趣的方法即可,而不用再去实现接口中所有方法。例如,上面的WindowExit类可以按如下方式来定义:class WindowExit extends WindowAdapter public void windowClosing(WindowEvent e)System.exit(0);/强制应用程序退出 然后使用和前面类似的方式,将WindowExit生成的对象注册为窗口事件侦听器:JFrame f=new JFrame();WindowListener wl=new Wind
20、owExit();f.addWindowListener(wl);这样,就大大减少了程序员的编码工作量。6.2.4 AWT事件继承关系 AWT事件模型中事件类的继承关系 AWT事件模型中提供的侦听器接口及对应的适配器类 侦听器接口适配器类ActionListener无AdjustmentListener无ComponentListenerComponentAdapterContainerListenerContainerAdapterFocusListenerFocusAdapterItemListener无KeyListenerKeyAdapterMouseListenerMouseAdap
21、terMouseMotionListenerMouseMotionAdapterMouseWheelListener无TextListener无WindowListenerWindowAdapterWindowFocusListener无WindowStateListener无6.3布局管理 l在Java中,GUI组件在容器中的布局是由容器的布局管理器(Layout Manager)来决定的。每个容器都具有一个缺省的布局管理器。程序设计人员可以方便地改变容器的布局管理器。例如面板的缺省布局管理器是流布局管理器(FlowLayout),内容窗格的缺省布局管理器是边框布局管理器(BorderLay
22、out)。如果面板或是内容窗格的缺省布局管理器不能满足要求,可以调用这两种容器的setLayout(aNewLayout)方法来改变其布局管理器,方法setLayout()的参数是一个布局管理器对象。6.3.1 流式布局 l例6.3.1使用类似方法向一个面板中添加三个按钮,图6.3.1是程序的运行结果。可以发现,这三个按钮是按照被添加到面板中的顺序排列在一行上的。如果将框架的宽度缩小,可以发现三个按钮将排列成两行,如图6.3.2所示。由此可知:使用FlowLayout布局时,GUI组件将按照添加入容器的顺序自左而右排列在一行上,如果一行排不下,另起一行;也就是说组件是按照自左而右、自上而下的顺
23、序进行排列的。lFlowLayout 类提供了三种构建器public FlowLayout()、public FlowLayout(int alignment)和public FlowLayout(int alignment,int horizontalGap,int verticalGap)。alignment参数可以取值FlowLayout.LEFT、FlowLayout.CENTER或是FlowLayout.RIGHT,用于指定组件在一行上的对齐方式。horizontalGap和verticalGap分别表示组件在水平和垂直方向上的间距(以像素为单位)。缺省情况下,alignment取值
24、为FlowLayout.CENTER,horizontalGap和verticalGap均取值为5。6.3.2 边框布局 使用了边框(BorderLayout)布局的容器均提供5个位置用于存放组件,分别是North、South、East、West以及Center,如图所示:下面的语句将一个按钮添加到内容窗格中:contentPane.add(new JButton(North),BorderLayout.NORTH);例子:import javax.swing.*;import java.awt.*;public class BorderLayoutExample public static
25、void main(String args)JFrame f=new JFrame();Container contentPane=f.getContentPane();contentPane.add(new JButton(North),BorderLayout.NORTH);contentPane.add(new JButton(South),BorderLayout.SOUTH);contentPane.add(new JButton(West),BorderLayout.WEST);contentPane.add(new JButton(East),BorderLayout.EAST)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java程序设计与应用开发 Java 程序设计 应用 开发 GUI 编程

限制150内