第13章JavaSwing编程•JavaSwing是采用Java语言编写GUI(图形用户接口)程序的类库,它是轻量级的类库,所有Swing中的图形组件都是以大写字母“J”开头,如容器Jframe、按钮Jbutton、文本区域JtextField等。•本节将首先介绍Swing中的容器,因为容器是放置组件的场所,所以一旦用户明白容器的创建后再使用,就可以方便地向容器添加组件了。在Swing编程中对事件的处理也是很重要的部分,用户图形接口是个交互性的平台,需要响应用户的输入或行为(如单击菜单打开一个窗口等)。在13.2节通过一个简单的例子追踪一个事件使读者对Swing的事件模型有感性的任何和初步地理解。13.3节在本章占用了大部分篇幅,读者通过这部分的学习可以清楚的理解并掌握各种图形组件的功能和使用。13.4节的布局管理器是具有“Java”特色的功能,因为使用Java语言编写的程序具有跨平台的特性,所以要求可以依据不同的平台管理图形界面的组件管理。灵活使用布局管理器可以创建简洁、美观的用户界面。13.1Swing容器•容器是放置界面组件的地方,在Swing中提供了两个容器,一个是Jframe,它是一个最基本的窗口容器,一个是Jpanel,也称为面版,面版可以放置在Jframe容器或Applet上,使界面的布局更灵活。•常用的布局方式是首先设计几个JPanel面版,再将组件添加到JPanel上,然后将JPanel按照布局要求再添加到JFrame上,当然这种嵌套关系可以进一步深入,如在JPanel上可以继续添加JPanel,只是一般的界面不会设计的这么复杂。其实界面一定要保持简洁、美观、功能齐全且布局规范,最好不要使用过于复杂的界面布局。下面首先介绍JFrame容器。13.1.1JFrame容器•JFrame是java.awt.Frame的扩展版本,是一个window子类,在使用Swing类库实现用户图形接口,必须继承该类。JFrame容器包括窗口标题、窗口外观、窗口边界、调整窗口大小的图标、关闭和最小化窗口的图标。并且可以直接在容器上添加组件,如按钮、文本等。•该类的构造方法:•publicJFrame()throwsHeadlessException。•创建了一个新的容器窗口,默认该窗口是不可见的。•publicJFrame(Stringtitle)throwsHeadlessException•创建一个新的容器窗口,通过方法的参数设置窗口标题,该窗口默认是不可见的。•该类的常用方法:•publicContainergetContentPane()•该方法返回一个框架对象,使用该框架对象来添加组件,如增加按钮、菜单、工具栏、列表框等组件。•setSize(intwidth,inthight)•设置窗口尺寸、窗口大小以像素为单位计算。•show()13.1.2JPanel容器•JPanel容器是个通用容器,在该容器上可以放置其他组件如单选按钮、列表框等。还包含其他容器,如一个新的JPanel对象,从而方便地实现容器的嵌套。为设计灵活的用户界面提供方便。JPanel容器也称为面板,即英文Panel的直译。以后在用到JPanel的地方我们就统一称为面板。在面板创建后是无法单独显示的。必须放在JFrame或Applet这样的顶层窗口中才可以显示。该类的构造函数:•JPanel():创建一个面板,并且该面板组件的布局管理器为FlowLayout()。•JPanel(LayoutManagerlayout):创建一个面板,且该面板设置了指定的布局管理器。布局管理器管理在容器上放置的组件,具体的内容会在13.4节详细介绍。13.2Swing的事件模型•无论用户界面设计的如何美观别致,最重要的一点是知道这些组件能做什么,如单击一个“打开文件”按钮,我们希望打开的是文件对话框,而不希望程序没有任何响应。Java提供了事件模型,使Swing中出现的任何组件都会响应用户的某种动作,完成用户和程序的交互。这其实也是用户接口的基本功能。本节通过一个具体的例子,即制作一个按钮,但用户单击时,按钮上的文本标签会不断变化,记录用户单击按钮的次数。通过这个例子使读者知道组件是如何响应用户动作的,其间会涉及到其他知识点,会在使用时一一简单介绍,但是这里的介绍不会喧宾夺主,使读者的精力集中在事件响应以及事件的处理上。13.2.1制作一个按钮•制作一个按钮很容易,只要创建一个JButton类对象即可。JButton类的构造函数有以下几个。•publicJButton():创建不带文本也不带图标的按钮,或称为空按钮,通常这样的按钮需要调用其他方法来设置文本或图标。空按钮没有意义,用户不知道这样的组件有什么作用。•publicJButton(Iconicon):创建带图标的按钮,图标对按钮的作用有一定的指导意义,如在制作工具栏时就是使用带图标的按钮实现的。如在word中的工具栏如图13.3所示。•publicJButton(Stringtext):创建带文本的按钮,如我们在使用软件时经常遇到的“确认”按钮、“取消”按钮等。•publicJButton(Stringtext,Iconicon):创建带有文本且带有图标的按钮。•JButton自己拥有一个窗口,一旦屏幕更新如放大窗口时,JButton组件就会自动重绘。用户需要做的只是把这些按钮创建出来,并放在一个容器中。13.2.2实现按钮的事件监听•在13.2.1中创建了三个按钮,但是无论如何单击按钮,程序没有任何反应,所以此时必须要求自己编写事件处理代码来响应单击事件。用户单击按钮便引发一系列事件,这也正是GUI编程中事件驱动模型的内涵。•在Swing中,每个组件都可对发生在其上的事件做出响应。例如,如果你需要知道鼠标在按钮上移动的事件,就需要注册与鼠标移动事件相关的信息,提供对该动作的处理代码。•这里还是通过为一个按钮注册事件监听机制使按钮组件可以响应用户的单击动作。此时需要为按钮注册一个事件监听器。可以通过调用JButton的addActionListener()方法实现,13.2.3Swing的事件模型•Swing事件模型的显著特点是引发事件的组件与处理事件的代码分开。在Swing中的任何组件都可以出发事件,事件类型多样,如按钮组件,有单击按钮、双击按钮、鼠标划过按钮等事件,这些事件都有相应的类与之对应。程序员需要做的就是编写处理事件的类,创建监听器对象,并对组件注册监听器。•下表13.1是事件、监听器、添加监听器方法,以及支持这些事件的基本组件的总结。•通过该表读者可以发现每种Swing组件都支持某种或几种类型的事件。如果程序员需要在组件上实现监听某种行为,只要找出该行为对应的事件类型,并创建监听器类,为该组件注册监听器即可。13.3Swing组件•Swing提供了丰富的组件,这些组件的合理使用,可以方便地满足用户界面设计的需求,在创建组件时,需要选择组件的构造函数一完成特殊的需要。本节在讲解这些图形组件时,只选择最常用的一种构造函数,如果读者有特殊的需要可以查阅Java的HTML文档。13.3.1按钮•在Swing中引入了不同类型的按钮,如单选按钮、复选框、菜单选项都继承了AbstractButton,本节将首先示范各种可用按钮。•这些按钮包括BasicArrowButton、JToggleButton、JCheckBoxButton和JRadioButton,如代码按钮示例所示。13.3.2图示(Icons)•在13.2.1节,读者已经看到了图示的作用。实际上可以在JLabel、JButton、JCheckBox、JRadioButton等类中使用图示。本节将以按钮为例介绍如何使用图示。•制作图示第一需要创建一个ImageIcon对象,该类的构造函数的参数是图示文件(如image.gif)的路径(如d:\images\image.gif)。在调用组件的setIcon()方法,该方法的参数为一个ImageIcon对象。这样程序就可以打开图形文件,在组件上显示图示文件了。代码按钮上的图示示例程序。13.3.3文本•文本组件为JTextField对象,在代码中已经使用过该组件,这里我们为该组件增加更多的监听功能。这里读者也可以再次复习按钮监听器的使用。代码文本块示例程序。13.3.4工具提示•读者可能有这样的经验,如操作Word时,当鼠标停留在工具栏上某个工具时,会弹出一个内含小方框,文字说明工具的作用。Swing中的几乎所有组件都是继承自JComponent,它提供了一个setToolTipText(Stringstr)方法,来创建工具提示。如一个JButton对象为jb,在该对象上创建工具提示如下所示。•jb.setToolTipText(“保存文件”);•Swing的其他组件也可以这样调用创建自己的“工具提示”。13.3.4工具提示•读者可能有这样的经验,如操作Word时,当鼠标停留在工具栏上某个工具时,会弹出一个内含小方框,文字说明工具的作用。Swing中的几乎所有组件都是继承自JComponent,它提供了一个setToolTipText(Stringstr)方法,来创建工具提示。如一个JButton对象为jb,在该对象上创建工具提示如下所示。•jb.setToolTipText(“保存文件”);•Swing的其他组件也可以这样调用创建自己的“工具提示”。13.3.4工具提示•读者可能有这样的经验,如操作Word时,当鼠标停留在工具栏上某个工具时,会弹出一个内含小方框,文字说明工具的作用。Swing中的几乎所有组件都是继承自JComponent,它提供了一个setToolTipText(Stringstr)方法,来创建工具提示。如一个JButton对象为jb,在该对象上创建工具提示如下所示。•jb.setToolTipText(“保存文件”);•Swing的其他组件也可以这样调用创建自己的“工具提示”。13.3.5单选按钮•在Swing中设计了单选按钮,其目的是只能在多种选择中选择一个。实现单选按钮很简单,只要创建一组JRadioButton,再把这些组件放到同一个ButtonGroup中就可以。在同一个容器中可以有多个ButtonGroup。其中JRadioButton的初始状态可以自由设置为false或true,这取决于程序的需要。但不能同时把多个JRadioButton设置为true。•JRadioButton类的构造函数如下:•publicJRadioButton(Stringstr):创建带有文本字符标识的单选按钮。•publicJRadioButton(Stringstr,booleanbl):创建带有文本字符标识的单选按钮,并且可以设置单选按钮的起始状态。13.3.6复选框•复选框是可以多选的一类图形组件,当选中该组件时,组件前端的方括号内打对勾标记,用户可以设置监听器,触发某种行为,代码复选框示例程序提供了完整的创建复选框的程序代码。13.3.7组合框•组合框的作用是使用户只能从供选择的元素中选出一个元素。Swing类库中的JComboBox类创建组合框。JComboBox只允许用户从列表中选择,不允许输入。•下面创建一个组合框,其中有一个按钮负责向组合框中添加元素,而一旦用户单击组合框中的元素,则在文本块中就显示该元素的内容,如果此时单击删除按钮则删除选中的元素,示例代码为代码。13.3.8列表框•列表框也提供一些元素供选择,但是这些元素会有一部分显示在界面上,显示的元素数量可以事先设置,对列表中的元素可以多选也可以单选,选择方式和在Windows下选择文件的操作类似。创建列表框的关键代码如下所示。•String[]drinking={可口可乐,芬达,雪碧,果粒橙,鲜橙多,露露,果汁};•JListlist=newJList(drinking);13.3.9消息框•在用户界面程序中把消息传递给用户,如用户操作失误、提示保存文件等。最常用的两类就是消息框和确认框。由两个静态类提