1、第13章 Java Swing编程,Java Swing是 采用Java语言编写GUI(图形用户接口)程序的类库,它是轻量级的类库,所有Swing中的图形组件都是以大写字母“J”开头,如容器Jframe 、按钮Jbutton、文本区域JtextField等。 本节将首先介绍Swing中的容器,因为容器是放置组件的场所,所以一旦用户明白容器的创建后再使用,就可以方便地向容器添加组件了。在Swing编程中对事件的处理也是很重要的部分,用户图形接口是个交互性的平台,需要响应用户的输入或行为(如单击菜单打开一个窗口等)。在13.2节通过一个简单的例子追踪一个事件使读者对Swing的事件模型有感性的任何
2、和初步地理解。13.3节在本章占用了大部分篇幅,读者通过这部分的学习可以清楚的理解并掌握各种图形组件的功能和使用。13.4节的布局管理器是具有“Java”特色的功能,因为使用Java语言编写的程序具有跨平台的特性,所以要求可以依据不同的平台管理图形界面的组件管理。灵活使用布局管理器可以创建简洁、美观的用户界面。,13.1 Swing容器,容器是放置界面组件的地方,在Swing中提供了两个容器,一个是Jframe,它是一个最基本的窗口容器,一个是Jpanel,也称为面版,面版可以放置在Jframe容器或Applet上,使界面的布局更灵活。 常用的布局方式是首先设计几个JPanel面版,再将组件添
3、加到JPanel上,然后将JPanel按照布局要求再添加到JFrame上,当然这种嵌套关系可以进一步深入,如在JPanel上可以继续添加JPanel,只是一般的界面不会设计的这么复杂。其实界面一定要保持简洁、美观、功能齐全且布局规范,最好不要使用过于复杂的界面布局。下面首先介绍JFrame容器。,13.1.1 JFrame容器,JFrame是java.awt.Frame的扩展版本,是一个window子类,在使用Swing类库实现用户图形接口,必须继承该类。JFrame容器包括窗口标题、窗口外观、窗口边界、调整窗口大小的图标、关闭和最小化窗口的图标。并且可以直接在容器上添加组件,如按钮、文本等。
4、 该类的构造方法: public JFrame() throws HeadlessException。 创建了一个新的容器窗口,默认该窗口是不可见的。 public JFrame(String title) throws HeadlessException 创建一个新的容器窗口,通过方法的参数设置窗口标题,该窗口默认是不可见的。 该类的常用方法: public Container getContentPane() 该方法返回一个框架对象,使用该框架对象来添加组件,如增加按钮、菜单、工具栏、列表框等组件。 setSize(int width ,int hight) 设置窗口尺寸、窗口大小以像素为
5、单位计算。 show(),13.1.2 JPanel容器,JPanel容器是个通用容器,在该容器上可以放置其他组件如单选按钮、列表框等。还包含其他容器,如一个新的JPanel对象,从而方便地实现容器的嵌套。为设计灵活的用户界面提供方便。JPanel容器也称为面板,即英文Panel的直译。以后在用到JPanel的地方我们就统一称为面板。在面板创建后是无法单独显示的。必须放在JFrame或Applet这样的顶层窗口中才可以显示。该类的构造函数: JPanel():创建一个面板,并且该面板组件的布局管理器为FlowLayout()。 JPanel(LayoutManager layout):创建一个
6、面板,且该面板设置了指定的布局管理器。布局管理器管理在容器上放置的组件,具体的内容会在13.4节详细介绍。,13.2 Swing的事件模型,无论用户界面设计的如何美观别致,最重要的一点是知道这些组件能做什么,如单击一个“打开文件”按钮,我们希望打开的是文件对话框,而不希望程序没有任何响应。Java提供了事件模型,使Swing中出现的任何组件都会响应用户的某种动作,完成用户和程序的交互。这其实也是用户接口的基本功能。本节通过一个具体的例子,即制作一个按钮,但用户单击时,按钮上的文本标签会不断变化,记录用户单击按钮的次数。通过这个例子使读者知道组件是如何响应用户动作的,其间会涉及到其他知识点,会在
7、使用时一一简单介绍,但是这里的介绍不会喧宾夺主,使读者的精力集中在事件响应以及事件的处理上。,13.2.1 制作一个按钮,制作一个按钮很容易,只要创建一个JButton类对象即可。JButton类的构造函数有以下几个。 public JButton():创建不带文本也不带图标的按钮,或称为空按钮,通常这样的按钮需要调用其他方法来设置文本或图标。空按钮没有意义,用户不知道这样的组件有什么作用。 public JButton(Icon icon):创建带图标的按钮,图标对按钮的作用有一定的指导意义,如在制作工具栏时就是使用带图标的按钮实现的。如在word中的工具栏如图13.3所示。 public
8、JButton(String text):创建带文本的按钮,如我们在使用软件时经常遇到的“确认”按钮、“取消”按钮等。 public JButton(String text,Icon icon):创建带有文本且带有图标的按钮。 JButton自己拥有一个窗口,一旦屏幕更新如放大窗口时,JButton组件就会自动重绘。用户需要做的只是把这些按钮创建出来,并放在一个容器中。,13.2.2 实现按钮的事件监听,在13.2.1中创建了三个按钮,但是无论如何单击按钮,程序没有任何反应,所以此时必须要求自己编写事件处理代码来响应单击事件。用户单击按钮便引发一系列事件,这也正是GUI编程中事件驱动模型的内涵
9、。 在Swing中,每个组件都可对发生在其上的事件做出响应。例如,如果你需要知道鼠标在按钮上移动的事件,就需要注册与鼠标移动事件相关的信息,提供对该动作的处理代码。 这里还是通过为一个按钮注册事件监听机制使按钮组件可以响应用户的单击动作。此时需要为按钮注册一个事件监听器。可以通过调用JButton的addActionListener()方法实现,,13.2.3 Swing的事件模型,Swing事件模型的显著特点是引发事件的组件与处理事件的代码分开。在Swing中的任何组件都可以出发事件,事件类型多样,如按钮组件,有单击按钮、双击按钮、鼠标划过按钮等事件,这些事件都有相应的类与之对应。程序员需要
10、做的就是编写处理事件的类,创建监听器对象,并对组件注册监听器。 下表13.1是事件、监听器、添加监听器方法,以及支持这些事件的基本组件的总结。 通过该表读者可以发现每种Swing组件都支持某种或几种类型的事件。如果程序员需要在组件上实现监听某种行为,只要找出该行为对应的事件类型,并创建监听器类,为该组件注册监听器即可。,13.3 Swing组件,Swing提供了丰富的组件,这些组件的合理使用,可以方便地满足用户界面设计的需求,在创建组件时,需要选择组件的构造函数一完成特殊的需要。本节在讲解这些图形组件时,只选择最常用的一种构造函数,如果读者有特殊的需要可以查阅Java的HTML文档。,13.3
11、.1 按钮,在Swing中引入了不同类型的按钮,如单选按钮、复选框、菜单选项都继承了AbstractButton,本节将首先示范各种可用按钮。 这些按钮包括BasicArrowButton、JToggleButton、JCheckBoxButton和JRadioButton,如代码按钮示例所示。,13.3.2 图示(Icons),在13.2.1节,读者已经看到了图示的作用。实际上可以在JLabel、JButton、JCheckBox、JRadioButton等类中使用图示。本节将以按钮为例介绍如何使用图示。 制作图示第一需要创建一个ImageIcon对象,该类的构造函数的参数是图示文件(如im
12、age.gif)的路径(如d:imagesimage.gif)。在调用组件的setIcon()方法,该方法的参数为一个ImageIcon对象。这样程序就可以打开图形文件,在组件上显示图示文件了。代码按钮上的图示示例程序。,13.3.3 文本,文本组件为JTextField对象,在代码中已经使用过该组件,这里我们为该组件增加更多的监听功能。这里读者也可以再次复习按钮监听器的使用。代码文本块示例程序。,13.3.4 工具提示,读者可能有这样的经验,如操作Word时,当鼠标停留在工具栏上某个工具时,会弹出一个内含小方框,文字说明工具的作用。Swing中的几乎所有组件都是继承自JComponent,它
13、提供了一个setToolTipText(String str)方法,来创建工具提示。如一个JButton对象为jb,在该对象上创建工具提示如下所示。jb.setToolTipText(“保存文件”); Swing的其他组件也可以这样调用创建自己的“工具提示”。,13.3.4 工具提示,读者可能有这样的经验,如操作Word时,当鼠标停留在工具栏上某个工具时,会弹出一个内含小方框,文字说明工具的作用。Swing中的几乎所有组件都是继承自JComponent,它提供了一个setToolTipText(String str)方法,来创建工具提示。如一个JButton对象为jb,在该对象上创建工具提示如
14、下所示。jb.setToolTipText(“保存文件”); Swing的其他组件也可以这样调用创建自己的“工具提示”。,13.3.4 工具提示,读者可能有这样的经验,如操作Word时,当鼠标停留在工具栏上某个工具时,会弹出一个内含小方框,文字说明工具的作用。Swing中的几乎所有组件都是继承自JComponent,它提供了一个setToolTipText(String str)方法,来创建工具提示。如一个JButton对象为jb,在该对象上创建工具提示如下所示。jb.setToolTipText(“保存文件”); Swing的其他组件也可以这样调用创建自己的“工具提示”。,13.3.5 单选
15、按钮,在Swing中设计了单选按钮,其目的是只能在多种选择中选择一个。实现单选按钮很简单,只要创建一组JRadioButton,再把这些组件放到同一个ButtonGroup中就可以。在同一个容器中可以有多个ButtonGroup。其中JRadioButton的初始状态可以自由设置为false或true,这取决于程序的需要。但不能同时把多个JRadioButton设置为true。 JRadioButton 类的构造函数如下: public JRadioButton(String str):创建带有文本字符标识的单选按钮。 public JRadioButton(String str,boolea
16、n bl):创建带有文本字符标识的单选按钮,并且可以设置单选按钮的起始状态。,13.3.6 复选框,复选框是可以多选的一类图形组件,当选中该组件时,组件前端的方括号内打对勾标记,用户可以设置监听器,触发某种行为,代码复选框示例程序提供了完整的创建复选框的程序代码。,13.3.7 组合框,组合框的作用是使用户只能从供选择的元素中选出一个元素。Swing类库中的JComboBox类创建组合框。JComboBox只允许用户从列表中选择,不允许输入。 下面创建一个组合框,其中有一个按钮负责向组合框中添加元素,而一旦用户单击组合框中的元素,则在文本块中就显示该元素的内容,如果此时单击删除按钮则删除选中的
17、元素,示例代码为代码。,13.3.8 列表框,列表框也提供一些元素供选择,但是这些元素会有一部分显示在界面上,显示的元素数量可以事先设置,对列表中的元素可以多选也可以单选,选择方式和在Windows下选择文件的操作类似。创建列表框的关键代码如下所示。String drinking =“可口可乐“,“芬达“,“雪碧“,“果粒橙“,“鲜橙多“,“露露“,“果汁“;JList list = new JList(drinking);,13.3.9 消息框,在用户界面程序中把消息传递给用户,如用户操作失误、提示保存文件等。最常用的两类就是消息框和确认框。由两个静态类提供,即static JOptionP
18、ane.showMessageDialog()和 static JOptionPane.showConfirmDialog()。 本节介绍三种常用的对话框,分别是确认对话框、消息对话框和输入对话框与选择对话框。,13.3.10 菜单,菜单是图形用户接口的一个常用组件,菜单具有一定的意义,如在word中菜单名为“文件”,表示该菜单是和文件相关的操作,同时菜单每个菜单可以拥有子菜单,子菜单指明文件的一个具体操作,如“打开文件”、“保存文件”、“另存为”等文件操作。 在Swing中多个菜单可以放在菜单栏上。JFrame、JApplet和JDialog及其派生类都可以放置菜单组件,调用setJMenu
19、Bar()方法,通过传入参数JMenuBar对象创建菜单栏。通常将菜单JMenu增加到JMenuBar上,而子菜单JMenuItem添加到JMenu上,这样通过一步步的组装,最后在容器上创建了一个菜单组件。而JMenuItem组件可以设置ActionListener监听器,以触发子菜单被选中的事件。即:,13.3.11 页签式面板,页签式面板提供带有页签的对话框,使在一个窗口实现“多窗口”切换。一旦单击某个页签,则显示相应页签的对话框。创建页签式面板的语法是:JTabbedPane tab = new JTabbedPane();tab.add(“Java”,new JLabel(“Java”
20、); JTabbedPane类有多个addTab()方法,这里采用了其中一种,第一个参数是页签的标题,第二个参数是页签上放置的组件,如JLabel,当然可以是任意的组件。,13.3.12 弹出式菜单,弹出式菜单是通过JPopupMenu实现的。创建一个监听器只需要添加到需要弹出式菜单的组件上。代码给出一个弹出式菜单示例程序。,13.3.13 工具条,工具栏是读者熟悉的一种图形组件,向容器添加工具栏需要调用setToolBar()方法,该方法的参数为工具栏对象。基本步骤是先创建一个工具栏对象,然后向该对象添加图形组件。 JToolbar toolbar = new JToolBar(); too
21、lbar.add(Component com);,13.3.14 进度条,进度条是提示一种进程进度的指示工具,如程序在读取文件或正在保存大量的数据时,程序会停滞一段时间,此时可以采用进度条提示文件读取或存储数据的进度。代码提供了一个进度条的示例程序,该进度条与滑块结合,当滑动滑块时,进度条指示滑块的移动情况。,13.3.15 对话框,对话框是从主窗口中跳出的子窗口。用来处理特定的问题,如word中的文件菜单的“页面设置”子菜单完成对页面的大小、格式等的设置。但关闭这样的窗口时,只是关闭当前窗口而不会关闭整个主窗口。 实现对话框需要继承JDialog类,该类其实就是一种Window,有标题、最大
22、/小化图标等窗口元素。关闭对话框需要调用disopose()方法来释放对话框占用的资源。下面给出一个示例程序如代码所示。,13.3.16 文件对话框,打开文件和存储文件是图形化操作系统中文件操作的基本功能。Swing中使用JFileChooser来完成文件操作的接口。我们设计一个程序用来打开文件和保存文件。示例程序如代码所示。,13.3.17 边框,在Swing组件中都可以设置一个边框,使得组件看起来更美观,也可以提供当前组件如面板的内容信息。要设置边框需要调用JComponent的setBorder()。不同的边框使用不同的边框类来实现。 常用的边框类有TitledBorder、Etched
23、Border、LineBorder、MatteBorder和BevelBorder。下面通过一个例子来演示这些边框的创建使用,通过程序的运行结果可以直接看到不同的边框外观。,13.3.18 表模型,模型是Java中的一个抽象概念,就是通过某种模型来处理和显示数据,使程序员借助模型可以轻松地实现数据的合理显示,本节介绍默认表模型和自定义表模型。 1默认表模型 2自定义模型,13.3.19 树模型,JTree是Swing包中的重要组件,用于以层次关系表示的数据,如我们经常使用的文件系统的层次关系,Windows的文件浏览器是个很好的例子。如图所示。,13.4 控制面板布局管理器,布局管理器是管理组
24、件在面板上的摆放方式,本节介绍常用的几种布局管理器。即流布局管理器、边界布局管理器、网格布局管理器和盒子布局管理器。为了方便和直观,所有的示例程序都使用按钮作为组件,使用布局管理器管理这些组件在面板上的布局。,13.4.1 流布局管理器,流布局管理器将组件依次添加到容器中,组件在容器中按照从左到右、从上到下的顺序排列。 首先创建一个默认的流布局管理器,并在设置了该布局管理器的容器上添加组件,这里使用JButton组件。示例如代码所示。,13.4.2 边界布局管理器,边界布局管理器将整个容器分为5个区域,分别为东、西、南、北和中间。组件可以放置在指定的一个区域。 在BorderLayout类的定
25、义中这5个区域用5个常量值表示:EAST、WEST、SOUTH、NORTH和CENTER。假设容器为cp组件为jb。则将组件添加到容器上的方式为: BorderLayout bl = new BorderLayout(); Cp.add(jb,BorderLayout.CENTER);,13.4.3 网格布局管理器,网格布局管理器将整个容器平均划分成几个网格,按照先后顺序向网格内添加组件,每个网格的空间大小是平均分配的。创建网格布局管理器的方式是: GridLayout gl = new GridLayout(2,2),13.4.4 盒子布局管理器,BoxLayout使用户可以在水平方向和垂直
26、方向上控制组件的位置。假设容器为jp,设置该容器的盒子布局管理器的方式为: jp.setLayout(new BoxLayout(jp,BoxLayout.Y_AXIS); BoxLayout的构造函数要求把欲接受管理器控制的容器对象作为第一个参数,而第二个参数说明了组件的布局方向。,13.5 本章习题,(1)编写一个application程序,该程序中含有JButton组件和JTextField组件,当鼠标从JButton组件上滑过时,组件变换颜色。当组件获得焦点时,JButton组件上的文字显示在JTextField区域内。 (2)编写一个application程序,在程序中放入三个按钮,
27、分别是JRadioButto、JCheckBox和JButton,并放入一个JTextField区域,但单击按钮时,使组件上的信息显示在JTextField区域内。 (3)编写一个application程序,单击一个按钮打开文件对话框,并读取文件,使进度条显示读取文件的进度。是否使用进度条可以通过JCheckBox按钮来设置。读取的文件存储到另一个目录下,该目录由用户指定。,13.5 本章习题,(4)创建一个JTextArea文本区域,把该对象放入JScrollPane对象内,在JTextArea输入文字,观察滚动条的变化情况。对JScrollPane对象分别设置水平滚动和垂直滚动以再次在JTextArea文本区域输入文字,观察滚动条的变化情况。 (5)结合边界布局管理器和网格布局管理器在JFrame容器上,添加4个JPanel面板,在面板上放置4个按钮组件,JFrame容器使用边界布局管理器,而JPanel面板使用网格布局管理器。 (6)注意事项。 1在学习本章时,希望读者把书中的例子程序跑一遍,观察一下运行结果。在尝试书中的例子时,可以修改一些参数,这样就可以更深刻的理解函数地调用。 2对于Swing的事件模型,读者可以查看HTML文档以了解组件可以注册的具体事件模型。,