javaGUI设计教程

上传人:cn****1 文档编号:568663059 上传时间:2024-07-26 格式:PPT 页数:141 大小:1.02MB
返回 下载 相关 举报
javaGUI设计教程_第1页
第1页 / 共141页
javaGUI设计教程_第2页
第2页 / 共141页
javaGUI设计教程_第3页
第3页 / 共141页
javaGUI设计教程_第4页
第4页 / 共141页
javaGUI设计教程_第5页
第5页 / 共141页
点击查看更多>>
资源描述

《javaGUI设计教程》由会员分享,可在线阅读,更多相关《javaGUI设计教程(141页珍藏版)》请在金锄头文库上搜索。

1、9.1图形用户界面(GUI)设计概述9.1.1 GUI9.1.1 GUI支持包和简单支持包和简单GUIGUI程序例程序例1.java.awt1.java.awt包包 JavaJava语语言言在在java.awtjava.awt包包中中提提供供了了大大量量地地进进行行GUIGUI设设计计所所使使用用的的类类和和接接口口,包包括括绘绘制制图图形形、设设置置字字体体和和颜颜色色、控控制制组组件件、处处理理事事件件等等内内容容,AWTAWT是是JavaJava语言进行语言进行GUIGUI程序设计的基础。程序设计的基础。2. javax.swing2. javax.swing包包SwingSwing包包

2、是是JavaJava基基础础类类库库(Java Java Foundation Foundation ClassesClasses,JFCJFC)的的一一部部分分。SwingSwing提提供供了了从从按按钮到可分拆面板和表格的所有组件。钮到可分拆面板和表格的所有组件。1 1SwingSwing组组件件是是JavaJava语语言言提提供供的的第第二二代代GUIGUI设设计计工工具具包包,它它以以AWTAWT为为基基础础,在在AWTAWT内内容容的的基基础础上上新新增增或或改改进进了了一一些些GUIGUI组组件件,使使得得GUIGUI程程序序功功能能更更强强大大,设设计计更更容容易易、更更方方便便

3、。SwingSwing是是开开发发新新组组件件的的项项目目代代码码名名,现现在在,这这个个名字常用来引用新组件和相关的名字常用来引用新组件和相关的APIAPI。AWTAWT组组件件和和对对应应的的SwingSwing组组件件,从从名名称称上上很很容容易易记记忆忆和和区区别别。例例如如,AWTAWT的的框框架架类类、面面板板类类、按按钮钮类类和和菜菜单单类类,被被命命名名为为FrameFrame、PanelPanel、ButtonButton和和MenuMenu,而而SwingSwing对对应应的的组组件件类类被被命命名名为为JFrameJFrame、JPanelJPanel、JButtonJB

4、utton和和JMenuJMenu。与与AWTAWT组组件件相相比比,SwingSwing组组件件的的名名前前多多一一个个 “J” “J” 字字母母。另另 外外 , AWT AWT 组组 件件 在在 java.awtjava.awt包包 中中 , ,而而 SwingSwing组组 件件 在在javax.swingjavax.swing包中。包中。2 23.3.一个一个Java GUIJava GUI简单程序简单程序【例例9.19.1】一一个个简简单单的的Swing Swing GUIGUI应应用用程程序序。在在一一个个框框架架窗窗口口中中显显示示两两个个标标签签和和一一个个按按钮钮:上上面面的

5、的标标签签显显示示一一串串固固定定的的文文字字信信息息,选选择择按按钮钮后后在在下下面面的的标标签签上上显显示系统现在的时间。示系统现在的时间。l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limport javax.swing.*;import javax.swing.*;import ja

6、vax.swing.*;import javax.swing.*;l limport java.util.*;import java.util.*;import java.util.*;import java.util.*;l l/ / / / 继继承承承承JFrameJFrameJFrameJFrame类类并并并并实现实现ActionListenerActionListenerActionListenerActionListener接口接口接口接口l lpublic class SwingDemo extends JFrame implementspublic class SwingDemo

7、 extends JFrame implementspublic class SwingDemo extends JFrame implementspublic class SwingDemo extends JFrame implementsl l ActionListener ActionListener ActionListener ActionListenerl l JButton b1; / JButton b1; / JButton b1; / JButton b1; / 声明按声明按声明按声明按钮对钮对象象象象l l JLabel l1,l2; / JLabel l1,l2; /

8、 JLabel l1,l2; / JLabel l1,l2; / 声明声明声明声明标签对标签对象象象象3 3l lSwingDemo() / SwingDemo() / SwingDemo() / SwingDemo() / 定定定定义义构造方法构造方法构造方法构造方法l l super(Swing super(Swing super(Swing super(Swing应应用程序的例用程序的例用程序的例用程序的例);/ );/ );/ );/ 调调用父用父用父用父类类的构造方法的构造方法的构造方法的构造方法l l l1=new JLabel( l1=new JLabel( l1=new JLa

9、bel( l1=new JLabel(一个一个一个一个GUIGUIGUIGUI应应用程序的例子用程序的例子用程序的例子用程序的例子,l l JLabel.CENTER); / JLabel.CENTER); / JLabel.CENTER); / JLabel.CENTER); / 定定定定义标签义标签,文字居中,文字居中,文字居中,文字居中l l l2=new JLabel( ); / l2=new JLabel( ); / l2=new JLabel( ); / l2=new JLabel( ); / 定定定定义义无文字无文字无文字无文字标签标签l l b1=new JButton( b1

10、=new JButton( b1=new JButton( b1=new JButton(现现在在在在时间时间T);/ T);/ T);/ T);/ 定定定定义义按按按按钮钮l l b1.setMnemonic(KeyEvent.VK_T);/ b1.setMnemonic(KeyEvent.VK_T);/ b1.setMnemonic(KeyEvent.VK_T);/ b1.setMnemonic(KeyEvent.VK_T);/ 设设置按置按置按置按钮钮的快捷的快捷的快捷的快捷键键l l b1.setActionCommand(time); / b1.setActionCommand(ti

11、me); / b1.setActionCommand(time); / b1.setActionCommand(time); / 设设置控制名置控制名置控制名置控制名l l b1.addActionListener(this); / b1.addActionListener(this); / b1.addActionListener(this); / b1.addActionListener(this); / 注册按注册按注册按注册按钮钮事件事件事件事件l l add(l1,BorderLayout.NORTH); / add(l1,BorderLayout.NORTH); / add(l1,

12、BorderLayout.NORTH); / add(l1,BorderLayout.NORTH); / 添加添加添加添加标签标签l1l1l1l1l l add(l2,BorderLayout.CENTER); / add(l2,BorderLayout.CENTER); / add(l2,BorderLayout.CENTER); / add(l2,BorderLayout.CENTER); / 添加添加添加添加标签标签l2l2l2l2l l add(b1,BorderLayout.SOUTH); / add(b1,BorderLayout.SOUTH); / add(b1,BorderLa

13、yout.SOUTH); / add(b1,BorderLayout.SOUTH); / 添加添加添加添加标签标签b1b1b1b1l l 4 4l l/ / / / 对对按按按按钮钮引引引引发发事件事件事件事件编编程程程程l l public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e)l l / / / / 捕捕

14、捕捕获获按按按按钮钮事件事件事件事件l l Calendar c1 = Calendar.getInstance(); Calendar c1 = Calendar.getInstance(); Calendar c1 = Calendar.getInstance(); Calendar c1 = Calendar.getInstance();l l / / / / 获获取系取系取系取系统统日期和事件日期和事件日期和事件日期和事件l l if(e.getActionCommand().equals(time) if(e.getActionCommand().equals(time) if(e.

15、getActionCommand().equals(time) if(e.getActionCommand().equals(time)l l / / / / 判断是否判断是否判断是否判断是否为为所需的按所需的按所需的按所需的按钮钮事件事件事件事件l l l2.setText(“ l2.setText(“ l2.setText(“ l2.setText(“现现在在在在时间时间是是是是”+”+”+”+l l c1.get(Calendar.HOUR_OF_DAY) c1.get(Calendar.HOUR_OF_DAY) c1.get(Calendar.HOUR_OF_DAY) c1.get(C

16、alendar.HOUR_OF_DAY)l l +“ +“ +“ +“时时”+c1.get(Calendar.MINUTE)+“”+c1.get(Calendar.MINUTE)+“”+c1.get(Calendar.MINUTE)+“”+c1.get(Calendar.MINUTE)+“分分分分”);”);”);”);l l / / / /设设置置置置标签标签文字文字文字文字l l l2.setHorizontalAlignment(JLabel.CENTER); l2.setHorizontalAlignment(JLabel.CENTER); l2.setHorizontalAlignm

17、ent(JLabel.CENTER); l2.setHorizontalAlignment(JLabel.CENTER);l l / / / / 设设置置置置标签标签标签标签文字居中文字居中文字居中文字居中对齐对齐l l 5 5l l else System.exit(0);else System.exit(0);else System.exit(0);else System.exit(0);l l l l public static void main(String args)/ public static void main(String args)/ public static void

18、 main(String args)/ public static void main(String args)/ 主方法主方法主方法主方法l l JFrame.setDefaultLookAndFeelDecorated(true); JFrame.setDefaultLookAndFeelDecorated(true); JFrame.setDefaultLookAndFeelDecorated(true); JFrame.setDefaultLookAndFeelDecorated(true);l l / / / / 加此加此加此加此语语句句句句显显示示示示为为运行运行运行运行结结果果果

19、果图图的右的右的右的右图图 l l JFrame frame = new SwingDemo(); JFrame frame = new SwingDemo(); JFrame frame = new SwingDemo(); JFrame frame = new SwingDemo();l l / / / / 创创建建建建JFrameJFrameJFrameJFrame对对象,初始不可象,初始不可象,初始不可象,初始不可见见l l frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultC

20、loseOperation( frame.setDefaultCloseOperation(l l JFrame.EXIT_ON_CLOSE);/ JFrame.EXIT_ON_CLOSE);/ JFrame.EXIT_ON_CLOSE);/ JFrame.EXIT_ON_CLOSE);/ 设设置框架关置框架关置框架关置框架关闭闭按按按按钮钮事件事件事件事件l l frame.pack(); / frame.pack(); / frame.pack(); / frame.pack(); / 压缩压缩框架的框架的框架的框架的显显示区域示区域示区域示区域l l frame.setVisible(t

21、rue); / frame.setVisible(true); / frame.setVisible(true); / frame.setVisible(true); / 显显示框架主窗口示框架主窗口示框架主窗口示框架主窗口l l l l 6 6程序运行后显示的形式如下图程序运行后显示的形式如下图 。 Java Swing GUIJava Swing GUI应用程序中的基本代码如下。应用程序中的基本代码如下。(1)(1)引入合适的包和类引入合适的包和类一一般般的的Swing Swing GUIGUI应应用用程程序序应应包包含含程程序序中中的的前前三三个个引引入入语语句句,它它们们分分别别表表示

22、示引引入入awtawt包包、awtawt事事件件处处理理包和包和swingswing包。其他包按需引入。包。其他包按需引入。7 7由由于于SwingSwing组组件件使使用用AWTAWT的的结结构构,包包括括AWTAWT的的事事件件驱驱动动模模式式,所所以以,使使用用swingswing组组件件的的程程序序一一般般需需要要使使用用awtawt包。包。(2)(2)使使用用缺缺省省的的观观感感或或设设置置自自己己的的观观感感(Look Look and and FeelFeel)(3)(3)设置一个顶层的容器设置一个顶层的容器(4)(4)根根据据需需要要,使使用用缺缺省省的的布布局局管管理理器器或

23、或设设置置另另外外的布局管理器的布局管理器(5)(5)定义组件并将它们添加到容器定义组件并将它们添加到容器(6)(6)对组件或事件编码对组件或事件编码8 89.1.2 9.1.2 容器、组件、布局和观感容器、组件、布局和观感1.1.容器(容器(ContainerContainer)和组件()和组件(ComponentComponent)一一个个JavaJava的的图图形形用用户户界界面面的的最最基基本本元元素素是是组组件件,组组件件是是可可以以以以图图形形化化的的方方式式显显示示在在屏屏幕幕上上并并能能与与用用户户进进行行交交互互的的对对象象,如如一一个个按按钮钮、一一个个文文本本框框等等。在

24、在JavaJava语语言言中中,通通常常将将组组件件放放在在一一定定的的容容器器内内使使用用。容容器器实实际际上上是是一一种种具具有有容容纳纳其其他他组组件件和和容容器器的的功功能能的的组组件件。抽抽象象类类ContainerContainer是是所所有有容容器器的的父父类类,其其中中包包含含了了很很多多有有关关容容器器的的功功能能和和方方法法 。 而而 类类 ContainerContainer又又 是是 JavaJava语语 言言 的的 组组 件件 类类ComponentComponent的子类。的子类。9 92.2.布局管理器(布局管理器(Layout ManagerLayout Man

25、ager)为为了了使使得得图图形形用用户户界界面面具具有有良良好好的的平平台台无无关关性性,在在JavaJava语语言言中中提提供供了了布布局局管管理理器器这这个个工工具具来来管管理理组组件件在在容容器器中中的的布布局局,而而不不使使用用直直接接设设置置组组件件位位置置和和大大小小的的方方式式。容容器器中中的的组组件件定定位位由由布布局局管管理理器器决决定定。每每个个容容器器都都有有一一个个缺缺省省的的布布局局管管理理器器,当当容容器器需需要要对对某某个个组组件件进进行行定定位位或或判判断断其其大大小小尺尺寸寸时时,就就会会调调用用其其相相应应的的布布局局管管理理器器。但但也也可可以以不不用用

26、缺缺省省的的布布局局管管理理器器,在在程程序中指定其新的布局管理器。序中指定其新的布局管理器。JavaJava平平台台提提供供多多种种布布局局管管理理器器,常常用用的的有有FlowLayoutFlowLayout、BorderLayoutBorderLayout、 GridLayoutGridLayout、CardLayoutCardLayout、BoxLayoutBoxLayout和和GridBagLayoutGridBagLayout等等。使使用用不不同同的的布布局局管管理理器,组件在容器上的位置和大小都是很不一样的。器,组件在容器上的位置和大小都是很不一样的。 1010在程序中安排组件的

27、位置和大小时,应该注意:在程序中安排组件的位置和大小时,应该注意:(1)(1)容容器器中中的的布布局局管管理理器器负负责责各各个个组组件件的的大大小小和和位位置置。因因此此用用户户无无法法在在这这种种情情况况下下直直接接设设置置这这些些属属性性。若若试试图图使使 用用 JavaJava语语 言言 提提 供供 的的 setLocation()setLocation()、 setSize()setSize()、 setBoundssetBounds()()等方法,则都会被布局管理器覆盖。等方法,则都会被布局管理器覆盖。(2)(2)若若用用户户确确实实需需要要亲亲自自设设置置组组件件的的位位置置和和

28、大大小小,则则应应取消该容器的布局管理器,方法为:取消该容器的布局管理器,方法为:l l setLayout(null); setLayout(null); setLayout(null); setLayout(null);随随后后,用用户户必必须须使使用用setLocation()setLocation()、setSize()setSize()、setBoundssetBounds()()等等方方法法为为组组件件设设置置大大小小和和位位置置,但但这这种种方方法法将将会会导导致致程序的系统相关。程序的系统相关。在在一一个个GUIGUI应应用用程程序序的的界界面面上上,除除了了可可以以见见到到上

29、上述述的的标标准准GUIGUI元元素素外外,还还可可以以见见到到一一些些非非交交互互的的起起到到装装饰饰、美美化界面的作用的几何图形、图案、图像等内容。化界面的作用的几何图形、图案、图像等内容。11113.3.观感(观感(Look and FeelLook and Feel)Java Java swingswing的的一一个个重重要要特特征征是是它它的的可可插插入入的的“观观感感”体体系系。一一个个SwingSwing应应用用程程序序或或一一个个最最终终用用户户可可指指明明所所需需要要的的观观感感,使使得得SwingSwing应应用用程程序序的的外外观观和和行行为为都都可可以以被被定定制制。S

30、wingSwing运运行行一一个个缺缺省省的的JavaJava观观感感(也也称称为为MetalMetal观观感感),还还实实现现了了模模仿仿MotifMotif和和WindowsWindows的的观观感感。这这样样,一一个个SwingSwing程程序序可可拥拥有有JavaJava程程序序的的独独特特外外观观,也也可可以以拥拥有熟悉的有熟悉的WindowsWindows操作系统外观。操作系统外观。在在本本章章稍稍后后部部分分的的单单选选按按钮钮的的程程序序例例中中分分别别显显示示了了WindowsWindows、MotifMotif和和MetalMetal三种不同风格的观感。三种不同风格的观感。

31、一一般般在在应应用用程程序序的的JFrameJFrame的的构构造造方方法法中中或或在在JAppletJApplet的的initinit()()方法中进行观感的设置。方法中进行观感的设置。【例【例9.29.2】设置观感。】设置观感。l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;1212l lpublic class Se

32、tLAFpublic class SetLAFpublic class SetLAFpublic class SetLAFl l public static void setNativeLookAndFeel() public static void setNativeLookAndFeel() public static void setNativeLookAndFeel() public static void setNativeLookAndFeel() l l try try try try l l UIManager.setLookAndFeel(UIManager. UIManag

33、er.setLookAndFeel(UIManager. UIManager.setLookAndFeel(UIManager. UIManager.setLookAndFeel(UIManager.l l getSystemLookAndFeelClassName(); getSystemLookAndFeelClassName(); getSystemLookAndFeelClassName(); getSystemLookAndFeelClassName();l l catch(Exception e) catch(Exception e) catch(Exception e) catc

34、h(Exception e) l l System.out.println( System.out.println( System.out.println( System.out.println(设设置置置置native LAFnative LAFnative LAFnative LAF错误错误: : : : + e); + e); + e); + e);l l l l l l public static void setJavaLookAndFeel() public static void setJavaLookAndFeel() public static void setJavaLoo

35、kAndFeel() public static void setJavaLookAndFeel() l l try try try try l l UIManager.setLookAndFeel(UIManager. UIManager.setLookAndFeel(UIManager. UIManager.setLookAndFeel(UIManager. UIManager.setLookAndFeel(UIManager.l l getCrossPlatformLookAndFeelClassName(); getCrossPlatformLookAndFeelClassName()

36、; getCrossPlatformLookAndFeelClassName(); getCrossPlatformLookAndFeelClassName();l l catch(Exception e) catch(Exception e) catch(Exception e) catch(Exception e) l l System.out.println( System.out.println( System.out.println( System.out.println(设设置置置置Java LAFJava LAFJava LAFJava LAF错误错误: + e);: + e);

37、: + e);: + e);l l l l 1313l l public static void setMotifLookAndFeel() public static void setMotifLookAndFeel() public static void setMotifLookAndFeel() public static void setMotifLookAndFeel() l l try try try try l l UIManager.setLookAndFeel(“ UIManager.setLookAndFeel(“ UIManager.setLookAndFeel(“ U

38、IManager.setLookAndFeel(“l l com.sun.java.swing.plaf. com.sun.java.swing.plaf. com.sun.java.swing.plaf. com.sun.java.swing.plaf.l l motif.MotifLookAndFeel); motif.MotifLookAndFeel); motif.MotifLookAndFeel); motif.MotifLookAndFeel);l l catch(Exception e) catch(Exception e) catch(Exception e) catch(Ex

39、ception e) l l System.out.println( System.out.println( System.out.println( System.out.println(设设置置置置Motif LAFMotif LAFMotif LAFMotif LAF错误错误: + e);: + e);: + e);: + e);l l l l l l 因因因因为为setLookAndFeelsetLookAndFeelsetLookAndFeelsetLookAndFeel()()方方法法抛抛出出异异常常,因因此此设设置置观观感感的的代代码码应应捕捕捉捉异异常常。本本例例创创建建的的类类

40、SetLAFSetLAF可可在在以以后后的的程程序中设置观感时使用。序中设置观感时使用。14149.1.39.1.3事件处理事件处理在在一一个个GUIGUI程程序序中中,为为了了能能够够接接收收用用户户的的输输入入、命命令令的的按按键键和和鼠鼠标标操操作作,程程序序系系统统首首先先应应该该能能够够识识别别这这些些操操作作并并做做出出相相应应的的响响应应。通通常常一一个个键键盘盘和和鼠鼠标标操操作作将将引引发发一一个个系系统统预预先先定定义义好好的的事事件件,用用户户程程序序只只要要编编写写代代码码定定义义每每个个事事件件发发生生时时程程序序应应做做出出何何种种响响应应即即可可。这这些些代代码码

41、会会在在它它们们对对应应的的事事件件发发生生时时由由系系统统自自动动调调用用,这这就就是是GUIGUI程程序序中中事事件件和和事事件件响响应应的基本原理。的基本原理。在在JavaJava语语言言中中,除除了了键键盘盘和和鼠鼠标标操操作作,系系统统的的状状态态改变也可以引发事件。改变也可以引发事件。1515可可能能产产生生事事件件的的组组件件称称为为事事件件源源,不不同同事事件件源源上上发发生生的的事事件件种种类类是是不不同同的的。若若希希望望事事件件源源上上引引发发的的事事件件被被程程序序处处理理,需需要要将将事事件件源源注注册册给给能能够够处处理理该该事事件件源源上上那那种种事事件件类类型型

42、的的监监听听器器。监监听听器器具具有有监监听听和和处处理理某某类类事事件件的的功功能能,它它可可以以是是包包容容事事件件源源的的容容器器,也也可可以以是是另另外外的的对对象象。也也就就是是说说,事事件件源源和和事事件件处处理理是是分分开开的的,一一般般组组件件都都不不处处理理自自己己的的事事件件,而而将将事事件件处处理理委委托托给给外外部部的的处处理理实实体体,这这种种事事件件处处理理模模型型称称为为授授权权处处理理模模型。型。事件的行为多种多样,由不同的监听器处理。编写事事件的行为多种多样,由不同的监听器处理。编写事件处理程序首先应确定关注的事件属于何种监听器类件处理程序首先应确定关注的事件

43、属于何种监听器类型。型。 1616在在AWTAWT中,提供中,提供1111种标准的监听器类型种标准的监听器类型,见下表。,见下表。l l 监听器监听器 适配器类适配器类 注册方法注册方法 l lActionListener addActionListenerActionListener addActionListenerl lAdjustmentListener addAdjustmentListenerAdjustmentListener addAdjustmentListenerl lComponentListener ComponentAdapter addComponentListen

44、erComponentListener ComponentAdapter addComponentListenerl lContainerListener ContainerAdapter addContainerListenerContainerListener ContainerAdapter addContainerListenerl lFocusListener FocusAdapter addFocusListenerFocusListener FocusAdapter addFocusListenerl lItemListener addItemListenerItemListen

45、er addItemListenerl lKeyListener KeyAdapter addKeyListenerKeyListener KeyAdapter addKeyListenerl lMouseListener MouseAdapter addMouseListenerMouseListener MouseAdapter addMouseListenerl lMouseMotionListener MouseMotionAdapter addMouseMotionListenerMouseMotionListener MouseMotionAdapter addMouseMotio

46、nListenerl lTextListener addTextListenerTextListener addTextListenerl lWindowListener WindowAdapter addWindowListenerWindowListener WindowAdapter addWindowListener1717在在确确定定监监听听器器类类型型后后,要要用用事事件件源源类类的的注注册册方方法法来来注注册册一一个个监监听听器器类类的的对对象象。这这样样,事事件件源源产产生生的的事事件件会会传传送送给给已已注注册册的的处处理理该该类类事事件件的的监监听听器器对对象象,该该对对象

47、象将将自自动动调调用用相相应应的的事事件件处处理理方方法法来来处处理理该该事事件件。具具体体的的注注册册方方法法 是是 : 用用 监监 听听 器器 类类 的的 对对 象象 作作 为为 参参 数数 调调 用用 事事 件件 源源 本本 身身 的的 addXxxListeneraddXxxListener()()方方法法。该该方方法法的的参参数数是是一一个个监监听听器器类类的的对对象象,有有多多种种形式。例如:形式。例如:l l(1)(1)(1)(1)分分分分离离离离的的的的监监监监听听听听器器器器类类类类,该该该该类类类类通通通通常常常常为为为为继继继继承承承承相相相相应应应应事事事事件件件件适适

48、适适配配配配器器器器类类类类的的的的子子子子类,类中包含了事件处理方法。参数是该类的一个对象。类,类中包含了事件处理方法。参数是该类的一个对象。类,类中包含了事件处理方法。参数是该类的一个对象。类,类中包含了事件处理方法。参数是该类的一个对象。l l(2)(2)(2)(2)实实实实现现现现监监监监听听听听器器器器接接接接口口口口,参参参参数数数数为为为为thisthisthisthis,表表表表示示示示本本本本对对对对象象象象就就就就是是是是一一一一个个个个监监监监听听听听器类的对象。在本类中包含事件处理方法。器类的对象。在本类中包含事件处理方法。器类的对象。在本类中包含事件处理方法。器类的对

49、象。在本类中包含事件处理方法。l l(3)(3)(3)(3)有有有有名名名名内内内内部部部部类类类类,参参参参数数数数形形形形式式式式为为为为继继继继承承承承事事事事件件件件适适适适配配配配器器器器类类类类的的的的子子子子类类类类对对对对象象象象,在子类中包含事件处理方法。在子类中包含事件处理方法。在子类中包含事件处理方法。在子类中包含事件处理方法。l l(4)(4)(4)(4)匿匿匿匿名名名名内内内内部部部部类类类类,参参参参数数数数形形形形式式式式为为为为用用用用newnewnewnew开开开开始始始始的的的的一一一一个个个个无无无无名名名名的的的的类类类类定定定定义义义义。其中包含事件处

50、理方法。其中包含事件处理方法。其中包含事件处理方法。其中包含事件处理方法。18189.2布局管理器在在容容器器中中所所有有组组件件的的布布局局(位位置置和和大大小小)由由布布局局管管理理器器来来 控控 制制 。 在在 JavaJava语语 言言 中中 提提 供供 了了 FlowLayoutFlowLayout、BorderLayoutBorderLayout、GridLayoutGridLayout、CardLayoutCardLayout和和GridBagLayoutGridBagLayout等多种布局管理器。等多种布局管理器。每每种种容容器器都都有有自自己己缺缺省省的的布布局局管管理理器器

51、。缺缺省省地地,JPanelJPanel使用使用FlowLayoutFlowLayout,而内容窗格,而内容窗格 ContentPane ContentPane(JApplet(JApplet、 JDialogJDialog和和 JFrameJFrame对对 象象 的的 主主 容容 器器 ) ) 使使 用用BorderLayoutBorderLayout。如如果果不不希希望望使使用用缺缺省省的的布布局局管管理理器器,则则可可使使用用所所有有容容器器的的父父类类ContainerContainer的的setLayout()setLayout()方方法法来来改变缺省的布局管理器。改变缺省的布局管理

52、器。 19191.FlowLayout1.FlowLayoutFlowLayoutFlowLayout布布局局是是一一种种最最基基本本的的布布局局。这这种种布布局局指指的的是是把把组组件件一一个个接接一一个个从从左左至至右右、从从上上至至下下地地依依次次放放在在容容器器上上,每每一一行行中中的的组组件件缺缺省省为为居居中中对对齐齐。当当容容器器的的尺寸改变后,组件的大小不变,但布局将会随之变化。尺寸改变后,组件的大小不变,但布局将会随之变化。FlowLayoutFlowLayout是是 AppletApplet和和 JPanelJPanel的的 缺缺 省省 布布 局局 管管 理理 器器 。Fl

53、owLayoutFlowLayout类的构造方法如下:类的构造方法如下:l lFlowLayout() FlowLayout() FlowLayout() FlowLayout() 创创创创建建建建每每每每行行行行组组组组件件件件对对对对齐齐齐齐方方方方式式式式为为为为居居居居中中中中对对对对齐齐齐齐、组组组组件件件件间间间间距为距为距为距为5 5 5 5个像素单位的对象个像素单位的对象个像素单位的对象个像素单位的对象l lFlowLayout(int FlowLayout(int FlowLayout(int FlowLayout(int align) align) align) align

54、) 创创创创建建建建指指指指定定定定每每每每行行行行组组组组件件件件对对对对齐齐齐齐方方方方式式式式、组组组组件件件件间间间间距距距距为为为为5 5 5 5个个个个像像像像素素素素单单单单位位位位的的的的对对对对象象象象,alignalignalignalign可可可可取取取取三三三三个个个个静静静静态态态态常常常常量量量量LEFTLEFTLEFTLEFT、CENTERCENTERCENTERCENTER和和和和RIGHTRIGHTRIGHTRIGHT之一(分别表示左、中、右对齐方式)之一(分别表示左、中、右对齐方式)之一(分别表示左、中、右对齐方式)之一(分别表示左、中、右对齐方式)。202

55、0l lFlowLayout(int FlowLayout(int FlowLayout(int FlowLayout(int align, align, align, align, int int int int hgap, hgap, hgap, hgap, int int int int vgap) vgap) vgap) vgap) 创创创创建建建建指指指指定定定定每每每每行行行行组组组组件件件件对对对对齐齐齐齐方方方方式式式式的的的的对对对对象象象象,该该该该对对对对象象象象也也也也使使使使用用用用参参参参数数数数vgapvgapvgapvgap和和和和hgaphgaphgaphga

56、p指指指指定定定定了组件间的以像素为单位的纵横间距。了组件间的以像素为单位的纵横间距。了组件间的以像素为单位的纵横间距。了组件间的以像素为单位的纵横间距。向向使使用用FlowLayoutFlowLayout布布局局的的容容器器添添加加组组件件可可简简单单地地使使用用下面的语句:下面的语句:l l add(add(add(add(组件名组件名组件名组件名););););2 2BorderLayoutBorderLayoutBorderLayout BorderLayout 是是内内容容窗窗格格的的缺缺省省布布局局管管理理器器。内内容容窗窗格格是是框框架架JFrameJFrame,小小程程序序JA

57、ppletJApplet和和对对话话框框JDialogJDialog的的主主容容器器。BorderLayoutBorderLayout将将容容器器的的布布局局分分为为五五个个区区:北北区区、南南区区、东东区区、西西区区和和中中区区。这这几几个个区区的的分分布布规规律律是是“上上北北下下南南,左左西西右右东东”。当当容容器器的的大大小小改改变变时时,容容器器中中的的各各个个组组件件相相对对位位置置不不变变,其其中中间间部部分分组组件件的的尺寸会发生变化,四周组件宽度固定不变。尺寸会发生变化,四周组件宽度固定不变。2121BorderLayoutBorderLayout类的构造方法如下:类的构造方

58、法如下:l lBorderLayout() BorderLayout() BorderLayout() BorderLayout() 创建组件间无间距的创建组件间无间距的创建组件间无间距的创建组件间无间距的BorderLayoutBorderLayoutBorderLayoutBorderLayout对象。对象。对象。对象。l lBorderLayout(int BorderLayout(int BorderLayout(int BorderLayout(int hgap, hgap, hgap, hgap, int int int int vgap) vgap) vgap) vgap) 创创

59、创创建建建建有有有有指指指指定定定定组组组组件件件件间间间间距的对象。距的对象。距的对象。距的对象。向向BorderLayoutBorderLayout布布局局的的容容器器添添加加组组件件时时,每每添添加加一一个个组组件件都都应应指指明明该该组组件件加加在在哪哪个个区区域域中中。add()add()方方法法的的第第二二个个参参数数指指明明加加入入的的区区域域,区区域域东东南南西西北北中中可可用用 五五 个个 静静 态态 常常 量量 表表 示示 : BorderLayout.EASTBorderLayout.EAST、BorderLayout.SOUTHBorderLayout.SOUTH、Bo

60、rderLayout.WESTBorderLayout.WEST、BorderLayout.NORTHBorderLayout.NORTH和和BorderLayout.CENTERBorderLayout.CENTER。2222【例【例9.39.3】将五个按钮加入】将五个按钮加入BorderLayoutBorderLayout的五个区。的五个区。l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport javax.swing.*;import javax.swing.*;import

61、 javax.swing.*;import javax.swing.*;l lpublic class BorderLayoutDemo extends JApplet public class BorderLayoutDemo extends JApplet public class BorderLayoutDemo extends JApplet public class BorderLayoutDemo extends JApplet l l public void init() public void init() public void init() public void init

62、() l l Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane();l l c.add(new Button( c.add(new Button( c.add(new Button( c.add(new Button(北北北北North), BorderLayout.NORTH);North), BorderLayout.NORTH);North), BorderLayout.NORTH);Nor

63、th), BorderLayout.NORTH);l l c.add(new Button( c.add(new Button( c.add(new Button( c.add(new Button(南南南南South), BorderLayout.SOUTH);South), BorderLayout.SOUTH);South), BorderLayout.SOUTH);South), BorderLayout.SOUTH);l l c.add(new Button( c.add(new Button( c.add(new Button( c.add(new Button(东东东东East)

64、, BorderLayout.EAST);East), BorderLayout.EAST);East), BorderLayout.EAST);East), BorderLayout.EAST);l l c.add(new Button( c.add(new Button( c.add(new Button( c.add(new Button(西西西西West), BorderLayout.WEST);West), BorderLayout.WEST);West), BorderLayout.WEST);West), BorderLayout.WEST);l l c.add(new c.ad

65、d(new c.add(new c.add(new Button(Button(Button(Button(中中中中Center), Center), Center), Center), BorderLayout.CENTER);BorderLayout.CENTER);BorderLayout.CENTER);BorderLayout.CENTER);l l l l 程序运行的结果见下图。程序运行的结果见下图。2323v3GridLayoutvGridLayout布局是将容器的空间分成若干行和列的一个个网格,可以给出网格的行数和列数,组件添加到这些网格中。当改变容器的大小后,其中的组件相对位

66、置不变,但大小改变。容器中各个组件同高度、同宽度。各个组件缺省的排列方式为:从上到下,从左到右。2424GridLayoutGridLayout类的构造方法如下:类的构造方法如下:l lpublic public public public GridLayout()GridLayout()GridLayout()GridLayout()创创创创建建建建单单单单行行行行每每每每个个个个组组组组件件件件一一一一列列列列的的的的GridLayoutGridLayoutGridLayoutGridLayout对对对对象。象。象。象。l lpublic public public public Grid

67、Layout(int GridLayout(int GridLayout(int GridLayout(int rows, rows, rows, rows, int int int int cols) cols) cols) cols) 创创创创建建建建指指指指定定定定行行行行列列列列数数数数的的的的GridLayoutGridLayoutGridLayoutGridLayout对象。对象。对象。对象。l lpublic public public public GridLayout(int GridLayout(int GridLayout(int GridLayout(int rows,

68、 rows, rows, rows, int int int int cols, cols, cols, cols, int int int int hgap, hgap, hgap, hgap, int int int int vgap)vgap)vgap)vgap)创建指定行列数的创建指定行列数的创建指定行列数的创建指定行列数的GridLayoutGridLayoutGridLayoutGridLayout对象。对象。对象。对象。因因 为为 没没 有有 容容 器器 缺缺 省省 使使 用用 GridLayoutGridLayout, 因因 此此 在在 使使 用用GridLayoutGridL

69、ayout前前,要要用用setLayout()setLayout()方方法法将将容容器器的的布布局局管管理器设置为理器设置为GridLayoutGridLayout。在在向向GridLayoutGridLayout添添加加组组件件时时,组组件件加加入入容容器器要要按按序序进进行行,每每个个网网格格中中都都必必须须加加入入组组件件,若若希希望望某某个个网网格格为为空空,可可以为该网格加入一个空的标签:以为该网格加入一个空的标签:add(new JLabel()add(new JLabel()。2525【例【例9.49.4】GridLayoutGridLayout布局。布局。l limport j

70、ava.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l lpublic class GridLayoutDemo extends JApplet public class GridLayoutDemo extends JApplet public class GridLayoutDemo extends JApplet public class G

71、ridLayoutDemo extends JApplet l l public void init() public void init() public void init() public void init() l l Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane();l l c.setLayout(new GridLayout(3,2); c.setLayout(new GridLa

72、yout(3,2); c.setLayout(new GridLayout(3,2); c.setLayout(new GridLayout(3,2);l l c.add(new Button(1); c.add(new Button(1); c.add(new Button(1); c.add(new Button(1);l l c.add(new Button(2); c.add(new Button(2); c.add(new Button(2); c.add(new Button(2);l l c.add(new Button(3); c.add(new Button(3); c.ad

73、d(new Button(3); c.add(new Button(3);l l c.add(new Button(4); c.add(new Button(4); c.add(new Button(4); c.add(new Button(4);l l c.add(new Button(5); c.add(new Button(5); c.add(new Button(5); c.add(new Button(5);l l c.add(new Button(6); c.add(new Button(6); c.add(new Button(6); c.add(new Button(6);l

74、l l l 2626v 4.CardLayoutvCardLayout布局管理器能够使得多个组件共享同一显示空间,这些组件之间的关系像一叠重叠的扑克牌,只有最上面的组件是可见的。注意:在一个显示空间(卡片)中只能显示一个组件,因此,可使用容器嵌套的方法来显示多个组件。v 例9.4运行的结果如下图所示。2727 CardLayoutCardLayout类的构造方法如下:类的构造方法如下:l lCardLayout()CardLayout()CardLayout()CardLayout()创建间距为零的对象。创建间距为零的对象。创建间距为零的对象。创建间距为零的对象。l lCardLayout(i

75、nt CardLayout(int CardLayout(int CardLayout(int hgap, hgap, hgap, hgap, int int int int vgap)vgap)vgap)vgap)创创创创建建建建带带带带有有有有水水水水平平平平hgaphgaphgaphgap和和和和垂直垂直垂直垂直vgapvgapvgapvgap间距的对象。间距的对象。间距的对象。间距的对象。为为了了使使用用叠叠在在下下面面的的组组件件,可可以以为为每每个个组组件件取取一一名名字字,名名字字在在用用add()add()方方法法向向容容器器添添加加组组件件时时指指定定,需需要要某某个个组组件

76、件时时通通过过show()show()方方法法指指定定该该组组件件的的名名字字来来选选取取它它。也也可可以以顺顺序序使使用用这这些些组组件件,或或直直接接指指明明选选取取第第一一个个组组件件(用用first()first()方方法法)或或最最后后一一个个组组件(用件(用last()last()方法)。方法)。2828【例【例9.59.5】CardLayoutCardLayout布局。布局。l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport javax.swing.*;impor

77、t javax.swing.*;import javax.swing.*;import javax.swing.*;l lpublic class CardLayoutDemo extends JAppletpublic class CardLayoutDemo extends JAppletpublic class CardLayoutDemo extends JAppletpublic class CardLayoutDemo extends JAppletl l CardLayout cl =new CardLayout(20,40); CardLayout cl =new CardLa

78、yout(20,40); CardLayout cl =new CardLayout(20,40); CardLayout cl =new CardLayout(20,40);l l / / / / 组组件在卡片中有件在卡片中有件在卡片中有件在卡片中有边边界界界界l l JButton b1=new JButton( JButton b1=new JButton( JButton b1=new JButton( JButton b1=new JButton(卡片一卡片一卡片一卡片一););););l l JButton b2=new JButton( JButton b2=new JButto

79、n( JButton b2=new JButton( JButton b2=new JButton(卡片二卡片二卡片二卡片二););););l l JButton b3=new JButton( JButton b3=new JButton( JButton b3=new JButton( JButton b3=new JButton(卡片三卡片三卡片三卡片三););););l l public void init() public void init() public void init() public void init()l l getContentPane().setLayout(c

80、l); getContentPane().setLayout(cl); getContentPane().setLayout(cl); getContentPane().setLayout(cl);l l getContentPane().add(card1,b1); getContentPane().add(card1,b1); getContentPane().add(card1,b1); getContentPane().add(card1,b1);l l getContentPane().add(card2,b2); getContentPane().add(card2,b2); ge

81、tContentPane().add(card2,b2); getContentPane().add(card2,b2);l l getContentPane().add(card3,b3); getContentPane().add(card3,b3); getContentPane().add(card3,b3); getContentPane().add(card3,b3);l l l l 2929程程序序运运行行结结果果如如下下图图所所示示。程程序序中中的的三三个个按按钮钮组组件件顺顺序序添添加加到到卡卡片片布布局局管管理理器器的的各各个个卡卡片片上上,它它们们共共享享同同一显示区域,

82、因此只能见到最上面的一显示区域,因此只能见到最上面的“卡片一卡片一”按钮。按钮。30305.GridBagLayout5.GridBagLayoutGridBagLayoutGridBagLayout是是最最复复杂杂也也最最灵灵活活的的布布局局管管理理器器。这这个个布布局局管管理理器器将将组组件件放放入入单单元元格格中中,但但允允许许一一些些组组件件跨跨越单元格。越单元格。可用可用GridBagLayoutGridBagLayout类的构造方法类的构造方法GridBagLayout()GridBagLayout()来来创建一个创建一个GridBagLayoutGridBagLayout布局管理

83、器。因布局管理器。因GridBagLayoutGridBagLayout布局设置比较复杂,这里就不介绍了,布局设置比较复杂,这里就不介绍了,请读者参看请读者参看APIAPI说明或其他资料。说明或其他资料。 6.6.自定义布局自定义布局3131若希望按照自己的要求来进行组件和界面图形元素若希望按照自己的要求来进行组件和界面图形元素的布局,可用容器的的布局,可用容器的setLayout(null)setLayout(null)方法将容器的方法将容器的布局管理器设置为空,然后用下面的方法设置组件布局管理器设置为空,然后用下面的方法设置组件在容器中的位置和大小:在容器中的位置和大小:l lsetBou

84、nds(int a,int b,int width,int height)setBounds(int a,int b,int width,int height)setBounds(int a,int b,int width,int height)setBounds(int a,int b,int width,int height)其中,参数其中,参数a a和和b b指定矩形形状的组件左上角在容器指定矩形形状的组件左上角在容器中的坐标,中的坐标,widthwidth和和heightheight指定组件的宽和高。指定组件的宽和高。【例【例9.69.6】设置自己的布局管理器。】设置自己的布局管理器。

85、l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l lclass NullLayout extends JFrameclass NullLayout extends JFrameclass NullLayout extends JFrameclass NullLayout extends JFramel l NullLay

86、out() NullLayout() NullLayout() NullLayout()l l super( super( super( super(建建建建设设自己的布局管理器自己的布局管理器自己的布局管理器自己的布局管理器););););l l Container c=getContentPane(); Container c=getContentPane(); Container c=getContentPane(); Container c=getContentPane();l l / / / / 也可不用内容窗格也可不用内容窗格也可不用内容窗格也可不用内容窗格l l c.setLay

87、out(null); c.setLayout(null); c.setLayout(null); c.setLayout(null);3232l lJButtonjb1=newJButton(JButtonjb1=newJButton(按按钮钮1);1);l lJButtonjb2=newJButton(JButtonjb2=newJButton(按按钮钮2);2);l lc.add(jb1);c.add(jb2);c.add(jb1);c.add(jb2);l ljb1.setBounds(10,10,100,30);jb1.setBounds(10,10,100,30);l ljb2.se

88、tBounds(10,50,100,30);jb2.setBounds(10,50,100,30);l ll lpublicstaticvoidmain(Stringargs)publicstaticvoidmain(Stringargs)l lNullLayoutnl=newNullLayout();NullLayoutnl=newNullLayout();l lnl.setSize(200,150);nl.setSize(200,150);l lnl.setVisible(true);nl.setVisible(true);l ll l 程序的运行结果如下图所示。注意,采用这种方式程序的运

89、行结果如下图所示。注意,采用这种方式的布局,组件的位置和大小将不随窗口大小的变化的布局,组件的位置和大小将不随窗口大小的变化而变化。而变化。3333下图为例9.6的运行界面。34349.3常用Swing组件9.3.1 9.3.1 容器组件容器组件1.JFrame1.JFrame框架框架框框架架,是是JFrameJFrame类类的的对对象象,是是swing swing GUIGUI应应用用程程序序的的主主窗窗口口。窗窗口口有有边边界界、标标题题、关关闭闭按按钮钮等等。对对JavaJava应应用用程程序序,应应至至少少包包含含一一个个框框架架,例例9.19.1的的应应用用程程序序即即使使用用了了框

90、框架架。有有时时,小小程程序序也也使使用用框框架架。JFrameJFrame类继承于类继承于FrameFrame类。类。JFrameJFrame类的构造方法如下:类的构造方法如下:l lJFrame() JFrame() JFrame() JFrame() 创建无标题的初始不可见框架。创建无标题的初始不可见框架。创建无标题的初始不可见框架。创建无标题的初始不可见框架。l lJFrame(String JFrame(String JFrame(String JFrame(String title) title) title) title) 创创创创建建建建标标标标题题题题为为为为titletit

91、letitletitle的的的的初初初初始始始始不不不不可可可可见见见见框框框框架。架。架。架。 3535例例如如,创创建建带带标标题题“Java “Java GUIGUI应应用用程程序序”的的框框架架对对象象frameframe,可用语句:,可用语句:l l JFrame frame = new JFrame(Java GUIJFrame frame = new JFrame(Java GUIJFrame frame = new JFrame(Java GUIJFrame frame = new JFrame(Java GUI应应用程序用程序用程序用程序); ; ; ; 要要显显示示框框架架

92、对对象象代代表表的的框框架架窗窗口口,可可使使用用方方法法setVisiblesetVisible()()。可用语句:。可用语句:l l frame.setVisible(true);frame.setVisible(true);frame.setVisible(true);frame.setVisible(true);可可使使得得JFrameJFrame类类对对象象frameframe表表示示的的框框架架窗窗口口显显示示到到屏屏幕幕上上。一一般般在在显显示示框框架架前前,可可设设置置框框架架的的初初始始显显示示大大小小可使用可使用setSize()setSize()方法或方法或pack()p

93、ack()方法。例如:方法。例如:l l frame.setSize(200,150);frame.setSize(200,150);frame.setSize(200,150);frame.setSize(200,150);l l / / / / 设设置框架窗口初始大小置框架窗口初始大小置框架窗口初始大小置框架窗口初始大小为为200150200150200150200150点点点点l l frame.pack(); frame.pack(); frame.pack(); frame.pack();l l / / / / 设设置框架窗口初始大小置框架窗口初始大小置框架窗口初始大小置框架窗口初始

94、大小为刚为刚好只好只好只好只显显示出所有的示出所有的示出所有的示出所有的组组件。件。件。件。3636在在向向框框架架添添加加组组件件时时,并并不不直直接接添添加加组组件件到到框框架架,而而是是添添加加到到内内容容窗窗格格(content content panepane),改改变变其其他他特特性性(布布局局管管理理器器、背背景景色色等等)也也对对内内容容窗窗格格进进行行。要要存存取取内内容容窗窗格格,可可通通过过getContentPane()getContentPane()方方法法, , 若若希希望望用用自自己己的的容容器器替替换换掉掉内内容容窗窗格格(例例如如用用JPanelJPanel)

95、,可以使用),可以使用setContentPane()setContentPane()方法。方法。 选选择择框框架架的的关关闭闭按按钮钮后后,框框架架窗窗口口将将自自动动关关闭闭,但但若若是是应应用用单单个个框框架架的的应应用用程程序序,为为了了在在选选择择框框架架的的关关闭闭按按钮钮时时能能退退出出程程序序,应应添添加加WindowListenerWindowListener监监听器或书写下列代码:听器或书写下列代码:l lframe.setDefaultCloseOperation(frame.setDefaultCloseOperation(frame.setDefaultCloseOp

96、eration(frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); 3737JFrameJFrame的的缺缺省省观观感感为为Java Java (Metal), (Metal), 若若要要使使用用其其他他的的观观感感,必必须须显显式式设设置置。JFrameJFrame(应应该该说说是是内内容容窗窗格)的缺省布局管理器是格)的缺省布局管理器是BorderLayoutBorderLayout。2. JPa

97、nel2. JPanel面板面板JPanelJPanel是是一一种种添添加加到到其其他他容容器器使使用用的的容容器器组组件件,可可将将组组件件添添加加到到JPanelJPanel,然然后后再再将将JPanelJPanel添添加加到到某某个个容容器器。JPanelJPanel也也提提供供一一个个绘绘画画区区域域,可可代代替替AWTAWT的的画画布布Canvas Canvas (没有(没有JCanvasJCanvas)。)。3838javax.swing.JPaneljavax.swing.JPanel类类继继承承于于javax.swing.JComponentjavax.swing.JCompo

98、nent类,其构造方法有:类,其构造方法有:l lpublic public public public JPanel() JPanel() JPanel() JPanel() 创创建建建建具具具具有有有有缺缺缺缺省省省省FlowLayoutFlowLayoutFlowLayoutFlowLayout布布布布局局局局的的的的JPanelJPanelJPanelJPanel对对象。象。象。象。l lpublic public public public JPanel(LayoutManager JPanel(LayoutManager JPanel(LayoutManager JPanel(La

99、youtManager layout) layout) layout) layout) 创创建建建建具具具具有有有有指指指指定定定定布布布布局局局局管理器的管理器的管理器的管理器的JPanelJPanelJPanelJPanel对对象。象。象。象。将将JPanelJPanel作作为为画画布布的的绘绘画画区区域域使使用用时时,要要使使用用下下面面的的两两个个步步骤骤:首首先先,设设置置画画布布绘绘图图区区域域的的大大小小;其其次次,使使用用paintComponent()paintComponent()方方法法(不不是是paint()paint()方方法法)来来绘绘图图,在在该该方方法法体体中中

100、,首首先先调调用用方方法法super.paintComponentsuper.paintComponent()来清除显示区域。()来清除显示区域。 3939例如:例如:l l publicvoidpaintComponent(Graphicsg)publicvoidpaintComponent(Graphicsg)l lsuper.paintComponent(g);super.paintComponent(g);l l.l lJPanelJPanel可可指指定定边边界界,可可用用的的边边界界有有titledtitled、etchedetched、beveled beveled 、lineli

101、ne、mattematte、compoundcompound和和emptyempty等等,也也可可以以创创建建自自己己的的边边界界。可可用用JComponentJComponent类类的的setBorder()setBorder()方法设置边界。其用法如下:方法设置边界。其用法如下:l l publicvoidsetBorder(Borderborder)publicvoidsetBorder(Borderborder)其其中中,BorderBorder类类的的参参数数可可用用javax.swing.BorderFactoryjavax.swing.BorderFactory类类中中的的方方法

102、法获获得得。获获取取各各种相应边界的方法为:种相应边界的方法为:l lcreateTitledBorder()createEtchedBorder()createTitledBorder()createEtchedBorder()l lcreateBevelBorder()createRaisedBevelBorder()createBevelBorder()createRaisedBevelBorder()4040l lcreateLoweredBevelBorder() createLineBorder()createLoweredBevelBorder() createLineBorde

103、r()createLoweredBevelBorder() createLineBorder()createLoweredBevelBorder() createLineBorder()l lcreateMatteBorder() createCompoundBorder()createMatteBorder() createCompoundBorder()createMatteBorder() createCompoundBorder()createMatteBorder() createCompoundBorder()l lcreateEmptyBorder()createEmptyBor

104、der()createEmptyBorder()createEmptyBorder()【例【例9.79.7】使用】使用JPanelJPanel。l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l lclass JPanelDemo extends JPanel class JPanelDemo extends JPanel

105、 class JPanelDemo extends JPanel class JPanelDemo extends JPanel l l JButton b1 = new JButton(JPanel); JButton b1 = new JButton(JPanel); JButton b1 = new JButton(JPanel); JButton b1 = new JButton(JPanel);l l JButton b2 = new JButton(Demo); JButton b2 = new JButton(Demo); JButton b2 = new JButton(Dem

106、o); JButton b2 = new JButton(Demo);l l public JPanelDemo() public JPanelDemo() public JPanelDemo() public JPanelDemo() l l setBackground(Color.white); setBackground(Color.white); setBackground(Color.white); setBackground(Color.white);l l add(b1); add(b1); add(b1); add(b1);l l add(b2); add(b2); add(b

107、2); add(b2);l l 4141l lpublic static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args) l l JPanel jp = new JPanelDemo(); JPanel jp = new JPanelDemo(); JPanel jp = new JPanelDemo(); JPanel jp = new JPanelDemo();l l jp

108、.setBorder( jp.setBorder( jp.setBorder( jp.setBorder(l l BorderFactory.createTitledBorder( BorderFactory.createTitledBorder( BorderFactory.createTitledBorder( BorderFactory.createTitledBorder(l l Hello,Border); Hello,Border); Hello,Border); Hello,Border);l l JFrame frame = new JFrame(JPanelDemo); JF

109、rame frame = new JFrame(JPanelDemo); JFrame frame = new JFrame(JPanelDemo); JFrame frame = new JFrame(JPanelDemo);l l frame.setSize(200, 150); frame.setSize(200, 150); frame.setSize(200, 150); frame.setSize(200, 150);l l frame.setContentPane(jp); frame.setContentPane(jp); frame.setContentPane(jp); f

110、rame.setContentPane(jp);l l frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation(l l JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE);l l frame.setVisible(true); frame.setVisible(true)

111、; frame.setVisible(true); frame.setVisible(true);l l l l 4242v例9.7程序运行结果如下图所示。43433.JApplet3.JAppletjavax.swing.JAppletjavax.swing.JApplet类是类是java.applet.Appletjava.applet.Applet类的类的子类。使用子类。使用SwingSwing组件的小程序需继承组件的小程序需继承JAppletJApplet类。类。 除了所处的除了所处的javajava包不同外,包不同外,JAppletJApplet与与AppletApplet的主的主要

112、区别还有:要区别还有:(1)(1)缺省的布局管理器不同缺省的布局管理器不同 Applet Applet缺省的布局管理器是缺省的布局管理器是FlowLayoutFlowLayout,而,而JAppletJApplet(内容窗格)缺省的布局管理器是(内容窗格)缺省的布局管理器是BorderLayoutBorderLayout。4444(2)(2)加入组件的方式不同加入组件的方式不同AppletApplet可直接加入组件,而可直接加入组件,而JAppletJApplet缺省使用内容窗缺省使用内容窗格格ContentPaneContentPane作为主容器。加入作为主容器。加入SwingSwing组件

113、时,要组件时,要先使用先使用JAppletJApplet的方法的方法getContentPane()getContentPane()获得一个获得一个ContainerContainer对象,再调用这个对象的对象,再调用这个对象的add()add()方法将方法将SwingSwing组件加入到组件加入到JAppletJApplet的容器中。的容器中。4.JTabbedPane4.JTabbedPanejavax. javax.swing.JTabbedPanejavax. javax.swing.JTabbedPane类继承于类继承于javax.swing.JComponentjavax.swin

114、g.JComponent,它的对象反映为一组带,它的对象反映为一组带标签的面板,每个面板都可以存放组件,因此标签的面板,每个面板都可以存放组件,因此JTabbedPaneJTabbedPane是一容器组件。是一容器组件。4545JTabbedPaneJTabbedPane类的构造方法有:类的构造方法有:l lJTabbedPane()JTabbedPane()JTabbedPane()JTabbedPane()创建空对象,该对象具有缺省的标签位置创建空对象,该对象具有缺省的标签位置创建空对象,该对象具有缺省的标签位置创建空对象,该对象具有缺省的标签位置JTabbedPane.TOPJTabbe

115、dPane.TOPJTabbedPane.TOPJTabbedPane.TOP和缺省的布局策略和缺省的布局策略和缺省的布局策略和缺省的布局策略JTabbedPane.WRAP_TAB_LAYOUTJTabbedPane.WRAP_TAB_LAYOUTJTabbedPane.WRAP_TAB_LAYOUTJTabbedPane.WRAP_TAB_LAYOUT。l lJTabbedPane(int tabPlacement)JTabbedPane(int tabPlacement)JTabbedPane(int tabPlacement)JTabbedPane(int tabPlacement)创

116、建空对象,该对象具有创建空对象,该对象具有创建空对象,该对象具有创建空对象,该对象具有指定的标签位置:指定的标签位置:指定的标签位置:指定的标签位置:JTabbedPane.TOPJTabbedPane.TOPJTabbedPane.TOPJTabbedPane.TOP、JTabbedPane.BOTTOMJTabbedPane.BOTTOMJTabbedPane.BOTTOMJTabbedPane.BOTTOM、JTabbedPane.LEFTJTabbedPane.LEFTJTabbedPane.LEFTJTabbedPane.LEFT或或或或JTabbedPane.RIGHTJTabbe

117、dPane.RIGHTJTabbedPane.RIGHTJTabbedPane.RIGHT以及缺省的布局策以及缺省的布局策以及缺省的布局策以及缺省的布局策略略略略JTabbedPane.WRAP_TAB_LAYOUTJTabbedPane.WRAP_TAB_LAYOUTJTabbedPane.WRAP_TAB_LAYOUTJTabbedPane.WRAP_TAB_LAYOUT。l lJTabbedPane(int tabPlacement, int tabLayoutPolicy)JTabbedPane(int tabPlacement, int tabLayoutPolicy)JTabbed

118、Pane(int tabPlacement, int tabLayoutPolicy)JTabbedPane(int tabPlacement, int tabLayoutPolicy)创建空对象,该对象具有指定的标签位置和布局策略。创建空对象,该对象具有指定的标签位置和布局策略。创建空对象,该对象具有指定的标签位置和布局策略。创建空对象,该对象具有指定的标签位置和布局策略。4646【例9.8】使用JTabbedPane容器。l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport

119、java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport javax.swing.event.*;import javax.swing.event.*;import javax.swing.event.*;import javax.swing.event.*;l lpublic cla

120、ss JTabbedPaneDemopublic class JTabbedPaneDemopublic class JTabbedPaneDemopublic class JTabbedPaneDemol l public static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args)l l new MyTabbedPane(); new MyTabbedPane(); new

121、 MyTabbedPane(); new MyTabbedPane();l l l l l lclass MyTabbedPane extends JFrame implementsclass MyTabbedPane extends JFrame implementsclass MyTabbedPane extends JFrame implementsclass MyTabbedPane extends JFrame implementsl l ChangeListener,ActionListener ChangeListener,ActionListener ChangeListene

122、r,ActionListener ChangeListener,ActionListenerl l JTabbedPane jt; JTabbedPane jt; JTabbedPane jt; JTabbedPane jt;l l JButton jb; JButton jb; JButton jb; JButton jb;l l int index = 0; int index = 0; int index = 0; int index = 0;4747l l MyTabbedPane()MyTabbedPane()MyTabbedPane()MyTabbedPane()l l super

123、( super( super( super(使用使用使用使用标签标签面板容器面板容器面板容器面板容器););););l l jt = new JTabbedPane(); jt = new JTabbedPane(); jt = new JTabbedPane(); jt = new JTabbedPane();l l jb = new JButton5; jb = new JButton5; jb = new JButton5; jb = new JButton5;l l for(int i = 0;i5;i+) for(int i = 0;i5;i+) for(int i = 0;i5;i

124、+) for(int i = 0;i5;i+)l l jbi = new JButton( jbi = new JButton( jbi = new JButton( jbi = new JButton(第第第第 + i + + i + + i + + i + 页页面板面板面板面板););););l l jbi.addActionListener(this); jbi.addActionListener(this); jbi.addActionListener(this); jbi.addActionListener(this);l l jt.addTab( jt.addTab( jt.add

125、Tab( jt.addTab(页标签页标签 + i,jbi); + i,jbi); + i,jbi); + i,jbi);l l l l jt.addChangeListener(this); jt.addChangeListener(this); jt.addChangeListener(this); jt.addChangeListener(this);l l getContentPane().add(jt,BorderLayout.CENTER); getContentPane().add(jt,BorderLayout.CENTER); getContentPane().add(jt,

126、BorderLayout.CENTER); getContentPane().add(jt,BorderLayout.CENTER);l l setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); l l setSize(300,200); setSize(300,200

127、); setSize(300,200); setSize(300,200);l l setVisible(true); setVisible(true); setVisible(true); setVisible(true);l l 4848l l public void stateChanged(ChangeEvent e)public void stateChanged(ChangeEvent e)public void stateChanged(ChangeEvent e)public void stateChanged(ChangeEvent e)l l if(e.getSource(

128、)=jt) if(e.getSource()=jt) if(e.getSource()=jt) if(e.getSource()=jt)l l int i = (JTabbedPane)e.getSource() int i = (JTabbedPane)e.getSource() int i = (JTabbedPane)e.getSource() int i = (JTabbedPane)e.getSource()l l .getSelectedIndex(); .getSelectedIndex(); .getSelectedIndex(); .getSelectedIndex();l

129、l jbindex.setVisible(false); jbindex.setVisible(false); jbindex.setVisible(false); jbindex.setVisible(false);l l jbi.setVisible(true); jbi.setVisible(true); jbi.setVisible(true); jbi.setVisible(true);l l index = i; index = i; index = i; index = i;l l l l l l public void actionPerformed(ActionEvent e

130、) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e)l l setTitle(“ setTitle(“ setTitle(“ setTitle(“响响响响应单击应单击”l l +(JButton)e.getSource().getText(); +(JButton)e.getSource().getText(); +(JButton)e.getSource().getText(); +(J

131、Button)e.getSource().getText();l l l l 4949例例9.89.8运行结果如下图所示。运行结果如下图所示。50509.3.2 9.3.2 按钮(按钮(JButtonJButton)按按钮钮是是GUIGUI中中非非常常重重要要的的一一种种基基本本组组件件。按按钮钮一一般般对对应应一一个个事事先先定定义义好好的的事事件件、执执行行功功能能、一一段段程程序序。当当使使用用者者单单击击按按钮钮时时,系系统统自自动动执执行行与与该该按按钮钮联联系系的程序,从而完成预定的功能。的程序,从而完成预定的功能。JButtonJButton类类提提供供对对按按钮钮的的支支持持,

132、它它的的类类层层次次关关系系如如下下: : l l java.awt.Containerjava.awt.Containerjava.awt.Containerjava.awt.Containerl l javax.swing.JComponent javax.swing.JComponent javax.swing.JComponent javax.swing.JComponentl l javax.swing.AbstractButton javax.swing.AbstractButton javax.swing.AbstractButton javax.swing.AbstractBu

133、ttonl l javax.swing.JButton javax.swing.JButton javax.swing.JButton javax.swing.JButtonl l 5151JButtonJButton类有如下的构造方法:类有如下的构造方法:l lJButton() JButton() JButton() JButton() 创建空按钮。创建空按钮。创建空按钮。创建空按钮。l lJButton(Icon icon) JButton(Icon icon) JButton(Icon icon) JButton(Icon icon) 创建带图标的按钮。创建带图标的按钮。创建带图标的按

134、钮。创建带图标的按钮。l lJButton(String text) JButton(String text) JButton(String text) JButton(String text) 创建带文字的按钮。创建带文字的按钮。创建带文字的按钮。创建带文字的按钮。l lJButton(String JButton(String JButton(String JButton(String text, text, text, text, Icon Icon Icon Icon icon) icon) icon) icon) 创创创创建建建建带带带带文文文文字字字字和和和和图图图图标标标标的的的

135、的按按按按钮。钮。钮。钮。JButtonJButton组组件件与与AWTAWT的的ButtonButton组组件件相相比比,增增加加了了显显示示文文本中可用本中可用HTMLHTML标记,可带图标等功能。标记,可带图标等功能。在在 JButtonJButton按按 钮钮 的的 使使 用用 中中 , 常常 用用 到到 继继 承承 来来 的的setMnemonic()(setMnemonic()(设设置置快快捷捷字字母母键键) )、setActionCommand()setActionCommand()(设置动作命令)方法等。(设置动作命令)方法等。JButtonJButton组组 件件 引引 发发

136、 的的 事事 件件 为为 ActionEventActionEvent, 可可 实实 现现ActionListenerActionListener监监听听器器接接口口的的actionPerformed()actionPerformed()方方法法,用用addActionListener()addActionListener()方方法法注注册册,用用getActionCommandgetActionCommand() ()或或getSource()getSource()方法确定事件源。方法确定事件源。5252【例例9.99.9】设设计计一一个个GUIGUI应应用用程程序序,有有两两个个标标签签l

137、1l1、l2l2和和三三个个按按钮钮b1,b2,b3b1,b2,b3。l1l1标标签签显显示示固固定定的的文文字字,l2l2标标签签的的文文字字随随选选择择不不同同的的按按钮钮而而变变化化;选选择择b1b1按按钮钮时时,l2l2标标签签显显示示为为“欢欢迎迎进进入入JavaJava世世界界”,”,选选择择b2b2按按钮钮时时,l2l2标标签签显显示示当当前前的的日日期期, ,选选择择b3b3按按钮钮时时,退退出出该该应应用用程程序。程序如下:序。程序如下:l limport java.awt.*;import java.awt.*;import java.awt.*;import java.a

138、wt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.util.*;import java.util.*;import java.util.*;import java.util.*;l lpublic class JButtonDemo ex

139、tends Jpanelpublic class JButtonDemo extends Jpanelpublic class JButtonDemo extends Jpanelpublic class JButtonDemo extends Jpanell l implements ActionListener implements ActionListener implements ActionListener implements ActionListenerl l JButton b1,b2,b3; JButton b1,b2,b3; JButton b1,b2,b3; JButto

140、n b1,b2,b3;l l static JLabel l1,l2; static JLabel l1,l2; static JLabel l1,l2; static JLabel l1,l2;l l JButtonDemo() JButtonDemo() JButtonDemo() JButtonDemo()5353l ll1 = new JLabel(l1 = new JLabel(l1 = new JLabel(l1 = new JLabel(l l 这这是一个演示按是一个演示按是一个演示按是一个演示按钮动钮动作的程序作的程序作的程序作的程序,JLabel.CENTER);,JLabe

141、l.CENTER);,JLabel.CENTER);,JLabel.CENTER);l l l2 = new JLabel( ,JLabel.CENTER); l2 = new JLabel( ,JLabel.CENTER); l2 = new JLabel( ,JLabel.CENTER); l2 = new JLabel( ,JLabel.CENTER);l l b1 = new JButton( b1 = new JButton( b1 = new JButton( b1 = new JButton(欢欢迎迎迎迎w);w);w);w);l l b1.setMnemonic(KeyEven

142、t.VK_W);/ b1.setMnemonic(KeyEvent.VK_W);/ b1.setMnemonic(KeyEvent.VK_W);/ b1.setMnemonic(KeyEvent.VK_W);/ 设设置按置按置按置按钮钮的快捷的快捷的快捷的快捷键键l l b1.setActionCommand(welcome); b1.setActionCommand(welcome); b1.setActionCommand(welcome); b1.setActionCommand(welcome);l l b2 = new JButton( b2 = new JButton( b2 =

143、new JButton( b2 = new JButton(日期日期日期日期d);d);d);d);l l b2.setMnemonic(KeyEvent.VK_D);/ b2.setMnemonic(KeyEvent.VK_D);/ b2.setMnemonic(KeyEvent.VK_D);/ b2.setMnemonic(KeyEvent.VK_D);/ 设设置快捷字符置快捷字符置快捷字符置快捷字符为为D D D Dl l b2.setActionCommand(date); b2.setActionCommand(date); b2.setActionCommand(date); b2

144、.setActionCommand(date);l l b3 = new JButton( b3 = new JButton( b3 = new JButton( b3 = new JButton(退出退出退出退出q);q);q);q);l l b3.setMnemonic(KeyEvent.VK_Q);/ b3.setMnemonic(KeyEvent.VK_Q);/ b3.setMnemonic(KeyEvent.VK_Q);/ b3.setMnemonic(KeyEvent.VK_Q);/ 设设置快捷字符置快捷字符置快捷字符置快捷字符为为Q Q Q Ql l b3.setActionCo

145、mmand(quit); b3.setActionCommand(quit); b3.setActionCommand(quit); b3.setActionCommand(quit);l l b1.addActionListener(this); b1.addActionListener(this); b1.addActionListener(this); b1.addActionListener(this);l l b2.addActionListener(this); b2.addActionListener(this); b2.addActionListener(this); b2.a

146、ddActionListener(this);l l b3.addActionListener(this); b3.addActionListener(this); b3.addActionListener(this); b3.addActionListener(this);5454l ladd(b1);add(b2);add(b3);add(b1);add(b2);add(b3);add(b1);add(b2);add(b3);add(b1);add(b2);add(b3);l l l l public void actionPerformed(ActionEvent e) public v

147、oid actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e)l l Calendar c1 = Calendar.getInstance(); Calendar c1 = Calendar.getInstance(); Calendar c1 = Calendar.getInstance(); Calendar c1 = Calendar.getInstance();l l if(e.getActionCommand

148、().equals(welcome) if(e.getActionCommand().equals(welcome) if(e.getActionCommand().equals(welcome) if(e.getActionCommand().equals(welcome)l l l2.setText( l2.setText( l2.setText( l2.setText(欢欢迎迎迎迎进进入入入入JavaJavaJavaJava世界。世界。世界。世界。););););l l else if(e.getActionCommand().equals(date) else if(e.getActi

149、onCommand().equals(date) else if(e.getActionCommand().equals(date) else if(e.getActionCommand().equals(date)l l l2.setText( l2.setText( l2.setText( l2.setText(今天是今天是今天是今天是+c1.get(Calendar.YEAR)+c1.get(Calendar.YEAR)+c1.get(Calendar.YEAR)+c1.get(Calendar.YEAR)+l l 年年年年+(c1.get(Calendar.MONTH)+1)+(c1.

150、get(Calendar.MONTH)+1)+(c1.get(Calendar.MONTH)+1)+(c1.get(Calendar.MONTH)+1)+l l 月月月月 + c1.get(Calendar.DATE) + + c1.get(Calendar.DATE) + + c1.get(Calendar.DATE) + + c1.get(Calendar.DATE) + 日日日日););););l l else System.exit(0); else System.exit(0); else System.exit(0); else System.exit(0);l l l2.setH

151、orizontalAlignment(JLabel.CENTER); l2.setHorizontalAlignment(JLabel.CENTER); l2.setHorizontalAlignment(JLabel.CENTER); l2.setHorizontalAlignment(JLabel.CENTER);l l / / / / 标签标签文字水平居中文字水平居中文字水平居中文字水平居中l l 5555l l public static void main(String args)public static void main(String args)public static vo

152、id main(String args)public static void main(String args)l l JFrame frame=new JFrame( JFrame frame=new JFrame( JFrame frame=new JFrame( JFrame frame=new JFrame(使用使用使用使用JButton);JButton);JButton);JButton);l l frame.getContentPane().add(new frame.getContentPane().add(new frame.getContentPane().add(new

153、frame.getContentPane().add(newl l JButtonDemo(),BorderLayout.SOUTH); JButtonDemo(),BorderLayout.SOUTH); JButtonDemo(),BorderLayout.SOUTH); JButtonDemo(),BorderLayout.SOUTH);l l frame.getContentPane().add(l1,BorderLayout.NORTHframe.getContentPane().add(l1,BorderLayout.NORTHframe.getContentPane().add(

154、l1,BorderLayout.NORTHframe.getContentPane().add(l1,BorderLayout.NORTH););););l l frame.getContentPane().add(l2,BorderLayout.CENTEframe.getContentPane().add(l2,BorderLayout.CENTEframe.getContentPane().add(l2,BorderLayout.CENTEframe.getContentPane().add(l2,BorderLayout.CENTER);R);R);R);l l frame.setDe

155、faultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation(l l JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE);l l frame.pack(); frame.pack(); frame.pack(); frame.pack();l l frame.setVisible(true); fr

156、ame.setVisible(true); frame.setVisible(true); frame.setVisible(true);l l l l 本本程程序序中中命命令令按按钮钮设设置置了了快快捷捷字字母母键键,可可用用鼠鼠标标单单击击或按或按Alt + Alt + 快捷字母来选择按钮快捷字母来选择按钮。5656例例9.99.9运运行行启启动动后后选选择择 “欢欢迎迎” ” 按按钮钮和和选选择择“日日期期”按钮后显示的情况见下左图和下右图。按钮后显示的情况见下左图和下右图。【例【例9.9.1010】带图形和带图形和HTMLHTML文字的按钮。文字的按钮。l limport java.a

157、wt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;5757l lpublic class JButtonDemo1 extends JFramepublic class JButtonDemo1 extends JFramepublic class JButtonDemo1 extends JFramepublic class JButtonDemo1 e

158、xtends JFramel l public static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args)l l new JButtonDemo1( ); new JButtonDemo1( ); new JButtonDemo1( ); new JButtonDemo1( );l l l lpublic JButtonDemo1( )public JButtonDemo1(

159、 )public JButtonDemo1( )public JButtonDemo1( )l l super(Using JButton); super(Using JButton); super(Using JButton); super(Using JButton);l l Container content = getContentPane(); Container content = getContentPane(); Container content = getContentPane(); Container content = getContentPane();l l cont

160、ent.setBackground(Color.white); content.setBackground(Color.white); content.setBackground(Color.white); content.setBackground(Color.white);l l content.setLayout(new FlowLayout(); content.setLayout(new FlowLayout(); content.setLayout(new FlowLayout(); content.setLayout(new FlowLayout();l l JButton bu

161、tton1 = new JButton( JButton button1 = new JButton( JButton button1 = new JButton( JButton button1 = new JButton( Java); Java); Java); Java);l l content.add(button1); content.add(button1); content.add(button1); content.add(button1);l l ImageIcon im = new ImageIcon( ImageIcon im = new ImageIcon( Imag

162、eIcon im = new ImageIcon( ImageIcon im = new ImageIcon( images/newssms.gif); images/newssms.gif); images/newssms.gif); images/newssms.gif);l l JButton button2 = new JButton(im); JButton button2 = new JButton(im); JButton button2 = new JButton(im); JButton button2 = new JButton(im); 5858l l content.a

163、dd(button2);content.add(button2);content.add(button2);content.add(button2);l l JButton button3 = new JButton(Java, im); JButton button3 = new JButton(Java, im); JButton button3 = new JButton(Java, im); JButton button3 = new JButton(Java, im);l l content.add(button3); content.add(button3); content.ad

164、d(button3); content.add(button3);l l JButton button4 = new JButton(Java, im); JButton button4 = new JButton(Java, im); JButton button4 = new JButton(Java, im); JButton button4 = new JButton(Java, im);l l button4.setHorizontalTextPosition( button4.setHorizontalTextPosition( button4.setHorizontalTextP

165、osition( button4.setHorizontalTextPosition(l l SwingConstants.LEFT); SwingConstants.LEFT); SwingConstants.LEFT); SwingConstants.LEFT);l l content.add(button4); content.add(button4); content.add(button4); content.add(button4);l l setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperatio

166、n(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);l l pack(); pack(); pack(); pack();l l setVisible(true); setVisible(true); setVisible(true); setVisible(true);l l l l 5959程序中使用了类程序中使用了类IconImageIconImage和指定图标图像文件名来和指定图标图像文件名来创建图标

167、图像对象,程序的运行结果如下图所示。创建图标图像对象,程序的运行结果如下图所示。60609.3.3 9.3.3 标签(标签(JLabelJLabel)标标签签是是用用户户不不能能修修改改只只能能查查看看其其内内容容的的组组件件,常常用用来来在在界界面面上上输输出出信信息息。JLabelJLabel类类提提供供了了对对标标签签的的支支持持,它它的的类类层层次次关关系系为为:javax.swing.JComponent javax.swing.JComponent - javax.swing.JLabel- javax.swing.JLabel。JLabelJLabel类的构造方法有:类的构造方法

168、有:l lJLabel() JLabel() JLabel() JLabel() 创创建一个空建一个空建一个空建一个空标签标签。 。 。 。l lJLabel(Icon image) JLabel(Icon image) JLabel(Icon image) JLabel(Icon image) 创创建一个建一个建一个建一个带带指定指定指定指定图图像的像的像的像的标签标签。 。 。 。l lJLabel(Icon JLabel(Icon JLabel(Icon JLabel(Icon image, image, image, image, int int int int horizontalA

169、lignment)horizontalAlignment)horizontalAlignment)horizontalAlignment)创创建建建建一一一一个个个个带带指定指定指定指定图图像和水平像和水平像和水平像和水平对齐对齐方式的方式的方式的方式的标签标签。 。 。 。l lJLabel(String text) JLabel(String text) JLabel(String text) JLabel(String text) 创创建一个建一个建一个建一个带带文字的文字的文字的文字的标签标签。 。 。 。l lJLabel(String JLabel(String JLabel(St

170、ring JLabel(String text, text, text, text, Icon Icon Icon Icon icon, icon, icon, icon, int int int int horizontalAlignment)horizontalAlignment)horizontalAlignment)horizontalAlignment)创创建建建建一一一一个个个个带带文文文文字字字字、 、 、 、图图像像像像和和和和指指指指定定定定水水水水平平平平对齐对齐方式的方式的方式的方式的标签标签。 。 。 。 6161l lJLabel(String JLabel(Stri

171、ng text, text, int int horizontalAlignment)horizontalAlignment)创创建建一一个带文字和指定水平对齐方式的标签。个带文字和指定水平对齐方式的标签。其其中中,horizontalAlignmenthorizontalAlignment水水平平对对齐齐方方式式可可以以使使用用表表示示左左对对齐齐、右右对对齐齐、居居中中对对齐齐的的常常量量JLabel.LEFTJLabel.LEFT、JLabel.LEFTJLabel.LEFT和和JLabel.CENTERJLabel.CENTER。【例【例9.119.11】具有文字对齐的标签。】具有文字

172、对齐的标签。l limport javax.swing.*;import javax.swing.*;l limport java.awt.*;import java.awt.*;l lpublic class JLabelAlignDemo extends JApplet public class JLabelAlignDemo extends JApplet l l public void init() public void init()l l Container c = getContentPane(); Container c = getContentPane();l l c.add

173、(new JLabel( c.add(new JLabel(文字左文字左对齐标签对齐标签,JLabel.LEFT),JLabel.LEFT),l l BorderLayout.NORTH); BorderLayout.NORTH);l l c.add(new JLabel( c.add(new JLabel(文字右文字右对齐标签对齐标签,JLabel.RIGHT),JLabel.RIGHT),l l BorderLayout.CENTER); BorderLayout.CENTER);6262l l c.add(new JLabel(c.add(new JLabel(c.add(new JLa

174、bel(c.add(new JLabel(文字居中文字居中文字居中文字居中标签标签,JLabel.CENTER),JLabel.CENTER),JLabel.CENTER),JLabel.CENTER),l l BorderLayout.SOUTH); BorderLayout.SOUTH); BorderLayout.SOUTH); BorderLayout.SOUTH);l l l l 程序运行结果见下图。程序运行结果见下图。6363JLabelJLabel类常用方法有:类常用方法有:l lpublic public public public void void void void se

175、tText(String setText(String setText(String setText(String text)text)text)text)定定定定义义这这个个个个组组件件件件将将将将显显示示示示的的的的单单行文字。行文字。行文字。行文字。l lpublic String getText() public String getText() public String getText() public String getText() 返回返回返回返回标签显标签显示的文字。示的文字。示的文字。示的文字。l lpublic Icon getIcon() public Icon ge

176、tIcon() public Icon getIcon() public Icon getIcon() 返回返回返回返回标签显标签显示的示的示的示的图图像。像。像。像。l lpublic public public public void void void void setIcon(Icon setIcon(Icon setIcon(Icon setIcon(Icon icon)icon)icon)icon)定定定定义义这这个个个个组组件件件件将将将将显显示示示示的的的的图图标标。 。 。 。【例【例9.129.12】使用带图标的标签。】使用带图标的标签。l limport javax.sw

177、ing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.awt.*; import java.awt.*; import java.awt.*; import java.awt.*; l limport java.awt.event.*; import java.awt.event.*; import java.awt.event.*; import java.awt.event.*; l lpublic class JLabelDemo extends JApplet public

178、 class JLabelDemo extends JApplet public class JLabelDemo extends JApplet public class JLabelDemo extends JApplet l l public void init() public void init() public void init() public void init() l l Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane(); Contai

179、ner c = getContentPane(); l l Icon icon = new ImageIcon(images/cup.gif); Icon icon = new ImageIcon(images/cup.gif); Icon icon = new ImageIcon(images/cup.gif); Icon icon = new ImageIcon(images/cup.gif); 6464l l JLabel label = new JLabel(JLabel label = new JLabel(JLabel label = new JLabel(JLabel label

180、 = new JLabel(l l Swing!, icon, JLabel.CENTER); Swing!, icon, JLabel.CENTER); Swing!, icon, JLabel.CENTER); Swing!, icon, JLabel.CENTER); l l c.add(label, BorderLayout.CENTER); c.add(label, BorderLayout.CENTER); c.add(label, BorderLayout.CENTER); c.add(label, BorderLayout.CENTER); l l l l 程序运行结果如下图所

181、示。程序运行结果如下图所示。65659.3.4 9.3.4 复选框(复选框(JCheckBoxJCheckBox)JCheckBoxJCheckBox类类提提供供复复选选框框按按钮钮的的支支持持。复复选选框框按按钮钮是是具具有有开开关关或或真真假假状状态态的的按按钮钮。JCheckBoxJCheckBox类类的的层层次次关关系为:系为:l l javax.swing.AbstractButtonjavax.swing.AbstractButtonjavax.swing.AbstractButtonjavax.swing.AbstractButtonl l javax.swing.JToggle

182、Button javax.swing.JToggleButton javax.swing.JToggleButton javax.swing.JToggleButtonl l javax.swing.JCheckBox javax.swing.JCheckBox javax.swing.JCheckBox javax.swing.JCheckBoxJCheckBoxJCheckBox类的构造方法如下:类的构造方法如下:l lJCheckBox()JCheckBox()JCheckBox()JCheckBox()创创建无文本的初始未建无文本的初始未建无文本的初始未建无文本的初始未选选复复复复选选

183、框按框按框按框按钮钮。 。 。 。l lJCheckBox(Icon JCheckBox(Icon JCheckBox(Icon JCheckBox(Icon icon)icon)icon)icon)创创建建建建有有有有图图像像像像无无无无文文文文本本本本的的的的初初初初始始始始未未未未选选复复复复选选框按框按框按框按钮钮。 。 。 。l lJCheckBox(Icon JCheckBox(Icon JCheckBox(Icon JCheckBox(Icon icon, icon, icon, icon, boolean boolean boolean boolean selected)sel

184、ected)selected)selected)创创建建建建带带图图像像像像和和和和选择选择状状状状态态但无文本的复但无文本的复但无文本的复但无文本的复选选框按框按框按框按钮钮。 。 。 。 6666l lJCheckBox(String JCheckBox(String JCheckBox(String JCheckBox(String text)text)text)text)创创建建建建带带文文文文本本本本的的的的初初初初始始始始未未未未选选复复复复选选框框框框按按按按钮钮。 。 。 。l lJCheckBox(String JCheckBox(String JCheckBox(Strin

185、g JCheckBox(String text, text, text, text, boolean boolean boolean boolean selected)selected)selected)selected)创创建建建建具具具具有有有有指定文本和状指定文本和状指定文本和状指定文本和状态态的复的复的复的复选选框按框按框按框按钮钮。 。 。 。l lJCheckBox(String JCheckBox(String JCheckBox(String JCheckBox(String text, text, text, text, Icon Icon Icon Icon icon)ic

186、on)icon)icon)创创建建建建具具具具有有有有指指指指定定定定文文文文本和本和本和本和图标图图标图像的初始未像的初始未像的初始未像的初始未选选复复复复选选框按框按框按框按钮钮。 。 。 。l lJCheckBox(String JCheckBox(String JCheckBox(String JCheckBox(String text, text, text, text, Icon Icon Icon Icon icon, icon, icon, icon, boolean boolean boolean boolean selected)selected)selected)sele

187、cted)创创建建建建具具具具有有有有指指指指定定定定文文文文本本本本、 、 、 、图图标标图图像像像像、 、 、 、选选择择状状状状态态的的的的复复复复选选框按框按框按框按钮钮。 。 。 。其其中中,构构造造方方法法的的参参数数selectedselected若若为为真真,则则表表示示按按钮初始状态为选中。钮初始状态为选中。JCheckBoxJCheckBox类类常常用用的的方方法法有有继继承承来来的的方方法法isSelectedisSelected()(),其格式为:,其格式为:l lpublic public public public boolean boolean boolean b

188、oolean isSelected()isSelected()isSelected()isSelected()当当当当复复复复选选框框框框按按按按钮钮选选中中中中时时返返返返回回回回truetruetruetrue,否,否,否,否则则返回返回返回返回falsefalsefalsefalse。 。 。 。6767JCheckBoxJCheckBox类类 的的 选选 择择 事事 件件 是是 ItemEvent ItemEvent , 可可 实实 现现ItemListenerItemListener监监听听器器接接口口的的itemStateChanged()itemStateChanged()方方法

189、法来处理事件,用来处理事件,用addItemListener()addItemListener()方法注册。方法注册。【例例9.139.13】选选择择粗粗体体、斜斜体体复复选选框框按按钮钮,改改变变文文本本框框中显示文字的字形。中显示文字的字形。l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt

190、.event.*;l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l lpublic class JCheckBoxDemo extends Jappletpublic class JCheckBoxDemo extends Jappletpublic class JCheckBoxDemo extends Jappletpublic class JCheckBoxDemo extends Jappletl l implements ItemListener implements ItemLi

191、stener implements ItemListener implements ItemListenerl l private JTextField t; private JTextField t; private JTextField t; private JTextField t;l l private JCheckBox bold,italic; private JCheckBox bold,italic; private JCheckBox bold,italic; private JCheckBox bold,italic;l l public void init() publi

192、c void init() public void init() public void init()l l t = new JTextField( t = new JTextField( t = new JTextField( t = new JTextField(观观察察察察这这里文字字形的里文字字形的里文字字形的里文字字形的变变化化化化,40);,40);,40);,40);6868l lt.setFont(new Font(Serif,Font.PLAIN,20);t.setFont(new Font(Serif,Font.PLAIN,20);t.setFont(new Font(Se

193、rif,Font.PLAIN,20);t.setFont(new Font(Serif,Font.PLAIN,20);l l getContentPane().add(t,BorderLayout.NORTH); getContentPane().add(t,BorderLayout.NORTH); getContentPane().add(t,BorderLayout.NORTH); getContentPane().add(t,BorderLayout.NORTH);l l bold = new JCheckBox( bold = new JCheckBox( bold = new JCh

194、eckBox( bold = new JCheckBox(粗体粗体粗体粗体Bold);Bold);Bold);Bold);l l bold.addItemListener(this); bold.addItemListener(this); bold.addItemListener(this); bold.addItemListener(this);l l getContentPane().add(bold,BorderLayout.CENTER); getContentPane().add(bold,BorderLayout.CENTER); getContentPane().add(bol

195、d,BorderLayout.CENTER); getContentPane().add(bold,BorderLayout.CENTER);l l italic = new JCheckBox( italic = new JCheckBox( italic = new JCheckBox( italic = new JCheckBox(斜体斜体斜体斜体Italic);Italic);Italic);Italic);l l italic.addItemListener(this); italic.addItemListener(this); italic.addItemListener(thi

196、s); italic.addItemListener(this);l l getContentPane().add(italic,BorderLayout.SOUTH); getContentPane().add(italic,BorderLayout.SOUTH); getContentPane().add(italic,BorderLayout.SOUTH); getContentPane().add(italic,BorderLayout.SOUTH);l l l l public void itemStateChanged(ItemEvent e) public void itemSt

197、ateChanged(ItemEvent e) public void itemStateChanged(ItemEvent e) public void itemStateChanged(ItemEvent e)l l int b = bold.isSelected()?Font.BOLD:Font.PLAIN; int b = bold.isSelected()?Font.BOLD:Font.PLAIN; int b = bold.isSelected()?Font.BOLD:Font.PLAIN; int b = bold.isSelected()?Font.BOLD:Font.PLAI

198、N;l l int i = int i = int i = int i =l l italic.isSelected()?Font.ITALIC:Font.PLAIN; italic.isSelected()?Font.ITALIC:Font.PLAIN; italic.isSelected()?Font.ITALIC:Font.PLAIN; italic.isSelected()?Font.ITALIC:Font.PLAIN;l l t.setFont(new Font(Serif,b + i,20); t.setFont(new Font(Serif,b + i,20); t.setFon

199、t(new Font(Serif,b + i,20); t.setFont(new Font(Serif,b + i,20);l l l l 6969程序运行结果如下图所示。程序运行结果如下图所示。70709.3.5 9.3.5 单选按钮单选按钮(JRadioButton)(JRadioButton)在在一一组组单单选选按按钮钮中中,可可进进行行选选择择其其中中一一个个的的操操作作,即即进进行行“多多选选一一”。JRadioButtonJRadioButton类类的的类类层层次次和和构构造造方方法法的的参参数数构构成成都都与与前前面面介介绍绍的的JCheckBoxJCheckBox类类相相同同

200、。这这里里不再列出不再列出JRadioButtonJRadioButton类的这些内容。类的这些内容。因因为为单单选选按按钮钮是是在在一一组组按按钮钮中中选选择择一一个个,因因此此,必必须须将将单单选选按按钮钮分分组组,即即指指明明在在一一个个组组中中包包含含哪哪些些按按钮钮。可可用用ButtonGroupButtonGroup创创建建按按钮钮组组对对象象,应应用用对对象象的的add()add()方法顺序加入各个单选按钮。方法顺序加入各个单选按钮。在在单单选选按按钮钮中中也也可可以以使使用用HTMLHTML代代码码。这这是是Java Java SDK SDK 1.31.3版新增的功能。版新增的

201、功能。单选按钮的选择事件是单选按钮的选择事件是ActionEventActionEvent类事件。类事件。【例例9.149.14】使使用用单单选选按按钮钮来来设设置置SwingSwing应应用用程程序序的的不不同同观感。观感。7171l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limport

202、 javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l lpublic class JRadioButtonDemo extends JPanel public class JRadioButtonDemo extends JPanel public class JRadioButtonDemo extends JPanel public class JRadioButtonDemo extends JPanel l l static JFrame frame; static JFrame

203、frame; static JFrame frame; static JFrame frame;l l static String metal= Metal; static String metal= Metal; static String metal= Metal; static String metal= Metal;l l static String motif = Motif; static String motif = Motif; static String motif = Motif; static String motif = Motif;l l static String

204、windows = Windows; static String windows = Windows; static String windows = Windows; static String windows = Windows;l l JRadioButton metalButton, motifButton,windowsButton; JRadioButton metalButton, motifButton,windowsButton; JRadioButton metalButton, motifButton,windowsButton; JRadioButton metalBu

205、tton, motifButton,windowsButton;l l public JRadioButtonDemo() public JRadioButtonDemo() public JRadioButtonDemo() public JRadioButtonDemo()l l JButton button = new JButton(Hello, world); JButton button = new JButton(Hello, world); JButton button = new JButton(Hello, world); JButton button = new JBut

206、ton(Hello, world);l l button.setMnemonic(h); button.setMnemonic(h); button.setMnemonic(h); button.setMnemonic(h);l l metalButton = new JRadioButton(metal); metalButton = new JRadioButton(metal); metalButton = new JRadioButton(metal); metalButton = new JRadioButton(metal);l l metalButton.setMnemonic(

207、o); metalButton.setMnemonic(o); metalButton.setMnemonic(o); metalButton.setMnemonic(o); l l metalButton.setActionCommand(metal); metalButton.setActionCommand(metal); metalButton.setActionCommand(metal); metalButton.setActionCommand(metal);7272l lmotifButton = new JRadioButton(motif);motifButton = ne

208、w JRadioButton(motif);motifButton = new JRadioButton(motif);motifButton = new JRadioButton(motif);l lmotifButton.setMnemonic(m); motifButton.setMnemonic(m); motifButton.setMnemonic(m); motifButton.setMnemonic(m); l lmotifButton.setActionCommand(motif);motifButton.setActionCommand(motif);motifButton.

209、setActionCommand(motif);motifButton.setActionCommand(motif);l lwindowsButton = new JRadioButton(windows);windowsButton = new JRadioButton(windows);windowsButton = new JRadioButton(windows);windowsButton = new JRadioButton(windows);l lwindowsButton.setMnemonic(w); windowsButton.setMnemonic(w); window

210、sButton.setMnemonic(w); windowsButton.setMnemonic(w); l lwindowsButton.setActionCommand(windows);windowsButton.setActionCommand(windows);windowsButton.setActionCommand(windows);windowsButton.setActionCommand(windows);l l/ / / / 将将将将单选单选按按按按钮设钮设置置置置为为一一一一组组l lButtonGroup group = new ButtonGroup();But

211、tonGroup group = new ButtonGroup();ButtonGroup group = new ButtonGroup();ButtonGroup group = new ButtonGroup();l lgroup.add(metalButton);group.add(metalButton);group.add(metalButton);group.add(metalButton);l lgroup.add(motifButton);group.add(motifButton);group.add(motifButton);group.add(motifButton)

212、;l lgroup.add(windowsButton);group.add(windowsButton);group.add(windowsButton);group.add(windowsButton);l l/ / / / 对单选对单选按按按按钮设钮设置置置置监监听器听器听器听器l lRadioListener myListener = new RadioListener();RadioListener myListener = new RadioListener();RadioListener myListener = new RadioListener();RadioListener

213、 myListener = new RadioListener();l lmetalButton.addActionListener(myListener);metalButton.addActionListener(myListener);metalButton.addActionListener(myListener);metalButton.addActionListener(myListener);l lmotifButton.addActionListener(myListener);motifButton.addActionListener(myListener);motifBut

214、ton.addActionListener(myListener);motifButton.addActionListener(myListener);7373l l windowsButton.addActionListener(myListener);windowsButton.addActionListener(myListener);windowsButton.addActionListener(myListener);windowsButton.addActionListener(myListener);l l add(button); add(button); add(button

215、); add(button);l l add(metalButton); add(metalButton); add(metalButton); add(metalButton);l l add(motifButton); add(motifButton); add(motifButton); add(motifButton); l l add(windowsButton); add(windowsButton); add(windowsButton); add(windowsButton);l l l l/* ActionListener/* ActionListener/* ActionL

216、istener/* ActionListener监监听器听器听器听器监监听听听听单选单选按按按按钮钮*/*/*/*/l lclass RadioListener implements ActionListener class RadioListener implements ActionListener class RadioListener implements ActionListener class RadioListener implements ActionListener l l / / / / 嵌套嵌套嵌套嵌套类类l l public void actionPerformed(A

217、ctionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) l l if(e.getActionCommand().equals(metal) if(e.getActionCommand().equals(metal) if(e.getActionCommand().equals(metal) if(e.getActionCommand().equals(metal)l

218、l SetLAF.setJavaLookAndFeel(); SetLAF.setJavaLookAndFeel(); SetLAF.setJavaLookAndFeel(); SetLAF.setJavaLookAndFeel();l l else if(e.getActionCommand().equals(motif) else if(e.getActionCommand().equals(motif) else if(e.getActionCommand().equals(motif) else if(e.getActionCommand().equals(motif)l l SetL

219、AF.setMotifLookAndFeel(); SetLAF.setMotifLookAndFeel(); SetLAF.setMotifLookAndFeel(); SetLAF.setMotifLookAndFeel();l l else SetLAF.setNativeLookAndFeel(); else SetLAF.setNativeLookAndFeel(); else SetLAF.setNativeLookAndFeel(); else SetLAF.setNativeLookAndFeel();l l SwingUtilities.updateComponentTree

220、UI(frame); SwingUtilities.updateComponentTreeUI(frame); SwingUtilities.updateComponentTreeUI(frame); SwingUtilities.updateComponentTreeUI(frame);7474l lframe.pack();frame.pack();frame.pack();frame.pack();l l l l l l public static void main(String s) public static void main(String s) public static vo

221、id main(String s) public static void main(String s) l l JRadioButtonDemo panel = new JRadioButtonDemo(); JRadioButtonDemo panel = new JRadioButtonDemo(); JRadioButtonDemo panel = new JRadioButtonDemo(); JRadioButtonDemo panel = new JRadioButtonDemo();l l frame = new JFrame( frame = new JFrame( frame

222、 = new JFrame( frame = new JFrame(使用使用使用使用JRadioButtonJRadioButtonJRadioButtonJRadioButton选择观选择观感感感感););););l l frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation(l l JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT

223、_ON_CLOSE); JFrame.EXIT_ON_CLOSE);l l frame.getContentPane().add(Center, panel); frame.getContentPane().add(Center, panel); frame.getContentPane().add(Center, panel); frame.getContentPane().add(Center, panel);l l frame.pack(); frame.pack(); frame.pack(); frame.pack();l l frame.setVisible(true); fram

224、e.setVisible(true); frame.setVisible(true); frame.setVisible(true);l l l l 程程序序运运行行时时可可用用单单选选按按钮钮选选择择三三种种不不同同的的观观感感,运运行行结果如下图上、中和下所示。结果如下图上、中和下所示。 7575v例9.14程序运行时选择不同单选按钮的界面。76769.3.6 9.3.6 文文 本本 框框 ( JTextFieldJTextField、 JPassWordJPassWord和和JTextAreaJTextArea)JavaJava语语言言提提供供了了单单行行文文本本框框、口口令令框框和和多

225、多行行文文本本框框等等文本框形式,它们都是人机交互的主要组件。文本框形式,它们都是人机交互的主要组件。1 1单行文本框(单行文本框(JTextFieldJTextField)单单行行文文本本框框一一般般用用来来让让用用户户输输入入如如姓姓名名、地地址址这这样样的的信信息息,它它是是一一个个能能够够接接收收用用户户的的键键盘盘输输入入的的单单行行文文本本区区域域。类类JTextFieldJTextField提提供供对对单单行行文文本本框框的的支支持持,它它的的类层次如下:类层次如下:l l javax.swing.Jcomponentjavax.swing.Jcomponentjavax.swi

226、ng.Jcomponentjavax.swing.Jcomponentl l javax.swing.text.JTextComponent javax.swing.text.JTextComponent javax.swing.text.JTextComponent javax.swing.text.JTextComponentl l javax.swing.JTextField javax.swing.JTextField javax.swing.JTextField javax.swing.JTextFieldJTextFieldJTextField类有如下的几种构造方法:类有如下的几种

227、构造方法:l lJTextField( ) JTextField( ) JTextField( ) JTextField( ) 创创建一个新的建一个新的建一个新的建一个新的单单行文本框。行文本框。行文本框。行文本框。7777l lJTextField(int JTextField(int JTextField(int JTextField(int columns) columns) columns) columns) 创创建建建建具具具具有有有有指指指指定定定定长长度度度度的的的的空空空空单单行行行行文文文文本本本本框。框。框。框。l lJTextField(String JTextField

228、(String JTextField(String JTextField(String text) text) text) text) 创创建建建建带带初初初初始始始始文文文文本本本本内内内内容容容容的的的的单单行行行行文文文文本本本本框。框。框。框。l lJTextField(String JTextField(String JTextField(String JTextField(String text, text, text, text, int int int int columns) columns) columns) columns) 创创建建建建带带初初初初始始始始文文文文本本本

229、本内容并具有指定内容并具有指定内容并具有指定内容并具有指定长长度的度的度的度的单单行文本框。行文本框。行文本框。行文本框。JTextFieldJTextField类的常用方法有:类的常用方法有:l lpublic void setText(String s)public void setText(String s)public void setText(String s)public void setText(String s)在文本框中在文本框中在文本框中在文本框中显显示字符串示字符串示字符串示字符串s s s s。 。 。 。l lpublic String getText()public

230、 String getText()public String getText()public String getText()获获得文本框中的字符串。得文本框中的字符串。得文本框中的字符串。得文本框中的字符串。当当用用户户在在文文本本框框里里敲敲“回回车车”键键时时,就就产产生生了了一一个个ActionEventActionEvent事事件件。当当用用户户在在文文本本框框中中移移动动文文本本光光标标时时,就就产产生生CaretEventCaretEvent事事件件,可可注注册册addCaretListeneraddCaretListener监监听听器器,实实现现CaretListenerCar

231、etListener的的caretUpdate()caretUpdate()进进行行事事件件处理。处理。7878【例例9.159.15】编编写写温温度度变变换换的的应应用用程程序序,将将摄摄氏氏温温度度转转换为华氏温度。换为华氏温度。 l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limpor

232、t javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l lpublic class CelsiusConverterpublic class CelsiusConverterpublic class CelsiusConverterpublic class CelsiusConverterl l implements ActionListener implements ActionListener implements ActionListener implements ActionLis

233、tener l l JFrame frame; JFrame frame; JFrame frame; JFrame frame;l l JPanel panel; JPanel panel; JPanel panel; JPanel panel;l l JTextField tempCelsius; JTextField tempCelsius; JTextField tempCelsius; JTextField tempCelsius;l l JLabel celsiusLabel, fahrenheitLabel; JLabel celsiusLabel, fahrenheitLabe

234、l; JLabel celsiusLabel, fahrenheitLabel; JLabel celsiusLabel, fahrenheitLabel;l l JButton convertTemp; JButton convertTemp; JButton convertTemp; JButton convertTemp;l l public CelsiusConverter() / public CelsiusConverter() / public CelsiusConverter() / public CelsiusConverter() / 构造方法构造方法构造方法构造方法l l

235、 frame = new JFrame( frame = new JFrame( frame = new JFrame( frame = new JFrame(温度温度温度温度变换变换););););l l panel = new JPanel(); panel = new JPanel(); panel = new JPanel(); panel = new JPanel();l l panel.setLayout(new GridLayout(2, 2); panel.setLayout(new GridLayout(2, 2); panel.setLayout(new GridLayou

236、t(2, 2); panel.setLayout(new GridLayout(2, 2);7979l l tempCelsius = new JTextField();tempCelsius = new JTextField();tempCelsius = new JTextField();tempCelsius = new JTextField();l l celsiusLabel = new JLabel( celsiusLabel = new JLabel( celsiusLabel = new JLabel( celsiusLabel = new JLabel(摄摄氏温度氏温度氏温度

237、氏温度 = ); = ); = ); = );l l convertTemp = new JButton( convertTemp = new JButton( convertTemp = new JButton( convertTemp = new JButton(变换变换););););l l fahrenheitLabel = new JLabel( fahrenheitLabel = new JLabel( fahrenheitLabel = new JLabel( fahrenheitLabel = new JLabel(?华华氏温度氏温度氏温度氏温度););););l l conv

238、ertTemp.addActionListener(this); convertTemp.addActionListener(this); convertTemp.addActionListener(this); convertTemp.addActionListener(this); l l panel.add(tempCelsius); panel.add(tempCelsius); panel.add(tempCelsius); panel.add(tempCelsius);l l panel.add(celsiusLabel); panel.add(celsiusLabel); pan

239、el.add(celsiusLabel); panel.add(celsiusLabel);l l panel.add(convertTemp); panel.add(convertTemp); panel.add(convertTemp); panel.add(convertTemp);l l panel.add(fahrenheitLabel); panel.add(fahrenheitLabel); panel.add(fahrenheitLabel); panel.add(fahrenheitLabel);l l frame.getContentPane().add( frame.ge

240、tContentPane().add( frame.getContentPane().add( frame.getContentPane().add(l l panel,BorderLayout.CENTER); panel,BorderLayout.CENTER); panel,BorderLayout.CENTER); panel,BorderLayout.CENTER);l l frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setD

241、efaultCloseOperation(l l JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE);l l frame.pack();/ frame.pack();/ frame.pack();/ frame.pack();/ 显显示示示示变换变换程序程序程序程序l l frame.setVisible(true); frame.setVisible(true); frame.setVisible(true); frame.setVisible(true);l l

242、 8080l l/ / / / 实现监实现监听器接口听器接口听器接口听器接口l l public public public public void void void void actionPerformed(ActionEvent actionPerformed(ActionEvent actionPerformed(ActionEvent actionPerformed(ActionEvent event) event) event) event) l l int tempF; int tempF; int tempF; int tempF;l l tempF = (int)(Doubl

243、e.parseDouble( tempF = (int)(Double.parseDouble( tempF = (int)(Double.parseDouble( tempF = (int)(Double.parseDouble(l l tempCelsius.getText() * 1.8 + 32); tempCelsius.getText() * 1.8 + 32); tempCelsius.getText() * 1.8 + 32); tempCelsius.getText() * 1.8 + 32);l l fahrenheitLabel.setText(tempF fahrenh

244、eitLabel.setText(tempF fahrenheitLabel.setText(tempF fahrenheitLabel.setText(tempF + + + + 华华氏氏氏氏温温温温度度度度););););l l l l public static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args) l l CelsiusConverter converter

245、= CelsiusConverter converter = CelsiusConverter converter = CelsiusConverter converter =l l new CelsiusConverter(); new CelsiusConverter(); new CelsiusConverter(); new CelsiusConverter();l l l l 程序运行显示如下图所示。程序运行显示如下图所示。 81812 2口令框(口令框(JPasswordFieldJPasswordField)单单行行口口令令文文本本框框JPasswordFieldJPasswor

246、dField类类是是JTextFieldJTextField类类的的子子类类。在在JPasswordFieldJPasswordField对对象象中中输输入入的的文文字字会会被被其其他他字符替代,这个组件常用来在字符替代,这个组件常用来在JavaJava程序中输入口令。程序中输入口令。JPasswordFieldJPasswordField类类的的构构造造方方法法与与JTextFieldJTextField类类的的构构造造方法类似,常用的其他方法有:方法类似,常用的其他方法有:l lchar getPassword() char getPassword() char getPassword()

247、 char getPassword() 返回返回返回返回输输入的口令。入的口令。入的口令。入的口令。l lchar char char char getEchoChar() getEchoChar() getEchoChar() getEchoChar() 返返返返回回回回输输入入入入文文文文本本本本时时回回回回显显在在在在框框框框中中中中的的的的字字字字符符符符。 。 。 。回回回回显显字符缺省字符缺省字符缺省字符缺省为为字符字符字符字符“*”“*”“*”“*”。 。 。 。l lvoid setEchoChar(char c) void setEchoChar(char c) void s

248、etEchoChar(char c) void setEchoChar(char c) 设设置回置回置回置回显显字符。字符。字符。字符。8282【例【例9.169.16】使用口令框。】使用口令框。l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limport javax.swing.*;impo

249、rt javax.swing.*;import javax.swing.*;import javax.swing.*;l lpublic class JPasswordFieldDemo extends JApplet public class JPasswordFieldDemo extends JApplet public class JPasswordFieldDemo extends JApplet public class JPasswordFieldDemo extends JApplet l l implements ActionListener implements Actio

250、nListener implements ActionListener implements ActionListenerl l JLabel jl1,jl2; JLabel jl1,jl2; JLabel jl1,jl2; JLabel jl1,jl2;l l JPasswordField jp1,jp2; JPasswordField jp1,jp2; JPasswordField jp1,jp2; JPasswordField jp1,jp2;l l JButton jb1,jb2; JButton jb1,jb2; JButton jb1,jb2; JButton jb1,jb2;l

251、l public void init() public void init() public void init() public void init()l l Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane();l l jl1 = new JLabel( jl1 = new JLabel( jl1 = new JLabel( jl1 = new JLabel(l l 请输请输入您的密入您的密入

252、您的密入您的密码码: ,JLabel.CENTER);: ,JLabel.CENTER);: ,JLabel.CENTER);: ,JLabel.CENTER);l l jl2 = new JLabel( jl2 = new JLabel( jl2 = new JLabel( jl2 = new JLabel(l l 请请再次再次再次再次输输入密入密入密入密码码: ,JLabel.CENTER);: ,JLabel.CENTER);: ,JLabel.CENTER);: ,JLabel.CENTER);8383l ljp1 = new JPasswordField(8);jp1 = new J

253、PasswordField(8);jp1 = new JPasswordField(8);jp1 = new JPasswordField(8);l l jp2 = new JPasswordField(8); jp2 = new JPasswordField(8); jp2 = new JPasswordField(8); jp2 = new JPasswordField(8);l l jb1 = new JButton( jb1 = new JButton( jb1 = new JButton( jb1 = new JButton(提交提交提交提交););););l l jb2 = new

254、 JButton( jb2 = new JButton( jb2 = new JButton( jb2 = new JButton(取消取消取消取消););););l l c.setLayout(new GridLayout(3,2); c.setLayout(new GridLayout(3,2); c.setLayout(new GridLayout(3,2); c.setLayout(new GridLayout(3,2);l l c.add(jl1); c.add(jl1); c.add(jl1); c.add(jl1);l l c.add(jp1); c.add(jp1); c.ad

255、d(jp1); c.add(jp1);l l c.add(jl2); c.add(jl2); c.add(jl2); c.add(jl2);l l c.add(jp2); c.add(jp2); c.add(jp2); c.add(jp2);l l c.add(jb1); c.add(jb1); c.add(jb1); c.add(jb1);l l c.add(jb2); c.add(jb2); c.add(jb2); c.add(jb2);l l jb1.addActionListener(this); jb1.addActionListener(this); jb1.addActionLi

256、stener(this); jb1.addActionListener(this);l l jb2.addActionListener(this); jb2.addActionListener(this); jb2.addActionListener(this); jb2.addActionListener(this);l l 8484l lpublic void actionPerformed(ActionEvent e)public void actionPerformed(ActionEvent e)public void actionPerformed(ActionEvent e)pu

257、blic void actionPerformed(ActionEvent e)l l if(e.getSource()=jb1) if(e.getSource()=jb1) if(e.getSource()=jb1) if(e.getSource()=jb1)l l if(jp1.getPassword().length0) if(jp1.getPassword().length0) if(jp1.getPassword().length0) if(jp1.getPassword().length0)l l if(String.valueOf(jp1.getPassword().equals

258、 if(String.valueOf(jp1.getPassword().equals if(String.valueOf(jp1.getPassword().equals if(String.valueOf(jp1.getPassword().equalsl l (String.valueOf(jp2.getPassword() (String.valueOf(jp2.getPassword() (String.valueOf(jp2.getPassword() (String.valueOf(jp2.getPassword()l l showStatus( showStatus( show

259、Status( showStatus(密密密密码输码输入成功!入成功!入成功!入成功!););););l l else else else elsel l showStatus( showStatus( showStatus( showStatus(两次两次两次两次输输入的密入的密入的密入的密码码不同,不同,不同,不同,请请重新重新重新重新输输入!入!入!入!););););l l jp1.setText(); jp1.setText(); jp1.setText(); jp1.setText();l l jp2.setText(); jp2.setText(); jp2.setText();

260、 jp2.setText();l l l l else showStatus( else showStatus( else showStatus( else showStatus(密密密密码码不能不能不能不能为为空!空!空!空!););););l l if(e.getSource()=jb2) if(e.getSource()=jb2) if(e.getSource()=jb2) if(e.getSource()=jb2)l l jp1.setText(); jp1.setText(); jp1.setText(); jp1.setText();l l jp2.setText(); jp2.s

261、etText(); jp2.setText(); jp2.setText();8585l lshowStatus();showStatus();showStatus();showStatus();l l l l l l 程序运行显示如下图所示。程序运行显示如下图所示。86863 3多行文本框(多行文本框(JTextAreaJTextArea)JTextField JTextField 是是单单行行文文本本框框,不不能能显显示示多多行行文文本本,如如果果想想要要显显示示大大段段的的多多行行文文本本,可可以以使使用用类类JTextAreaJTextArea支支持持的的多多行行文文本本框框。JTex

262、tArea JTextArea 有有六六个个构构造造方方法法,常常用用的的有四个:有四个:l lJTextArea() JTextArea() JTextArea() JTextArea() 创创建空多行文本框。建空多行文本框。建空多行文本框。建空多行文本框。l lJTextArea(int JTextArea(int JTextArea(int JTextArea(int rows, rows, rows, rows, int int int int columns) columns) columns) columns) 创创建建建建指指指指定定定定行行行行列列列列数数数数的的的的多多多多行

263、文本框。行文本框。行文本框。行文本框。l lJTextArea(String JTextArea(String JTextArea(String JTextArea(String text) text) text) text) 创创建建建建带带初初初初始始始始文文文文本本本本内内内内容容容容的的的的多多多多行行行行文文文文本本本本框。框。框。框。l lJTextArea(String JTextArea(String JTextArea(String JTextArea(String text, text, text, text, int int int int rows, rows, row

264、s, rows, int int int int columns) columns) columns) columns) 创创建建建建带带初始文本内容和指定大小的多行文本框。初始文本内容和指定大小的多行文本框。初始文本内容和指定大小的多行文本框。初始文本内容和指定大小的多行文本框。其其中中,text text 为为 JTextArea JTextArea 的的初初始始化化文文本本内内容容;rows rows 为为 JTextArea JTextArea 的的高高度度,以以行行为为单单位位;columns columns 为为 JTextArea JTextArea 的宽度,以的宽度,以字符为单

265、位字符为单位。8787例例如如,构构造造一一个个高高5 5行行,宽宽1515个个字字符符的的多多行行文文本本框框的的语语句为:句为: textArea = new JTextArea(5, 15); textArea = new JTextArea(5, 15);多多行行文文本本框框默默认认是是不不会会自自动动折折行行的的 ( (但但可可以以输输入入回回车车符符 换换 行行 ) ), 可可 以以 使使 用用 类类 JTextArea JTextArea 的的 setLineWrap(boolean setLineWrap(boolean wrap)wrap)方方法法设设置置是是否否允允许许自自

266、动动折折行行。wrapwrap为为truetrue时时允允许许自自动动折折行行。多多行行文文本本框框会会根根据据用用户户输输入入的的内内容容自自动动扩扩展展大大小小。若若不不自自动动折折行行,那那么么多多行行文文本本框框的的宽宽度度由由最最长长的的一一行行文文字字确确定定的的;若若数数据据行行数数超超过过了了预预设设的的行行数数,则则多多行行文文本本框框会会扩扩展展自自身身的的高高度度去去适适应应。换换句句话话说说,多多行行文文本本框框不不会会自自动动产产生生滚滚动动条条。这这时时,可可用用滚滚动动窗窗格格 (JScrollPane) (JScrollPane) 来来为为多多行行文本框增加滚动

267、条。文本框增加滚动条。滚滚动动窗窗格格是是一一个个能能够够自自己己产产生生滚滚动动条条的的容容器器,通通常常只只包包容容一一个个组组件件,并并且且根根据据这这个个组组件件的的大大小小自自动动产产生生滚滚动条。动条。8888多多行行文文本本框框里里文文本本内内容容的的获获得得和和设设置置,同同样样可可以以使使用用 getTextgetText()()和和 setText() setText() 两两 个个 方方 法法 来来 完完 成成 。 还还 可可 以以 用用setEditable(boolean) setEditable(boolean) 确确定定是是否否可可对对多多行行文文本本框框的的内内

268、容进行编辑。容进行编辑。【例【例9.179.17】使用带滚动条的多行文本框。】使用带滚动条的多行文本框。l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l lpublic class JTAreaAndJSPaneDemo extends JFrame public class JTAreaAndJSPaneDemo ex

269、tends JFrame public class JTAreaAndJSPaneDemo extends JFrame public class JTAreaAndJSPaneDemo extends JFrame l l public JTAreaAndJSPaneDemo() public JTAreaAndJSPaneDemo() public JTAreaAndJSPaneDemo() public JTAreaAndJSPaneDemo() l l super( super( super( super(使用使用使用使用带滚动带滚动条的多行文本框条的多行文本框条的多行文本框条的多行文

270、本框););););l l JTextArea textArea = new JTextArea(5, 15); JTextArea textArea = new JTextArea(5, 15); JTextArea textArea = new JTextArea(5, 15); JTextArea textArea = new JTextArea(5, 15); l l textArea.setLineWrap(true); textArea.setLineWrap(true); textArea.setLineWrap(true); textArea.setLineWrap(true)

271、; l l JScrollPane jsp = new JScrollPane(textArea); JScrollPane jsp = new JScrollPane(textArea); JScrollPane jsp = new JScrollPane(textArea); JScrollPane jsp = new JScrollPane(textArea); l l getContentPane().add(jsp, BorderLayout.CENTER); getContentPane().add(jsp, BorderLayout.CENTER); getContentPane

272、().add(jsp, BorderLayout.CENTER); getContentPane().add(jsp, BorderLayout.CENTER);l l pack(); pack(); pack(); pack(); 8989l l setDefaultCloseOperation(EXIT_ON_CLOSE); setDefaultCloseOperation(EXIT_ON_CLOSE); setDefaultCloseOperation(EXIT_ON_CLOSE); setDefaultCloseOperation(EXIT_ON_CLOSE); l l l l pub

273、lic static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args) l l JTAreaAndJSPaneDemo tp = new JTAreaAndJSPaneDemo tp = new JTAreaAndJSPaneDemo tp = new JTAreaAndJSPaneDemo tp = newl l JTAreaAndJSPaneDemo(); JTAreaAnd

274、JSPaneDemo(); JTAreaAndJSPaneDemo(); JTAreaAndJSPaneDemo(); l l tp.setVisible(true); tp.setVisible(true); tp.setVisible(true); tp.setVisible(true);l l l l 程序运行显示如下图所示。程序运行显示如下图所示。90909.3.7 9.3.7 列表框(列表框(JListJList)JListJList类类支支持持的的列列表表框框是是允允许许用用户户从从一一个个列列表表中中选选择择一一项项或或多多项项的的组组件件。显显示示一一个个数数组组和和向向量量的

275、的表表是是很很容容易易的的。列列表表框框使使用用户户易易于于操操作作大大量量的的选选项项。列列表表框框的的所所有有项项目目都都是是可可见见的的,如如果果选选项项很很多多,超超出出了了列列表表框框可可见区的范围,则列表框的旁边会有一个滚动条。见区的范围,则列表框的旁边会有一个滚动条。JListJList类的构造方法如下:类的构造方法如下:l lJList() JList() JList() JList() 创创建空模式的建空模式的建空模式的建空模式的对对象。象。象。象。l lJList(Object JList(Object JList(Object JList(Object listData)

276、 listData) listData) listData) 构构构构造造造造显显示示示示指指指指定定定定数数数数组组listDatalistDatalistDatalistData中中中中元素的元素的元素的元素的JListJListJListJList对对象。象。象。象。例如,创建一个显示数组例如,创建一个显示数组datadata中字符串的中字符串的JListJList:l l String String String String data data data data = = = = one, one, one, one, two, two, two, two, three, three

277、, three, three, four;four;four;four;l l JList dataList = new JList(data);JList dataList = new JList(data);JList dataList = new JList(data);JList dataList = new JList(data);【例【例9.189.18】使用】使用JListJList。9191l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport javax.swin

278、g.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport javax.swing.event.*;import javax.swing.event.*;import javax.swing.event.*;import javax.swing.event.*;l limport javax.swing.border.*;import javax.swing.border.*;import javax.swing.border.*;import javax.swing.border.*;l lpubl

279、ic class JListDemo extends JFrame public class JListDemo extends JFrame public class JListDemo extends JFrame public class JListDemo extends JFrame l l public static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args)

280、l l new JListDemo(); new JListDemo(); new JListDemo(); new JListDemo();l l l l private JList jl; private JList jl; private JList jl; private JList jl;l l private JTextField valueField; private JTextField valueField; private JTextField valueField; private JTextField valueField;l l public JListDemo()

281、public JListDemo() public JListDemo() public JListDemo() l l super( super( super( super(一个一个一个一个简单简单的的的的JList);JList);JList);JList);l l WindowUtilities.setNativeLookAndFeel(); WindowUtilities.setNativeLookAndFeel(); WindowUtilities.setNativeLookAndFeel(); WindowUtilities.setNativeLookAndFeel();l l a

282、ddWindowListener(new ExitListener(); addWindowListener(new ExitListener(); addWindowListener(new ExitListener(); addWindowListener(new ExitListener();l l Container content = getContentPane(); Container content = getContentPane(); Container content = getContentPane(); Container content = getContentPa

283、ne();l l String entries = “ String entries = “ String entries = “ String entries = “北京北京北京北京”,“”,“”,“”,“上海上海上海上海”,”,”,”,l l 天津天津天津天津,重重重重庆庆,武武武武汉汉;9292l ljl = new JList(entries); / jl = new JList(entries); / jl = new JList(entries); / jl = new JList(entries); / 创创建建建建JListJListJListJList对对象象象象l ljl.

284、setVisibleRowCount(4); / jl.setVisibleRowCount(4); / jl.setVisibleRowCount(4); / jl.setVisibleRowCount(4); / 设设置置置置JListJListJListJList显显示行数示行数示行数示行数l lFont displayFont = new Font(Serif, Font.BOLD, 18);Font displayFont = new Font(Serif, Font.BOLD, 18);Font displayFont = new Font(Serif, Font.BOLD, 18

285、);Font displayFont = new Font(Serif, Font.BOLD, 18);l ljl.setFont(displayFont);jl.setFont(displayFont);jl.setFont(displayFont);jl.setFont(displayFont);l ljl.addjl.addjl.addjl.addListSelectionListenerListSelectionListenerListSelectionListenerListSelectionListener(new ValueReporter(); (new ValueReport

286、er(); (new ValueReporter(); (new ValueReporter(); l lJScrollPane listPane = new JScrollPane(jl); JScrollPane listPane = new JScrollPane(jl); JScrollPane listPane = new JScrollPane(jl); JScrollPane listPane = new JScrollPane(jl); l lJPanel listPanel = new JPanel();JPanel listPanel = new JPanel();JPan

287、el listPanel = new JPanel();JPanel listPanel = new JPanel();l llistPanel.setBackground(Color.white);listPanel.setBackground(Color.white);listPanel.setBackground(Color.white);listPanel.setBackground(Color.white);l lBorder listPanelBorder = BorderFactory.Border listPanelBorder = BorderFactory.Border l

288、istPanelBorder = BorderFactory.Border listPanelBorder = BorderFactory.l lcreateTitledBorder(JListcreateTitledBorder(JListcreateTitledBorder(JListcreateTitledBorder(JList数据数据数据数据););););l llistPanel.setBorder(listPanelBorder);/listPanel.setBorder(listPanelBorder);/listPanel.setBorder(listPanelBorder)

289、;/listPanel.setBorder(listPanelBorder);/设设置面板置面板置面板置面板边边界界界界l llistPanel.add(listPane);listPanel.add(listPane);listPanel.add(listPane);listPanel.add(listPane);l lcontent.add(listPanel, BorderLayout.CENTER);content.add(listPanel, BorderLayout.CENTER);content.add(listPanel, BorderLayout.CENTER);conten

290、t.add(listPanel, BorderLayout.CENTER);l lJLabel valueLabel = new JLabel(JLabel valueLabel = new JLabel(JLabel valueLabel = new JLabel(JLabel valueLabel = new JLabel(选择为选择为:);:);:);:);9393l l valueLabel.setFont(displayFont); valueLabel.setFont(displayFont); valueLabel.setFont(displayFont); valueLabel

291、.setFont(displayFont);l l valueField = new JTextField(, 6); valueField = new JTextField(, 6); valueField = new JTextField(, 6); valueField = new JTextField(, 6);l l valueField.setFont(displayFont); valueField.setFont(displayFont); valueField.setFont(displayFont); valueField.setFont(displayFont);l l

292、JPanel valuePanel = new JPanel(); JPanel valuePanel = new JPanel(); JPanel valuePanel = new JPanel(); JPanel valuePanel = new JPanel();l l valuePanel.setBackground(Color.white); valuePanel.setBackground(Color.white); valuePanel.setBackground(Color.white); valuePanel.setBackground(Color.white);l l Bo

293、rder valuePanelBorder = BorderFactory. Border valuePanelBorder = BorderFactory. Border valuePanelBorder = BorderFactory. Border valuePanelBorder = BorderFactory.l l createTitledBorder(JList createTitledBorder(JList createTitledBorder(JList createTitledBorder(JList选择选择););););l l valuePanel.setBorder

294、(valuePanelBorder); valuePanel.setBorder(valuePanelBorder); valuePanel.setBorder(valuePanelBorder); valuePanel.setBorder(valuePanelBorder);l l valuePanel.add(valueLabel); valuePanel.add(valueLabel); valuePanel.add(valueLabel); valuePanel.add(valueLabel);l l valuePanel.add(valueField); valuePanel.add

295、(valueField); valuePanel.add(valueField); valuePanel.add(valueField);l l content.add(valuePanel, BorderLayout.SOUTH); content.add(valuePanel, BorderLayout.SOUTH); content.add(valuePanel, BorderLayout.SOUTH); content.add(valuePanel, BorderLayout.SOUTH);l l pack(); pack(); pack(); pack();l l setVisibl

296、e(true); setVisible(true); setVisible(true); setVisible(true);l l 9494l lprivate class ValueReporterprivate class ValueReporterprivate class ValueReporterprivate class ValueReporterl l implements ListSelectionListener implements ListSelectionListener implements ListSelectionListener implements ListS

297、electionListener l l public public public public void void void void valueChanged(ListSelectionEvent valueChanged(ListSelectionEvent valueChanged(ListSelectionEvent valueChanged(ListSelectionEvent event)event)event)event)l l if (!event.getValueIsAdjusting() if (!event.getValueIsAdjusting() if (!even

298、t.getValueIsAdjusting() if (!event.getValueIsAdjusting()l l valueField.setText( valueField.setText( valueField.setText( valueField.setText(l l jl.getSelectedValue().toString(); jl.getSelectedValue().toString(); jl.getSelectedValue().toString(); jl.getSelectedValue().toString();l l l l 程序的运行程序的运行结结果果

299、如图所示。如图所示。95959.3.8 9.3.8 组合框(组合框(JComboBoxJComboBox)在在JavaJava语语言言中中,组组合合框框有有可可编编辑辑的的和和不不可可编编辑辑的的两两种种不不同同的的形形式式。缺缺省省是是不不可可编编辑辑的的组组合合框框。这这里里对对不不可可编编辑辑的的组组合合框框进进行行介介绍绍。组组合合框框用用于于在在多多项项选选择择中中选选择择一一项项的的操操作作。在在未未选选择择组组合合框框时时,组组合合框框显显示示为为带带按按钮钮的的一一个个选选项项的的形形式式,当当对对组组合合框框按按键键或或单单击击时时,组组合合框框会会打打开开可可列列出出多多项

300、项的的一一个个列列表表,提提供供给给用用户户选选择。择。类类JComboBoxJComboBox提供组合框的支持,其相关类的层次如下:提供组合框的支持,其相关类的层次如下:l l javax.swing.Jcomponentjavax.swing.Jcomponentjavax.swing.Jcomponentjavax.swing.Jcomponentl l javax.swing.JComboBox javax.swing.JComboBox javax.swing.JComboBox javax.swing.JComboBox类类JComboBox()JComboBox()的构造方法有四

301、种,常用的有两种:的构造方法有四种,常用的有两种:l lJComboBox()JComboBox()用缺省的数据模式创建组合框。用缺省的数据模式创建组合框。l lJComboBox(Object items)JComboBox(Object items)用指定数组创建组合框。用指定数组创建组合框。9696创创 建建 组组 合合 框框 后后 , 可可 用用 方方 法法 setSelectedIndex(int setSelectedIndex(int anIndex)anIndex)选选 定定 指指 定定 下下 标标 anIndexanIndex处处 的的 项项 目目 ; ; 可可 用用 方方

302、法法 getSelectedIndexgetSelectedIndex() ()获获得得选选定定项项目目的的数数组组下下标标;可可用用方方法法getSelectedItemgetSelectedItem() ()获取选定的项目。获取选定的项目。组组合合框框事事件件是是ActionEventActionEvent事事件件。事事件件处处理理方方法法与与其其他他处理同类事件的方法类似。处理同类事件的方法类似。【例【例9.199.19】使用】使用JComboBoxJComboBox。l limport java.awt.*;import java.awt.*;import java.awt.*;imp

303、ort java.awt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l lpublic class JComboBoxDemo extends JPanel public class JComboBoxDemo extends JPanel public class

304、 JComboBoxDemo extends JPanel public class JComboBoxDemo extends JPanel l l JLabel picture,text; JLabel picture,text; JLabel picture,text; JLabel picture,text;l l public JComboBoxDemo() public JComboBoxDemo() public JComboBoxDemo() public JComboBoxDemo() l l String String String String pStrings pStr

305、ings pStrings pStrings = = = = cup,cat,boy,girl;cup,cat,boy,girl;cup,cat,boy,girl;cup,cat,boy,girl;9797l lJComboBox pList = new JComboBox(pStrings);JComboBox pList = new JComboBox(pStrings);JComboBox pList = new JComboBox(pStrings);JComboBox pList = new JComboBox(pStrings);l l pList.setSelectedIndex

306、(0); pList.setSelectedIndex(0); pList.setSelectedIndex(0); pList.setSelectedIndex(0);l l pList.addActionListener(new ActionListener() pList.addActionListener(new ActionListener() pList.addActionListener(new ActionListener() pList.addActionListener(new ActionListener() l l public void actionPerformed

307、(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) l l JComboBox cb = (JComboBox)e.getSource();JComboBox cb = (JComboBox)e.getSource();JComboBox cb = (JComboBox)e.getSource();JComboBox cb = (JComboBox)e.get

308、Source();l l String pName = (String)cb.getSelectedItem(); String pName = (String)cb.getSelectedItem(); String pName = (String)cb.getSelectedItem(); String pName = (String)cb.getSelectedItem();l l picture.setIcon(new ImageIcon(images/“ picture.setIcon(new ImageIcon(images/“ picture.setIcon(new ImageI

309、con(images/“ picture.setIcon(new ImageIcon(images/“l l + pName + .gif); + pName + .gif); + pName + .gif); + pName + .gif);l l text.setText(pName); text.setText(pName); text.setText(pName); text.setText(pName);l l text.setHorizontalAlignment(JLabel.CENTER); text.setHorizontalAlignment(JLabel.CENTER);

310、 text.setHorizontalAlignment(JLabel.CENTER); text.setHorizontalAlignment(JLabel.CENTER);l l l l ); ); ); );l l picture = new JLabel(new ImageIcon(images/ + picture = new JLabel(new ImageIcon(images/ + picture = new JLabel(new ImageIcon(images/ + picture = new JLabel(new ImageIcon(images/ +l l pStrin

311、gspList.getSelectedIndex() +.gif); pStringspList.getSelectedIndex() +.gif); pStringspList.getSelectedIndex() +.gif); pStringspList.getSelectedIndex() +.gif);9898l lpicture.setBorder(BorderFactory.picture.setBorder(BorderFactory.picture.setBorder(BorderFactory.picture.setBorder(BorderFactory.l l crea

312、teEmptyBorder(10,0,0,0); createEmptyBorder(10,0,0,0); createEmptyBorder(10,0,0,0); createEmptyBorder(10,0,0,0);l lpicture.setPreferredSize(new Dimension(180, 140);picture.setPreferredSize(new Dimension(180, 140);picture.setPreferredSize(new Dimension(180, 140);picture.setPreferredSize(new Dimension(

313、180, 140);l ltext text text text = = = = new new new new JLabel(pStringspList.getSelectedIndex(),JLabel(pStringspList.getSelectedIndex(),JLabel(pStringspList.getSelectedIndex(),JLabel(pStringspList.getSelectedIndex(),l l JLabel.CENTER); JLabel.CENTER); JLabel.CENTER); JLabel.CENTER);l lsetLayout(new

314、 BorderLayout();setLayout(new BorderLayout();setLayout(new BorderLayout();setLayout(new BorderLayout();l ladd(pList,BorderLayout.NORTH);add(pList,BorderLayout.NORTH);add(pList,BorderLayout.NORTH);add(pList,BorderLayout.NORTH);l ladd(picture,BorderLayout.CENTER);add(picture,BorderLayout.CENTER);add(p

315、icture,BorderLayout.CENTER);add(picture,BorderLayout.CENTER);l ladd(text,BorderLayout.SOUTH);add(text,BorderLayout.SOUTH);add(text,BorderLayout.SOUTH);add(text,BorderLayout.SOUTH);l lsetBorder(setBorder(setBorder(setBorder( BorderFactory.createEmptyBorder(20,20,20,20); BorderFactory.createEmptyBorde

316、r(20,20,20,20); BorderFactory.createEmptyBorder(20,20,20,20); BorderFactory.createEmptyBorder(20,20,20,20);l l l lpublic static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args) l l JFrame frame = new JFrame( JFrame

317、frame = new JFrame( JFrame frame = new JFrame( JFrame frame = new JFrame(使用使用使用使用JComboBox);JComboBox);JComboBox);JComboBox);l l 9999l l frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation(l l JFrame.EXIT_ON_CLOSE); JFrame.EX

318、IT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); l lframe.setContentPane(new JComboBoxDemo();frame.setContentPane(new JComboBoxDemo();frame.setContentPane(new JComboBoxDemo();frame.setContentPane(new JComboBoxDemo();l lframe.pack();frame.pack();frame.pack();frame.pack();l l frame.setVisib

319、le(true); frame.setVisible(true); frame.setVisible(true); frame.setVisible(true);l l l l 程序的运行结果如下图所示。程序的运行结果如下图所示。1001009.3.9 9.3.9 滚动条(滚动条(JSliderJSlider)在在某某些些程程序序中中,需需要要调调整整线线性性的的值值,这这时时就就需需要要滚滚动动条条。滚滚动动条条提提供供了了易易于于操操作作的的值值的的范范围围或或区区的的范范围围。javax.swing.JSliderjavax.swing.JSlider类类提提供供了了对对滚滚动动条条的的

320、支支持持,它它的的父类是父类是javax.swing.JComponentjavax.swing.JComponent类。类。可用下列可用下列JSliderJSlider类的构造方法生成类的构造方法生成JSliderJSlider对象。对象。l lJSlider() JSlider() JSlider() JSlider() 创创建范建范建范建范围为围为0 0 0 0至至至至100100100100,初,初,初,初值为值为50505050的水平的水平的水平的水平滚动滚动条。条。条。条。l lJSlider(int JSlider(int JSlider(int JSlider(int orie

321、ntation) orientation) orientation) orientation) 创创建建建建范范范范围围为为0 0 0 0至至至至100100100100, , , ,初初初初值值为为50505050的的的的水水水水 平平平平 或或或或 垂垂垂垂 直直直直 滚滚 动动 条条条条 。 。 。 。 表表表表 示示示示 方方方方 向向向向 的的的的 值值 可可可可 为为 常常常常 量量量量JSlider.HORIZONTALJSlider.HORIZONTALJSlider.HORIZONTALJSlider.HORIZONTAL和和和和JSlider.VERTICALJSlider

322、.VERTICALJSlider.VERTICALJSlider.VERTICAL, , , ,分分分分别别表表表表示示示示水水水水平平平平和和和和垂直方向。垂直方向。垂直方向。垂直方向。l lJSlider(int JSlider(int JSlider(int JSlider(int min, min, min, min, int int int int max) max) max) max) 创创建建建建范范范范围围为为minminminmin至至至至maxmaxmaxmax, , , ,初初初初值值为为minminminmin和和和和maxmaxmaxmax平均平均平均平均值值的水平的

323、水平的水平的水平滚动滚动条。条。条。条。 101101l lJSlider(int JSlider(int JSlider(int JSlider(int min, min, min, min, int int int int max, max, max, max, int int int int value) value) value) value) 创创建建建建范范范范围围为为minminminmin至至至至maxmaxmaxmax,初,初,初,初值为值为valuevaluevaluevalue的水平的水平的水平的水平滚动滚动条。条。条。条。l lJSlider(int JSlider(i

324、nt JSlider(int JSlider(int orientation, orientation, orientation, orientation, int int int int min, min, min, min, int int int int max, max, max, max, int int int int value) value) value) value) 创创建建建建范范范范围围为为minminminmin至至至至maxmaxmaxmax, , , ,初初初初值值为为valuevaluevaluevalue的的的的水水水水平平平平或或或或垂垂垂垂直直直直滚滚动动

325、条。条。条。条。对对创创建建的的JSliderJSlider对对象象可可显显示示数数据据刻刻度度和和数数据据值值,也也可可设设置置边边界界等等。与与其其他他接接口口组组件件一一样样,滚滚动动条条产产生生一一个个可以控制的事件可以控制的事件ChangeEventChangeEvent。【例【例9.209.20】使用】使用JSliderJSlider。l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport javax.swing.*;import javax.swing.*;impor

326、t javax.swing.*;import javax.swing.*;l limport javax.swing.event.*;import javax.swing.event.*;import javax.swing.event.*;import javax.swing.event.*;l lpublic class JSliderDemo extends Jframepublic class JSliderDemo extends Jframepublic class JSliderDemo extends Jframepublic class JSliderDemo extends

327、 Jframel l implements ChangeListener implements ChangeListener implements ChangeListener implements ChangeListener102102l lJLabel l1;JLabel l1;JLabel l1;JLabel l1;l lint v1,v2;int v1,v2;int v1,v2;int v1,v2;l lJSlider sl1,sl2;JSlider sl1,sl2;JSlider sl1,sl2;JSlider sl1,sl2;l lpublic static void main(

328、String args) public static void main(String args) public static void main(String args) public static void main(String args) l l new JSliderDemo(); new JSliderDemo(); new JSliderDemo(); new JSliderDemo();l l l lpublic JSliderDemo() public JSliderDemo() public JSliderDemo() public JSliderDemo() l l su

329、per( super( super( super(使用使用使用使用JSlider);JSlider);JSlider);JSlider);l l Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane(); Container c = getContentPane();l l c.setBackground(Color.white); c.setBackground(Color.white); c.setBackground(Color.white); c.setB

330、ackground(Color.white);l l sl1 = new JSlider(JSlider.VERTICAL,100,200,100); sl1 = new JSlider(JSlider.VERTICAL,100,200,100); sl1 = new JSlider(JSlider.VERTICAL,100,200,100); sl1 = new JSlider(JSlider.VERTICAL,100,200,100);l l / / / / 创创建垂直建垂直建垂直建垂直滚动滚动条条条条l l sl1.setMajorTickSpacing(50); / sl1.setMa

331、jorTickSpacing(50); / sl1.setMajorTickSpacing(50); / sl1.setMajorTickSpacing(50); / 设设置大刻度置大刻度置大刻度置大刻度间间隔隔隔隔 l l sl1.setMinorTickSpacing(10); / sl1.setMinorTickSpacing(10); / sl1.setMinorTickSpacing(10); / sl1.setMinorTickSpacing(10); / 设设置小刻度置小刻度置小刻度置小刻度间间隔隔隔隔l l sl1.setPaintTicks(true); / sl1.setP

332、aintTicks(true); / sl1.setPaintTicks(true); / sl1.setPaintTicks(true); / 显显示刻度示刻度示刻度示刻度l l sl1.setPaintLabels(true); / sl1.setPaintLabels(true); / sl1.setPaintLabels(true); / sl1.setPaintLabels(true); / 显显示示示示标标注注注注103103l lsl1.addChangeListener(this); / sl1.addChangeListener(this); / sl1.addChangeL

333、istener(this); / sl1.addChangeListener(this); / 注册注册注册注册监监听器听器听器听器l lc.add(sl1, BorderLayout.WEST);c.add(sl1, BorderLayout.WEST);c.add(sl1, BorderLayout.WEST);c.add(sl1, BorderLayout.WEST);l lsl2 = new JSlider(); / sl2 = new JSlider(); / sl2 = new JSlider(); / sl2 = new JSlider(); / 创创建水平建水平建水平建水平滚动

334、滚动条条条条l lsl2.setBorder(sl2.setBorder(sl2.setBorder(sl2.setBorder( BorderFactory.createTitledBorder( BorderFactory.createTitledBorder( BorderFactory.createTitledBorder( BorderFactory.createTitledBorder(l l JSlider( JSlider( JSlider( JSlider(具有具有具有具有带标题带标题的的的的边边框、刻度和框、刻度和框、刻度和框、刻度和标标注注注注););););l l /

335、/ / / 设设置置置置组组件件件件带标题带标题的的的的边边界界界界l lsl2.setMajorTickSpacing(20);sl2.setMajorTickSpacing(20);sl2.setMajorTickSpacing(20);sl2.setMajorTickSpacing(20);l lsl2.setMinorTickSpacing(5);sl2.setMinorTickSpacing(5);sl2.setMinorTickSpacing(5);sl2.setMinorTickSpacing(5);l lsl2.setPaintTicks(true); /true:sl2.se

336、tPaintTicks(true); /true:sl2.setPaintTicks(true); /true:sl2.setPaintTicks(true); /true:产产生生生生滚动滚动条上的刻度条上的刻度条上的刻度条上的刻度l lsl2.setPaintLabels(true); /true:sl2.setPaintLabels(true); /true:sl2.setPaintLabels(true); /true:sl2.setPaintLabels(true); /true:显显示刻度上的数据示刻度上的数据示刻度上的数据示刻度上的数据l lsl2.addChangeListen

337、er(this);sl2.addChangeListener(this);sl2.addChangeListener(this);sl2.addChangeListener(this);l lc.add(sl2,BorderLayout.SOUTH);c.add(sl2,BorderLayout.SOUTH);c.add(sl2,BorderLayout.SOUTH);c.add(sl2,BorderLayout.SOUTH);104104l l l1=new JLabel( l1=new JLabel( l1=new JLabel( l1=new JLabel(垂直垂直垂直垂直滚动滚动条的条

338、的条的条的值为值为: : : :+l l 100+ 100+ 100+ 100+水平水平水平水平滚动滚动条的条的条的条的值为值为: : : :+50);+50);+50);+50);l l c.add(l1,BorderLayout.CENTER); c.add(l1,BorderLayout.CENTER); c.add(l1,BorderLayout.CENTER); c.add(l1,BorderLayout.CENTER);l l setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFram

339、e.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);l l / / / / 设设置框架关置框架关置框架关置框架关闭闭按按按按钮钮事件事件事件事件l l pack(); pack(); pack(); pack();l l setVisible(true); setVisible(true); setVisible(true); setVisible(true);l l l l public void stateChange

340、d(ChangeEvent e) public void stateChanged(ChangeEvent e) public void stateChanged(ChangeEvent e) public void stateChanged(ChangeEvent e)l l if(e.getSource()=sl1) if(e.getSource()=sl1) if(e.getSource()=sl1) if(e.getSource()=sl1)l l v1=(JSlider)e.getSource().getValue(); v1=(JSlider)e.getSource().getVa

341、lue(); v1=(JSlider)e.getSource().getValue(); v1=(JSlider)e.getSource().getValue();l l else if(e.getSource()=sl2) else if(e.getSource()=sl2) else if(e.getSource()=sl2) else if(e.getSource()=sl2) l l v2=(JSlider)e.getSource().getValue(); v2=(JSlider)e.getSource().getValue(); v2=(JSlider)e.getSource().

342、getValue(); v2=(JSlider)e.getSource().getValue();l l l1.setText( l1.setText( l1.setText( l1.setText(垂直垂直垂直垂直滚动滚动条的条的条的条的值为值为: : : :+v1+v1+v1+v1+l l , , , ,水平水平水平水平滚动滚动条的条的条的条的值为值为: : : :+v2);+v2);+v2);+v2);l l l l 105105程序运行结果如下图所示。程序运行结果如下图所示。1061069.3.10 9.3.10 菜单(菜单(JMenuJMenu)菜菜单单将将一一个个应应用用程程序序的

343、的命命令令按按层层次次化化管管理理并并组组织织在在一一起起,是是一一种种常常用用的的GUIGUI组组件件。常常见见的的菜菜单单为为下下拉拉式式菜菜单单和弹出式菜单(快捷菜单)等。和弹出式菜单(快捷菜单)等。下下拉拉式式菜菜单单包包含含有有一一个个菜菜单单条条(也也称称为为菜菜单单栏栏,MenuBarMenuBar),在在菜菜单单条条上上安安排排有有若若干干个个菜菜单单(MenuMenu),每每个个菜菜单单又又包包含含若若干干菜菜单单项项(MenuItemMenuItem),每每个个菜菜单单项项对对应应了了一一个个命命令令或或子子菜菜单单项项。它它们们构构成成一一个个应应用用程程序序的的菜菜单单

344、系系统统。用用鼠鼠标标或或键键盘盘选选择择对对应应一一个个命命令令的的菜菜单单项项与与选选择择一一个个按按钮钮类类似似。使使用用菜菜单单系系统统可可方方便便地地向向程序分布命令。程序分布命令。在在构构建建一一个个自自己己的的菜菜单单系系统统时时,可可按按照照菜菜单单系系统统的的层层次,一步一步地进行。次,一步一步地进行。107107(1)(1)用类用类JMenuBarJMenuBar创建菜单条创建菜单条可可简简单单地地用用JMenuBar()JMenuBar()构构造造方方法法类类创创建建一一个个新新菜菜单单条条。例如,例如,l lJMenuBar aMenuBar = new JMenuBa

345、r();JMenuBar aMenuBar = new JMenuBar();JMenuBar aMenuBar = new JMenuBar();JMenuBar aMenuBar = new JMenuBar();(2)(2)用类用类JMenuJMenu创建菜单创建菜单用类用类JMenuJMenu的构造方法来创建菜单,其构造方法有:的构造方法来创建菜单,其构造方法有:l lpublic JMenu()public JMenu()public JMenu()public JMenu()构造一个无文本的菜构造一个无文本的菜构造一个无文本的菜构造一个无文本的菜单单。 。 。 。l lpublic

346、 public public public JMenu(String JMenu(String JMenu(String JMenu(String s)s)s)s)用用用用字字字字符符符符串串串串s s s s作作作作为为文文文文本本本本来来来来构构构构造造造造一一一一个个个个菜菜菜菜单单。 。 。 。例例如如: : JMenu JMenu aMenu aMenu = = new new JMenu(JMenu(文文件件); ); / / 创创建建“文件文件”菜单菜单(3)(3)用类用类JMenuItemJMenuItem创建菜单项创建菜单项类类JMenuItemJMenuItem的构造方法有

347、:的构造方法有:108108l lpublic JMenuItem()public JMenuItem()public JMenuItem()public JMenuItem()创创建一个菜建一个菜建一个菜建一个菜单项单项,但不,但不,但不,但不设设置文本和置文本和置文本和置文本和图标图标。 。 。 。l lpublic JMenuItem(Icon icon)public JMenuItem(Icon icon)public JMenuItem(Icon icon)public JMenuItem(Icon icon)创创建一个建一个建一个建一个带图标带图标的菜的菜的菜的菜单项单项。 。 。

348、 。l lpublic public public public JMenuItem(String JMenuItem(String JMenuItem(String JMenuItem(String text)text)text)text)创创建建建建一一一一个个个个具具具具有有有有指指指指定定定定文文文文本本本本的的的的菜菜菜菜单项单项。 。 。 。l lpublic public public public JMenuItem(String JMenuItem(String JMenuItem(String JMenuItem(String text, text, text, text,

349、 Icon Icon Icon Icon icon)icon)icon)icon)创创建建建建具具具具有有有有文文文文本本本本和和和和图标图标的菜的菜的菜的菜单项单项。 。 。 。l lpublic public public public JMenuItem(String JMenuItem(String JMenuItem(String JMenuItem(String text,int text,int text,int text,int mnemonic)mnemonic)mnemonic)mnemonic)创创建建建建具具具具有有有有文文文文本和快捷字母的菜本和快捷字母的菜本和快捷字

350、母的菜本和快捷字母的菜单项单项。 。 。 。例例如如:JMenuItem JMenuItem aMenuItem aMenuItem = = new new JMenuItem(JMenuItem(新新建建);/ );/ 创建创建“新建新建”菜单项菜单项(4)(4)将菜单项加入到菜单中,将菜单加入到菜单条中将菜单项加入到菜单中,将菜单加入到菜单条中 109109可可用用JMenuBarJMenuBar类类和和JMenuJMenu类类的的add()add()方方法法完完成成添添加加工工作作。例如:例如:l l aMenuBar.add(aMenu ); aMenuBar.add(aMenu );

351、l l aMenu.add(aMenuItem); aMenu.add(aMenuItem);另外,可用另外,可用addSeparator()addSeparator()方法向菜单添加分隔线。方法向菜单添加分隔线。(5)(5)将菜单条加入容器中将菜单条加入容器中可可向向实实现现了了MenuContainerMenuContainer接接口口的的容容器器(如如框框架架)加加入入菜单系统。在框架菜单系统。在框架JFrameJFrame类中有方法:类中有方法:l l public void setJMenuBar(JMenuBar menubar) public void setJMenuBar(J

352、MenuBar menubar)可为框架设置菜单条。例如:可为框架设置菜单条。例如:l l JFrame aFrame = new JFrame(); JFrame aFrame = new JFrame();l l aFrame.setJMenuBar(aMenuBar); aFrame.setJMenuBar(aMenuBar);(6)(6)处理菜单项选择事件处理菜单项选择事件110110为为 了了 检检 测测 对对 菜菜 单单 项项 作作 出出 的的 选选 择择 , 要要 监监 听听 菜菜 单单 项项ActionEventActionEvent事事件件,选选择择一一个个菜菜单单项项正正如

353、如选选择择了了一一个个JButtonJButton按钮一样。事件处理的相关代码可见下例。按钮一样。事件处理的相关代码可见下例。【例【例9.219.21】使用下拉菜单系统。】使用下拉菜单系统。 l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport java.awt.event.*;import java.awt

354、.event.*;import java.awt.event.*;import java.awt.event.*;l lpublic class JMenuDemo extends JFrame public class JMenuDemo extends JFrame public class JMenuDemo extends JFrame public class JMenuDemo extends JFrame l l implements ActionListener implements ActionListener implements ActionListener implem

355、ents ActionListenerl l JLabel j1 = new JLabel( JLabel j1 = new JLabel( JLabel j1 = new JLabel( JLabel j1 = new JLabel(l l 请选择请选择菜菜菜菜单单: : : :,JLabel.CENTER);,JLabel.CENTER);,JLabel.CENTER);,JLabel.CENTER);l l JMenuItem aaMenuItem,baMenuItem; JMenuItem aaMenuItem,baMenuItem; JMenuItem aaMenuItem,baMe

356、nuItem; JMenuItem aaMenuItem,baMenuItem;l l JMenuDemo() JMenuDemo() JMenuDemo() JMenuDemo()l l super( super( super( super(使用使用使用使用JMenu);JMenu);JMenu);JMenu);l l JMenuBar aMenuBar = new JMenuBar(); JMenuBar aMenuBar = new JMenuBar(); JMenuBar aMenuBar = new JMenuBar(); JMenuBar aMenuBar = new JMenuB

357、ar();l l Icon i1 = new ImageIcon(images/girl.gif); Icon i1 = new ImageIcon(images/girl.gif); Icon i1 = new ImageIcon(images/girl.gif); Icon i1 = new ImageIcon(images/girl.gif);111111l lIcon i2 = new ImageIcon(images/boy.gif);Icon i2 = new ImageIcon(images/boy.gif);Icon i2 = new ImageIcon(images/boy.

358、gif);Icon i2 = new ImageIcon(images/boy.gif);l lJMenu aMenu = new JMenu(JMenu aMenu = new JMenu(JMenu aMenu = new JMenu(JMenu aMenu = new JMenu(菜菜菜菜单单A);A);A);A);l lJMenu bMenu = new JMenu(JMenu bMenu = new JMenu(JMenu bMenu = new JMenu(JMenu bMenu = new JMenu(菜菜菜菜单单B);B);B);B);l lJMenuItem aaMenuIt

359、em = new JMenuItem(JMenuItem aaMenuItem = new JMenuItem(JMenuItem aaMenuItem = new JMenuItem(JMenuItem aaMenuItem = new JMenuItem(菜菜菜菜单项单项AA,i1);AA,i1);AA,i1);AA,i1);l lJMenuItem abMenuItem = new JMenuItem(JMenuItem abMenuItem = new JMenuItem(JMenuItem abMenuItem = new JMenuItem(JMenuItem abMenuItem

360、 = new JMenuItem(菜菜菜菜单项单项AB,i2);AB,i2);AB,i2);AB,i2);l lJMenuItem baMenuItem = new JMenuItem(JMenuItem baMenuItem = new JMenuItem(JMenuItem baMenuItem = new JMenuItem(JMenuItem baMenuItem = new JMenuItem(菜菜菜菜单项单项BA);BA);BA);BA);l laMenuBar.add(aMenu);aMenuBar.add(aMenu);aMenuBar.add(aMenu);aMenuBar.

361、add(aMenu);l laMenuBar.add(bMenu);aMenuBar.add(bMenu);aMenuBar.add(bMenu);aMenuBar.add(bMenu);l laMenu.add(aaMenuItem);aMenu.add(aaMenuItem);aMenu.add(aaMenuItem);aMenu.add(aaMenuItem);l laMenu.addSeparator();aMenu.addSeparator();aMenu.addSeparator();aMenu.addSeparator();l laMenu.add(abMenuItem);aMe

362、nu.add(abMenuItem);aMenu.add(abMenuItem);aMenu.add(abMenuItem);l lbMenu.add(baMenuItem);bMenu.add(baMenuItem);bMenu.add(baMenuItem);bMenu.add(baMenuItem);l laaMenuItem.addActionListener(this);aaMenuItem.addActionListener(this);aaMenuItem.addActionListener(this);aaMenuItem.addActionListener(this);l l

363、abMenuItem.addActionListener(this);abMenuItem.addActionListener(this);abMenuItem.addActionListener(this);abMenuItem.addActionListener(this);l lbaMenuItem.addActionListener(this);baMenuItem.addActionListener(this);baMenuItem.addActionListener(this);baMenuItem.addActionListener(this);112112l l setJMen

364、uBar(aMenuBar);setJMenuBar(aMenuBar);setJMenuBar(aMenuBar);setJMenuBar(aMenuBar);l l getContentPane().add(j1,BorderLayout.CENTER); getContentPane().add(j1,BorderLayout.CENTER); getContentPane().add(j1,BorderLayout.CENTER); getContentPane().add(j1,BorderLayout.CENTER);l l l l public void actionPerfor

365、med(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e)l l JMenuItem source = (JMenuItem)(e.getSource(); JMenuItem source = (JMenuItem)(e.getSource(); JMenuItem source = (JMenuItem)(e.getSource(); JMenuItem s

366、ource = (JMenuItem)(e.getSource();l l j1.setText( j1.setText( j1.setText( j1.setText(选择选择了菜了菜了菜了菜单单:+source.getText();:+source.getText();:+source.getText();:+source.getText();l l j1.setHorizontalAlignment(JLabel.CENTER); j1.setHorizontalAlignment(JLabel.CENTER); j1.setHorizontalAlignment(JLabel.CENT

367、ER); j1.setHorizontalAlignment(JLabel.CENTER); l l l l public static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args)l l JFrame frame = new JMenuDemo(); JFrame frame = new JMenuDemo(); JFrame frame = new JMenuDemo()

368、; JFrame frame = new JMenuDemo();l l frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation( frame.setDefaultCloseOperation(l l JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE);l l frame.setVisible(true); frame.setVisi

369、ble(true); frame.setVisible(true); frame.setVisible(true);l l frame.pack(); frame.pack(); frame.pack(); frame.pack();l l l l 113113程序运行时选择了菜单程序运行时选择了菜单A A后的情况如下图所示。后的情况如下图所示。1141149.3.119.3.11对话框对话框对对话话框框是是一一种种大大小小不不能能变变化化、不不能能有有菜菜单单的的容容器器窗窗口口,对对话话框框不不能能作作为为一一个个应应用用程程序序的的主主框框架架,而而必必须须包包含含在在其其他他的的容容器

370、器中中。JavaJava语语言言提提供供多多种种对对话话框框类类来来支支持持多多种种形形式式的的对对话话框框。 JOptionPaneJOptionPane类类支支持持简简单单、标标准准的的对对话话框框;JDialogJDialog类类支支持持定定制制用用户户自自己己的的对对话话框框;JFileChooserJFileChooser类类 支支 持持 文文 件件 打打 开开 、 保保 存存 对对 话话 框框 ;ProgressMonitorProgressMonitor类支持操作进度条控制对话框等。类支持操作进度条控制对话框等。对对话话框框依依赖赖于于框框架架。当当框框架架撤撤销销时时,依依赖赖

371、该该框框架架的的对对话话框框也也撤撤销销。当当框框架架图图标标化化时时,依依赖赖它它的的对对话话框框也也从从屏屏幕幕上上消消失失。当当框框架架窗窗口口恢恢复复时时,依依赖赖框框架架的的对对话话框框又返回屏幕。又返回屏幕。下下面面介介绍绍较较简简单单的的JOptionPaneJOptionPane和和JFileChooserJFileChooser类类支支持持的对话框。的对话框。 1151151. JOptionPane1. JOptionPane对话框对话框JOptionPaneJOptionPane提提供供的的对对话话框框是是模模式式对对话话框框。当当模模式式对对话话框框显显示示时时,它它不

372、不允允许许用用户户输输入入到到程程序序的的其其他他的的窗窗口口。使使用用JOptionPaneJOptionPane,可可以以创创建建和和自自定定义义问问题题、信信息息、警警告告和和错错误误等等几几种种类类型型的的对对话话框框。JOptionPaneJOptionPane提提供供标标准准对对话话框框的的布布局局支支持持、图图标标、指指定定对对话话框框的的标标题题和和文文本本、自自定定义义按按钮钮文文本本、允允许许自自定定义义组组件件的的对对话话框框显显示示、指指定对话框在屏幕上的显示位置等特性。定对话框在屏幕上的显示位置等特性。javax.swing.JOptionPanejavax.swin

373、g.JOptionPane类类继继承承于于javax.swing.JComponentjavax.swing.JComponent类类,有有七七种种构构造造方方法法,常常用用的有五种:的有五种:l lJOptionPane()JOptionPane()JOptionPane()JOptionPane()创创建具有建具有建具有建具有测试测试信息的信息的信息的信息的JOptionPaneJOptionPaneJOptionPaneJOptionPane对对象。象。象。象。l lJOptionPane(Object JOptionPane(Object JOptionPane(Object JOpt

374、ionPane(Object message) message) message) message) 创创建建建建显显示示示示messagemessagemessagemessage和和和和缺缺缺缺省省省省选选项项的的的的JOptionPaneJOptionPaneJOptionPaneJOptionPane对对象。象。象。象。l lJOptionPane(Object JOptionPane(Object JOptionPane(Object JOptionPane(Object message, message, message, message, int int int int mess

375、ageType) messageType) messageType) messageType) 创创建建建建以以以以messageTypemessageTypemessageTypemessageType类类 型型型型 显显 示示示示 messagemessagemessagemessage和和和和 使使使使 用用用用 缺缺缺缺 省省省省 选选 项项 的的的的JOptionPaneJOptionPaneJOptionPaneJOptionPane对对象。象。象。象。116116l lJOptionPane(Object JOptionPane(Object JOptionPane(Object

376、 JOptionPane(Object message, message, message, message, int int int int messageType, messageType, messageType, messageType, int int int int optionType)optionType)optionType)optionType)创创建建建建显显示示示示指指指指定定定定类类型型型型信信信信息息息息和和和和指指指指定定定定选选项项类类型型型型的的的的JOptionPaneJOptionPaneJOptionPaneJOptionPane对对象。象。象。象。l

377、lJOptionPane(Object JOptionPane(Object JOptionPane(Object JOptionPane(Object message, message, message, message, int int int int messageType, messageType, messageType, messageType, int int int int optionType, optionType, optionType, optionType, Icon Icon Icon Icon icon) icon) icon) icon) 创创建建建建显显示示示

378、示指指指指定定定定类类型型型型信信信信息息息息和和和和指指指指定定定定选选项类项类型、型、型、型、图标图标的的的的JOptionPaneJOptionPaneJOptionPaneJOptionPane对对象。象。象。象。要要显显示示简简单单的的模模式式对对话话框框,可可以以使使用用showMessageDialogshowMessageDialog()()或或 showOptionDialog()showOptionDialog()方方 法法 。 它它 们们 的的 格格 式式 为为 ( showMessageDialogshowMessageDialog()()方法有重载):方法有重载):l

379、 lpublic public public public static static static static void void void void showMessageDialog(Component showMessageDialog(Component showMessageDialog(Component showMessageDialog(Component parentComponent,Object parentComponent,Object parentComponent,Object parentComponent,Object message,String mes

380、sage,String message,String message,String title,int title,int title,int title,int messageType,Icon icon)throws HeadlessExceptionmessageType,Icon icon)throws HeadlessExceptionmessageType,Icon icon)throws HeadlessExceptionmessageType,Icon icon)throws HeadlessException117117l lpublic public public publ

381、ic static static static static int int int int showOptionDialog(Component showOptionDialog(Component showOptionDialog(Component showOptionDialog(Component parentComponent,Object parentComponent,Object parentComponent,Object parentComponent,Object message,String message,String message,String message,

382、String title,int title,int title,int title,int optionType,int optionType,int optionType,int optionType,int messageType,Icon messageType,Icon messageType,Icon messageType,Icon icon,Object icon,Object icon,Object icon,Object options,Object options,Object options,Object options,Object initialValue) ini

383、tialValue) initialValue) initialValue) throws throws throws throws HeadlessExceptionHeadlessExceptionHeadlessExceptionHeadlessException前前者者显显示示一一个个带带一一个个“Ok”“Ok”或或“确确定定”按按钮钮的的对对话话框框。后后者者显显示示自自定定义义的的对对话话框框可可以以显显示示具具有有定定制制文文本本的的各各种种按按钮钮,并并可可包包含含一一个个标标准准的的文文本本信信息息或或组组件件集集合合。 例如:例如:l lJOptionPane.showMe

384、ssageDialog(JOptionPane.showMessageDialog(JOptionPane.showMessageDialog(JOptionPane.showMessageDialog(l l frame, frame, frame, frame,请输请输入一个整数。入一个整数。入一个整数。入一个整数。n + n + n + n + 无效无效无效无效输输入。入。入。入。););););showXxxDialogshowXxxDialog方方法法的的所所有有参参数数和和JOptionPaneJOptionPane构构造造方方法都是标准化的法都是标准化的, , 下面对这些参数进行

385、说明。下面对这些参数进行说明。l lparentComponent parentComponent parentComponent parentComponent 对对每每每每个个个个showXxxDialogshowXxxDialogshowXxxDialogshowXxxDialog方方方方法法法法的的的的第第第第一一一一个个个个参参参参数数数数总总是是是是父父父父组组件件件件, , , ,必必必必须须是是是是一一一一个个个个框框框框架架架架、 、 、 、一一一一个个个个框框框框架架架架中中中中的的的的组组件件件件、 、 、 、或或或或nullnullnullnull值值。 。 。 。JO

386、ptionPaneJOptionPaneJOptionPaneJOptionPane构造方法不包含构造方法不包含构造方法不包含构造方法不包含这这个参数。个参数。个参数。个参数。118118l lmessage message message message 这这个个个个必必必必须须的的的的参参参参数数数数指指指指明明明明要要要要显显示示示示的的的的对对话话框框框框。 。 。 。一一一一般般般般是是是是一一一一个个个个字字字字符串,符串,符串,符串,显显示在示在示在示在对话对话框的一个框的一个框的一个框的一个标签标签中。中。中。中。l ltitle title title title 标题标题。

387、 。 。 。l loptionType optionType optionType optionType 指指指指定定定定出出出出现现在在在在对对话话框框框框底底底底部部部部的的的的按按按按钮钮集集集集合合合合, , , ,可可可可以以以以选选择择下下下下面面面面 4 4 4 4个个个个 标标 准准准准 集集集集 合合合合 之之之之 一一一一 : : : : DEFAULT_OPTIONDEFAULT_OPTIONDEFAULT_OPTIONDEFAULT_OPTION, , , , YES_NO_OPTIONYES_NO_OPTIONYES_NO_OPTIONYES_NO_OPTION, ,

388、 , ,YES_NO_CANCEL_OPTIONYES_NO_CANCEL_OPTIONYES_NO_CANCEL_OPTIONYES_NO_CANCEL_OPTION, , , ,OK_CANCEL_OPTIONOK_CANCEL_OPTIONOK_CANCEL_OPTIONOK_CANCEL_OPTION。 。 。 。l lmessageType messageType messageType messageType 确确确确定定定定显显示示示示在在在在对对话话框框框框中中中中的的的的图图标标。 。 。 。从从从从下下下下列列列列值值中中中中选选择择一一一一个个个个 : : : : PLA

389、IN_MESSAGE PLAIN_MESSAGE PLAIN_MESSAGE PLAIN_MESSAGE ( ( ( (无无无无 icon), icon), icon), icon), ERROR_MESSAGE, ERROR_MESSAGE, ERROR_MESSAGE, ERROR_MESSAGE, INFORMATION_MESSAGE, INFORMATION_MESSAGE, INFORMATION_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, WARNING_MESSAGE, WARNING_MESSAGE, WARNING_MESS

390、AGE, QUESTION_MESSAGE. QUESTION_MESSAGE. QUESTION_MESSAGE. QUESTION_MESSAGE. l licon icon icon icon 指明了在指明了在指明了在指明了在对话对话框中框中框中框中显显示用示用示用示用户户定定定定义图标义图标。 。 。 。l loptionsoptionsoptionsoptions进进一一一一步步步步指指指指明明明明任任任任选选对对话话框框框框底底底底部部部部的的的的按按按按钮钮。 。 。 。一一一一般般般般地地地地, , , ,对对按按按按钮钮指指指指定一个字符串数定一个字符串数定一个字符串数定一个

391、字符串数组组。 。 。 。l linitialValue initialValue initialValue initialValue 指明指明指明指明选择选择的初始的初始的初始的初始值值。 。 。 。119119showMessageDialog()showMessageDialog()和和showOptionDialog()showOptionDialog()方方法法返返回回用用 户户 选选 择择 的的 一一 个个 整整 数数 , 整整 数数 值值 为为 YES_OPTION, YES_OPTION, NO_OPTION, NO_OPTION, CANCEL_OPTION, CANCEL_

392、OPTION, OK_OPTIONOK_OPTION和和CLOSED_OPTIONCLOSED_OPTION之之一一。除除了了CLOSED_OPTIONCLOSED_OPTION的的每每一一个个选选项项都都对对应应用用户户单单击击的的按按钮钮。当当CLOSED_OPTIONCLOSED_OPTION返返回回时时,说明用户关闭了对话框窗口。说明用户关闭了对话框窗口。即即使使用用户户改改变变了了标标准准对对话话框框上上按按钮钮显显示示的的字字符符串串,返返回回 值值 仍仍 然然 为为 预预 定定 义义 的的 整整 数数 值值 之之 一一 。 例例 如如 , 一一 个个YES_NO_OPTIONYE

393、S_NO_OPTION对对 话话 框框 总总 是是 返返 回回 下下 列列 值值 之之 一一 :YES_OPTIONYES_OPTION、NO_OPTIONNO_OPTION或或CLOSED_OPTIONCLOSED_OPTION。【例【例9.229.22】使用对话框。】使用对话框。 120120l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.awt.*;import java.awt.*;import java.awt.*;import

394、java.awt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l lpublic class JOptionPaneDemopublic class JOptionPaneDemopublic class JOptionPaneDemopublic class JOptionPaneDemol l public JFrame aFrame; public JFrame aFrame; public JFrame aFrame; publi

395、c JFrame aFrame;l l public JButton aButton; public JButton aButton; public JButton aButton; public JButton aButton;l l public JOptionPane anOptionPane; public JOptionPane anOptionPane; public JOptionPane anOptionPane; public JOptionPane anOptionPane;l l static JLabel aLabel; static JLabel aLabel; st

396、atic JLabel aLabel; static JLabel aLabel;l l public JOptionPaneDemo() public JOptionPaneDemo() public JOptionPaneDemo() public JOptionPaneDemo()l l aFrame = new JFrame( aFrame = new JFrame( aFrame = new JFrame( aFrame = new JFrame(使用使用使用使用JOptionPane);JOptionPane);JOptionPane);JOptionPane);l l aButt

397、on = new JButton( aButton = new JButton( aButton = new JButton( aButton = new JButton(显显示示示示对话对话框框框框););););l l aLabel = new JLabel(“ aLabel = new JLabel(“ aLabel = new JLabel(“ aLabel = new JLabel(“您作出的您作出的您作出的您作出的选择选择是:是:是:是:”,”,”,”,l l JLabel.CENTER); JLabel.CENTER); JLabel.CENTER); JLabel.CENTER

398、);l l aButton.addActionListener(new OptionListener(); aButton.addActionListener(new OptionListener(); aButton.addActionListener(new OptionListener(); aButton.addActionListener(new OptionListener();l l anOptionPane = new JOptionPane(); anOptionPane = new JOptionPane(); anOptionPane = new JOptionPane(

399、); anOptionPane = new JOptionPane();121121l laFrame.setSize(300,200);aFrame.setSize(300,200);aFrame.setSize(300,200);aFrame.setSize(300,200);l laFrame.getContentPane().add(aButton,aFrame.getContentPane().add(aButton,aFrame.getContentPane().add(aButton,aFrame.getContentPane().add(aButton,l l BorderLa

400、yout.NORTH); BorderLayout.NORTH); BorderLayout.NORTH); BorderLayout.NORTH);l laFrame.getContentPane().add(aLabel,aFrame.getContentPane().add(aLabel,aFrame.getContentPane().add(aLabel,aFrame.getContentPane().add(aLabel,l l BorderLayout.SOUTH); BorderLayout.SOUTH); BorderLayout.SOUTH); BorderLayout.SO

401、UTH);l laFrame.setVisible(true);aFrame.setVisible(true);aFrame.setVisible(true);aFrame.setVisible(true);l laFrame.setDefaultCloseOperation(aFrame.setDefaultCloseOperation(aFrame.setDefaultCloseOperation(aFrame.setDefaultCloseOperation(l l JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_CLOSE); JFrame.EXIT_ON_

402、CLOSE); JFrame.EXIT_ON_CLOSE);l l l lpublic public public public class class class class OptionListener OptionListener OptionListener OptionListener implements implements implements implements ActionListenerActionListenerActionListenerActionListenerl l public void actionPerformed(ActionEvent e) publ

403、ic void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e)l l String choices = String choices = String choices = String choices = 喜喜喜喜欢欢, , , , 不喜不喜不喜不喜欢欢; ; ; ; l l int n = anOptionPane.showOptionDialog(aFrame, int n = anOptionPane.s

404、howOptionDialog(aFrame, int n = anOptionPane.showOptionDialog(aFrame, int n = anOptionPane.showOptionDialog(aFrame,l l 您喜您喜您喜您喜欢欢音音音音乐吗乐吗?, , , , 请选择请选择, , , , 122122l l JOptionPane.YES_NO_OPTION,JOptionPane.YES_NO_OPTION,JOptionPane.YES_NO_OPTION,JOptionPane.YES_NO_OPTION,l l JOptionPane.QUESTION_M

405、ESSAGE, null, JOptionPane.QUESTION_MESSAGE, null, JOptionPane.QUESTION_MESSAGE, null, JOptionPane.QUESTION_MESSAGE, null,l l choices,choices0); choices,choices0); choices,choices0); choices,choices0);l l if(n = 0)if(n = 0)if(n = 0)if(n = 0)l l JOptionPaneDemo.aLabel.setText( JOptionPaneDemo.aLabel.s

406、etText( JOptionPaneDemo.aLabel.setText( JOptionPaneDemo.aLabel.setText(喜喜喜喜欢欢音音音音乐乐););););l l else JOptionPaneDemo.aLabel.setText( else JOptionPaneDemo.aLabel.setText( else JOptionPaneDemo.aLabel.setText( else JOptionPaneDemo.aLabel.setText(不喜不喜不喜不喜欢欢音音音音乐乐););););l l l l l l public static void mai

407、n( String args) public static void main( String args) public static void main( String args) public static void main( String args) l l new JOptionPaneDemo(); new JOptionPaneDemo(); new JOptionPaneDemo(); new JOptionPaneDemo();l l l l 程序运行时显示的程序运行时显示的 对话框如下图所示。对话框如下图所示。1231232.JFileChooser2.JFileChoos

408、er对话框对话框JFileChooserJFileChooser类类提提供供对对文文件件的的打打开开、关关闭闭等等文文件件操操作作的标准对话框。的标准对话框。JFileChooserJFileChooser类继承于类继承于JComponentJComponent类,其构造方法有类,其构造方法有:l lJFileChooser()JFileChooser()JFileChooser()JFileChooser()构构构构造造造造一一一一个个个个指指指指向向向向用用用用户户缺缺缺缺省省省省目目目目录录的的的的JFileChooserJFileChooserJFileChooserJFileChoo

409、ser对对象象象象 。 。 。 。l lJFileChooser(File JFileChooser(File JFileChooser(File JFileChooser(File currentDirectory)currentDirectory)currentDirectory)currentDirectory)构构构构 造造造造 一一一一 个个个个 以以以以 给给 定定定定FileFileFileFile为为路径的路径的路径的路径的JFileChooserJFileChooserJFileChooserJFileChooser对对象。象。象。象。构构 造造 JFileChooserJF

410、ileChooser对对 象象 后后 , 要要 利利 用用 该该 类类 的的 方方 法法 showOpenDialogshowOpenDialog()()或或showSaveDialog()showSaveDialog()来来显显示示文文件件打打开开或或文文件件关关闭闭对对话框。它们的格式为:话框。它们的格式为:l lpublic public public public int int int int showOpenDialog(Component showOpenDialog(Component showOpenDialog(Component showOpenDialog(Compon

411、ent parent)throws parent)throws parent)throws parent)throws HeadlessExceptionHeadlessExceptionHeadlessExceptionHeadlessException124124l lpublic public public public int int int int showSaveDialog(Component showSaveDialog(Component showSaveDialog(Component showSaveDialog(Component parent)throws paren

412、t)throws parent)throws parent)throws HeadlessExceptionHeadlessExceptionHeadlessExceptionHeadlessException它它们们的的参参数数都都是是包包含含对对话话框框容容器器的的对对象象。返返回回值值为为下下面几种情况:面几种情况:l lJFileChooser.CANCEL_OPTION JFileChooser.CANCEL_OPTION JFileChooser.CANCEL_OPTION JFileChooser.CANCEL_OPTION 表示表示表示表示选择选择了了了了“撤消撤消撤消撤消”按

413、按按按钮钮。 。 。 。l lJFileChooser.APPROVE_OPTION JFileChooser.APPROVE_OPTION JFileChooser.APPROVE_OPTION JFileChooser.APPROVE_OPTION 表表表表示示示示选选择择了了了了“打打打打开开开开”或或或或“保存保存保存保存”按按按按钮钮。 。 。 。l lJFileChooser.ERROR_OPTION JFileChooser.ERROR_OPTION JFileChooser.ERROR_OPTION JFileChooser.ERROR_OPTION 表示出表示出表示出表示出现

414、错误现错误。 。 。 。在在打打开开或或关关闭闭文文件件对对话话框框中中作作出出选选择择后后,可可用用JFileChooserJFileChooser类类的的方方法法getSelectedFile()getSelectedFile()返返回回选选取取的文件名(的文件名(FileFile类的对象)。类的对象)。【 例例 9.239.23】 使使 用用 文文 件件 打打 开开 、 关关 闭闭 对对 话话 框框(JFileChooserJFileChooser)。将将选选择择的的文文件件名名显显示示到到文文本本区区域域中。中。125125l limport java.io.*;import java

415、.io.*;import java.io.*;import java.io.*;l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*

416、;l limport javax.swing.filechooser.*;import javax.swing.filechooser.*;import javax.swing.filechooser.*;import javax.swing.filechooser.*;l lpublic class JFileChooserDemo extends JFrame public class JFileChooserDemo extends JFrame public class JFileChooserDemo extends JFrame public class JFileChooserD

417、emo extends JFrame l l public JFileChooserDemo() public JFileChooserDemo() public JFileChooserDemo() public JFileChooserDemo() l l super( super( super( super(使用使用使用使用JFileChooser);JFileChooser);JFileChooser);JFileChooser);l l final JTextArea ta = new JTextArea(5,20); final JTextArea ta = new JTextAr

418、ea(5,20); final JTextArea ta = new JTextArea(5,20); final JTextArea ta = new JTextArea(5,20);l l ta.setMargin(new Insets(5,5,5,5); ta.setMargin(new Insets(5,5,5,5); ta.setMargin(new Insets(5,5,5,5); ta.setMargin(new Insets(5,5,5,5);l l ta.setEditable(false); ta.setEditable(false); ta.setEditable(fal

419、se); ta.setEditable(false);l l JScrollPane sp = new JScrollPane(ta); JScrollPane sp = new JScrollPane(ta); JScrollPane sp = new JScrollPane(ta); JScrollPane sp = new JScrollPane(ta);l l final JFileChooser fc = new JFileChooser(); final JFileChooser fc = new JFileChooser(); final JFileChooser fc = ne

420、w JFileChooser(); final JFileChooser fc = new JFileChooser();l l JButton openBtn = new JButton( JButton openBtn = new JButton( JButton openBtn = new JButton( JButton openBtn = new JButton(打开文件打开文件打开文件打开文件.);.);.);.);126126l lopenBtn.addActionListener(new ActionListener()openBtn.addActionListener(new

421、 ActionListener()openBtn.addActionListener(new ActionListener()openBtn.addActionListener(new ActionListener()l l public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) l l int returnV

422、al = fc.showOpenDialog( int returnVal = fc.showOpenDialog( int returnVal = fc.showOpenDialog( int returnVal = fc.showOpenDialog(l l JFileChooserDemo.this); JFileChooserDemo.this); JFileChooserDemo.this); JFileChooserDemo.this);l l if if if if (returnVal (returnVal (returnVal (returnVal = = = = JFile

423、Chooser.APPROVE_OPTION) JFileChooser.APPROVE_OPTION) JFileChooser.APPROVE_OPTION) JFileChooser.APPROVE_OPTION) l l File file = fc.getSelectedFile(); File file = fc.getSelectedFile(); File file = fc.getSelectedFile(); File file = fc.getSelectedFile();l l ta.append( ta.append( ta.append( ta.append(打开打

424、开打开打开: + file.getName() + .n);: + file.getName() + .n);: + file.getName() + .n);: + file.getName() + .n);l l else ta.append( else ta.append( else ta.append( else ta.append(取消打开命令取消打开命令取消打开命令取消打开命令.n);.n);.n);.n);l l l l ); ); ); );l lJButton saveBtn = new JButton(JButton saveBtn = new JButton(JButto

425、n saveBtn = new JButton(JButton saveBtn = new JButton(保存文件保存文件保存文件保存文件.);.);.);.);l lsaveBtn.addActionListener(new ActionListener()saveBtn.addActionListener(new ActionListener()saveBtn.addActionListener(new ActionListener()saveBtn.addActionListener(new ActionListener()l l public void actionPerformed

426、(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e)l l int returnVal = fc.showSaveDialog( int returnVal = fc.showSaveDialog( int returnVal = fc.showSaveDialog( int returnVal = fc.showSaveDialog(l l JFileChoo

427、serDemo.this); JFileChooserDemo.this); JFileChooserDemo.this); JFileChooserDemo.this);127127l l if (returnVal = JFileChooser.APPROVE_OPTION)if (returnVal = JFileChooser.APPROVE_OPTION)if (returnVal = JFileChooser.APPROVE_OPTION)if (returnVal = JFileChooser.APPROVE_OPTION)l lFile file = fc.getSelecte

428、dFile();File file = fc.getSelectedFile();File file = fc.getSelectedFile();File file = fc.getSelectedFile();l lta.append(Saving: + file.getName() + .n);ta.append(Saving: + file.getName() + .n);ta.append(Saving: + file.getName() + .n);ta.append(Saving: + file.getName() + .n);l l else ta.append( else t

429、a.append( else ta.append( else ta.append(取消保存命令。取消保存命令。取消保存命令。取消保存命令。n);n);n);n);l l l l););););l lJPanel buttonPanel = new JPanel();JPanel buttonPanel = new JPanel();JPanel buttonPanel = new JPanel();JPanel buttonPanel = new JPanel();l lbuttonPanel.add(openBtn);buttonPanel.add(openBtn);buttonPanel.

430、add(openBtn);buttonPanel.add(openBtn);l lbuttonPanel.add(saveBtn);buttonPanel.add(saveBtn);buttonPanel.add(saveBtn);buttonPanel.add(saveBtn);l lopenBtn.setNextFocusableComponent(saveBtn);openBtn.setNextFocusableComponent(saveBtn);openBtn.setNextFocusableComponent(saveBtn);openBtn.setNextFocusableCom

431、ponent(saveBtn);l lsaveBtn.setNextFocusableComponent(openBtn);saveBtn.setNextFocusableComponent(openBtn);saveBtn.setNextFocusableComponent(openBtn);saveBtn.setNextFocusableComponent(openBtn);l lContainer c = getContentPane();Container c = getContentPane();Container c = getContentPane();Container c =

432、 getContentPane();l lc.add(buttonPanel, BorderLayout.NORTH);c.add(buttonPanel, BorderLayout.NORTH);c.add(buttonPanel, BorderLayout.NORTH);c.add(buttonPanel, BorderLayout.NORTH);l lc.add(sp, BorderLayout.CENTER);c.add(sp, BorderLayout.CENTER);c.add(sp, BorderLayout.CENTER);c.add(sp, BorderLayout.CENT

433、ER);l l 128128l l public static void main(String args) public static void main(String args) public static void main(String args) public static void main(String args) l l JFrame frame = new JFileChooserDemo(); JFrame frame = new JFileChooserDemo(); JFrame frame = new JFileChooserDemo(); JFrame frame

434、= new JFileChooserDemo();l l frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setDefaultCloseOperation(EXIT_ON_CLOSE);l l frame.pack(); frame.pack(); frame.pack(); frame.pack();l l frame.setVisible(true

435、); frame.setVisible(true); frame.setVisible(true); frame.setVisible(true);l l l l 程程序序运运行行的的开开始始界界面面如如下下图图左左,选选择择“打打开开文文件件”按按钮钮后后,即即出出现现下下图图右右的的打打开开文文件件对对话话框框,选选择择文文件件后后将将选选择择文文件件名名显显示示到到文文本本区区域域中中。选选择择“保保存存文文件件”按钮,将出现文件保存对话框。按钮,将出现文件保存对话框。129129例9.23的运行界面。1301309.4 鼠标和键盘事件在在GUIGUI程程序序中中,通通常常使使用用鼠鼠标

436、标来来进进行行人人机机交交互互操操作作。鼠鼠标标的的移移动动、单单击击、双双击击等等都都会会引引发发鼠鼠标标事事件件。为为输输入入数数据据、操操作作命命令令等等,也也使使用用键键盘盘。键键盘盘的的按按下下,释释放放也也会会引引发发键键盘盘事事件件。下下面面简简单单介介绍绍AWTAWT的鼠标和键盘事件的处理。的鼠标和键盘事件的处理。1311319.4.1 9.4.1 鼠标事件鼠标事件处处理理鼠鼠标标事事件件的的程程序序要要实实现现在在java.awt.eventjava.awt.event包包中中定定义义的的两两个个接接口口MouseListenerMouseListener和和MouseMot

437、ionListenerMouseMotionListener,在这两个接口中定义了未实现的鼠标事件处理方法。,在这两个接口中定义了未实现的鼠标事件处理方法。接口接口MouseListenerMouseListener中的方法为:中的方法为:l lpublic public public public void void void void mousePressed(MouseEvent mousePressed(MouseEvent mousePressed(MouseEvent mousePressed(MouseEvent e)e)e)e)处处理理理理按按按按下下下下鼠鼠鼠鼠标标左左左左键

438、键l lpublic void mouseClicked(MouseEvent e)public void mouseClicked(MouseEvent e)public void mouseClicked(MouseEvent e)public void mouseClicked(MouseEvent e)处处理鼠理鼠理鼠理鼠标单击标单击l lpublic public public public void void void void mouseReleased(MouseEvent mouseReleased(MouseEvent mouseReleased(MouseEvent mo

439、useReleased(MouseEvent e)e)e)e)处处理理理理鼠鼠鼠鼠标标按按按按键键释释放放放放l lpublic public public public void void void void mouseEntered(MouseEvent mouseEntered(MouseEvent mouseEntered(MouseEvent mouseEntered(MouseEvent e)e)e)e)处处理理理理鼠鼠鼠鼠标标进进入入入入当当当当前窗口前窗口前窗口前窗口l lpublic public public public void void void void mouse

440、Exited(MouseEvent mouseExited(MouseEvent mouseExited(MouseEvent mouseExited(MouseEvent e)e)e)e)处处理理理理鼠鼠鼠鼠标标离离离离开开开开当当当当前窗口前窗口前窗口前窗口132132接口接口MouseMotionListenerMouseMotionListener中的方法为:中的方法为:l lpublic void mouseDragged(MouseEvent e)public void mouseDragged(MouseEvent e)public void mouseDragged(Mouse

441、Event e)public void mouseDragged(MouseEvent e)处处理鼠理鼠理鼠理鼠标标拖拖拖拖动动l lpublic void mouseMoved(MouseEvent e)public void mouseMoved(MouseEvent e)public void mouseMoved(MouseEvent e)public void mouseMoved(MouseEvent e)处处理鼠理鼠理鼠理鼠标标移移移移动动对对应应上上述述接接口口,对对应应的的注注册册监监听听器器的的方方法法是是addMouseListeneraddMouseListener()

442、()和和addMouseMotionListener()addMouseMotionListener()。另另外外,类类MouseEventMouseEvent的的方方法法getX()getX()、getY()getY()常常用用来来获获取鼠标当前所在位置的坐标,它们的格式如下:取鼠标当前所在位置的坐标,它们的格式如下:l lpublic int getX()public int getX()public int getX()public int getX()l lpublic int getY()public int getY()public int getY()public int get

443、Y()【例【例9.249.24】通过单击鼠标来画蓝色的圆点。】通过单击鼠标来画蓝色的圆点。133133l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l limport java.awt.*;import java.awt.*;import java.awt.*;import

444、 java.awt.*;l lpublic class MouseEventDemo extends JAppletpublic class MouseEventDemo extends JAppletpublic class MouseEventDemo extends JAppletpublic class MouseEventDemo extends JAppletl l public void init() public void init() public void init() public void init()l l addMouseListener(new CircleLis

445、tener(); addMouseListener(new CircleListener(); addMouseListener(new CircleListener(); addMouseListener(new CircleListener();l l setForeground(Color.blue); setForeground(Color.blue); setForeground(Color.blue); setForeground(Color.blue);l l setBackground(Color.white); setBackground(Color.white); setB

446、ackground(Color.white); setBackground(Color.white);l l l l l lclass CircleListener extends MouseAdapter class CircleListener extends MouseAdapter class CircleListener extends MouseAdapter class CircleListener extends MouseAdapter l l private int radius = 10; private int radius = 10; private int radi

447、us = 10; private int radius = 10;l l public void mousePressed(MouseEvent e) public void mousePressed(MouseEvent e) public void mousePressed(MouseEvent e) public void mousePressed(MouseEvent e) l l JApplet app = (JApplet)e.getSource(); JApplet app = (JApplet)e.getSource(); JApplet app = (JApplet)e.ge

448、tSource(); JApplet app = (JApplet)e.getSource();134134l lGraphics g = app.getGraphics();Graphics g = app.getGraphics();Graphics g = app.getGraphics();Graphics g = app.getGraphics();l l g.fillOval(e.getX()-radius,e.getY()-radius, g.fillOval(e.getX()-radius,e.getY()-radius, g.fillOval(e.getX()-radius,

449、e.getY()-radius, g.fillOval(e.getX()-radius,e.getY()-radius,l l 2*radius,2*radius); 2*radius,2*radius); 2*radius,2*radius); 2*radius,2*radius);l l l l 程序运行结果如下图所示。程序运行结果如下图所示。1351359.4.2 9.4.2 键盘事件键盘事件处处理理键键盘盘事事件件的的程程序序要要实实现现在在java.awt.eventjava.awt.event包包中中定定义义的的接接口口KeyListenerKeyListener,在在这这个个接接

450、口口中中定定义义了了未未实实现现的的键盘事件处理方法。键盘事件处理方法为:键盘事件处理方法。键盘事件处理方法为:l lpublic void KeyPressed(KeyEvent e)public void KeyPressed(KeyEvent e)public void KeyPressed(KeyEvent e)public void KeyPressed(KeyEvent e)处处理按下理按下理按下理按下键键。 。 。 。l lpublic void KeyReleased(KeyEvent e)public void KeyReleased(KeyEvent e)public vo

451、id KeyReleased(KeyEvent e)public void KeyReleased(KeyEvent e)处处理松开理松开理松开理松开键键。 。 。 。l lpublic void KeyTyped(KeyEvent e)public void KeyTyped(KeyEvent e)public void KeyTyped(KeyEvent e)public void KeyTyped(KeyEvent e)处处理敲理敲理敲理敲击键盘击键盘。 。 。 。为为识识别别引引发发键键盘盘事事件件的的按按键键,常常用用到到KeyEventKeyEvent类类的的如如下方法:下方法:l

452、 lpublic public public public char char char char getKeyChar()getKeyChar()getKeyChar()getKeyChar()返返返返回回回回该该事事事事件件件件中中中中键键的的的的字字字字符符符符。 。 。 。例例例例如如如如, , , ,shift + ashift + ashift + ashift + a按按按按键键事件返回事件返回事件返回事件返回值为值为AAAA。 。 。 。l lpublic public public public static static static static String Strin

453、g String String getKeyText(int getKeyText(int getKeyText(int getKeyText(int keyCode)keyCode)keyCode)keyCode)返返返返回回回回描描描描述述述述键键代代代代码码的字符串,例如的字符串,例如的字符串,例如的字符串,例如HOMEHOMEHOMEHOME、 、 、 、F1 F1 F1 F1 或或或或AAAA等。等。等。等。 136136【例例9.249.24】综综合合鼠鼠标标事事件件和和键键盘盘事事件件处处理理的的程程序序,模模拟拟一一个个电电子子白白板板,可可以以用用鼠鼠标标在在上上面面绘绘画画

454、,可可用用键键盘盘在上面写字。在上面写字。l limport javax.swing.*;import javax.swing.*;import javax.swing.*;import javax.swing.*;l limport java.awt.*;import java.awt.*;import java.awt.*;import java.awt.*;l limport java.awt.event.*;import java.awt.event.*;import java.awt.event.*;import java.awt.event.*;l lpublic class Mo

455、useAndKeyDemo extends JApplet public class MouseAndKeyDemo extends JApplet public class MouseAndKeyDemo extends JApplet public class MouseAndKeyDemo extends JApplet l l protected int lastX = 0, lastY = 0; protected int lastX = 0, lastY = 0; protected int lastX = 0, lastY = 0; protected int lastX = 0

456、, lastY = 0;l l public void init() public void init() public void init() public void init() l l setBackground(Color.white); setBackground(Color.white); setBackground(Color.white); setBackground(Color.white);l l setForeground(Color.blue); setForeground(Color.blue); setForeground(Color.blue); setForeg

457、round(Color.blue);l l addMouseListener(new PositionRecorder(); addMouseListener(new PositionRecorder(); addMouseListener(new PositionRecorder(); addMouseListener(new PositionRecorder();l l addMouseMotionListener(new LineDrawer(); addMouseMotionListener(new LineDrawer(); addMouseMotionListener(new Li

458、neDrawer(); addMouseMotionListener(new LineDrawer();l l addKeyListener(new CharDrawer(); addKeyListener(new CharDrawer(); addKeyListener(new CharDrawer(); addKeyListener(new CharDrawer();l l l l protected void record(int x, int y) protected void record(int x, int y) protected void record(int x, int

459、y) protected void record(int x, int y) 137137l l lastX = x;lastX = x;lastX = x;lastX = x;l l lastY = y; lastY = y; lastY = y; lastY = y;l l l l private class PositionRecorder extends MouseAdapter private class PositionRecorder extends MouseAdapter private class PositionRecorder extends MouseAdapter

460、private class PositionRecorder extends MouseAdapterl l public void mouseEntered(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseEntered(MouseEvent e) l l requestFocus(); requestFocus(); requestFocus(); requestFocus();l l record(e.getX(), e

461、.getY(); record(e.getX(), e.getY(); record(e.getX(), e.getY(); record(e.getX(), e.getY();l l l l public void mousePressed(MouseEvent e) public void mousePressed(MouseEvent e) public void mousePressed(MouseEvent e) public void mousePressed(MouseEvent e) l l record(e.getX(), e.getY(); record(e.getX(),

462、 e.getY(); record(e.getX(), e.getY(); record(e.getX(), e.getY();l l l l l lprivate class LineDrawer extends MouseMotionAdapter private class LineDrawer extends MouseMotionAdapter private class LineDrawer extends MouseMotionAdapter private class LineDrawer extends MouseMotionAdapter l l public void m

463、ouseDragged(MouseEvent e) public void mouseDragged(MouseEvent e) public void mouseDragged(MouseEvent e) public void mouseDragged(MouseEvent e) l l int x = e.getX() int x = e.getX() int x = e.getX() int x = e.getX(), , , ,y = e.getY(); y = e.getY(); y = e.getY(); y = e.getY(); 138138l lGraphics g = g

464、etGraphics();Graphics g = getGraphics();Graphics g = getGraphics();Graphics g = getGraphics();l l g.drawLine(lastX, lastY, x, y); g.drawLine(lastX, lastY, x, y); g.drawLine(lastX, lastY, x, y); g.drawLine(lastX, lastY, x, y);l l record(x, y); record(x, y); record(x, y); record(x, y); l l l l l l pri

465、vate class CharDrawer extends KeyAdapter private class CharDrawer extends KeyAdapter private class CharDrawer extends KeyAdapter private class CharDrawer extends KeyAdapter l l public void keyTyped(KeyEvent event) public void keyTyped(KeyEvent event) public void keyTyped(KeyEvent event) public void

466、keyTyped(KeyEvent event) l l String s = String.valueOf(event.getKeyChar(); String s = String.valueOf(event.getKeyChar(); String s = String.valueOf(event.getKeyChar(); String s = String.valueOf(event.getKeyChar();l l getGraphics().drawString(s, lastX, lastY); getGraphics().drawString(s, lastX, lastY)

467、; getGraphics().drawString(s, lastX, lastY); getGraphics().drawString(s, lastX, lastY); l l record(lastX + 11, lastY); record(lastX + 11, lastY); record(lastX + 11, lastY); record(lastX + 11, lastY);l l l l l l 139139程程序序中中,在在类类MouseAndKeyDemoMouseAndKeyDemo中中定定义义了了三三个个私私有有嵌嵌套套类类,两两个个类类对对鼠鼠标标事事件件进进行行处处理理,一一个个类类对对键键盘盘事事件件进行处理。进行处理。程程序序的的运运行行情情况况如如下下图图所所示示。图图中中的的线线用用鼠鼠标标随随手手画画出,文字用键盘输入。出,文字用键盘输入。140140谢谢观赏!谢谢观赏!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号