1、教学目标教学目标9.1 AWT和Swing组件概述9.2 事件处理模型9.3 命令按钮JButton9.4 标签、单行文本框、多行文本域与滚动条面板9.5 复选框按钮JCheckBox和单选按钮JRadioButton9.6 组合框JComboBox9.7 列表JList9.8 布局管理器教学目标教学目标(续续)9.9 面板JPanel和窗口9.10 鼠标事件处理9.11 适配器类9.12 键盘事件处理9.13 菜单 9.13.1 主菜单 9.13.2 弹出式菜单9.14 选项卡面板JTabbedPane9.1 Swing和和AWT组件概述组件概述n 图形用户界面GUI(Graphical U
2、ser Interfaces),给用户提供了一个交互式的直观图形化操作界面。n提供了程序的外观和感觉n每个Java程序利用GUI图形用户界面接受用户的输入,向用户输出程序运行的结果。menu barbuttoncombo boxmenusscroll bars9.1 AWT和和Swing组件概述组件概述nJava语言中,为了方便图形用户界面的开发,设计了专门的类库来生成各种标准图形界面元素和处理图形界面的各种事件。用来生成图形用户界面的类库:njava.awt包。nAWT(abstract window toolkit,抽象窗口工具集)njavax.swing包1、AWT组件组件介绍介绍 ja
3、va.awt包提供了基本的包提供了基本的Java程序的程序的GUI设计工具,设计工具,包中的主要类或接口之间的继承关系包中的主要类或接口之间的继承关系:ObjectLayoutManagerComponentLabelWindowButtonCanvasCheckboxContainerPanelDialogAppletFrame1、AWT组件组件介绍介绍(1)(1)组件组件Component n组件是一个以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如Button、Label,组件通常被放在容器中。nComponent类是抽象类,定义了所有组件所具有的通用特性和行为,并派生出其他所有
4、的组件。nCompoment类提供的功能:n基本的绘画支持。方法repaint()、paint()、update()等用来在屏幕上绘制组件.n外形控制。包括字体、颜色等。相应的方法有:getFont()、setFont()、setBackground()、SetForeground()等n大小和位置控制。方法有:setSize()、setLocation()等。n图像处理。类Component实现了接口ImageObserver,其中的方法imageUpdate()用来进行图像跟踪。n组件的状态控制。例如:setEnable()控制组件是否接收用户的输入,isEnable(),isVisibl
5、e()、isValid()返回组件的状态。1、AWT组件组件介绍介绍(3)(3)布局管理器布局管理器LayoutManager LayoutManager n布局管理器管理组件在容器中的布局方式。布局管理器类都实现了接口LayoutManager。nJava系统提供的标准布局管理器类:nFlowLayoutnBorderLayoutnGridLayoutnCardLayoutnBoxLayoutnGridBagLayout 1、AWT组件组件介绍介绍(2)(2)容器容器Containern容器是Component的子类,它具有组件的所有性质,同时又具有容纳其它组件和容器的功能。n每个容器nad
6、d()方法向容器添加某个组件,nremove()方法从容器中删除某个组件。n每个容器都与一个布局管理器相联,以确定容器内组件的布局方式。n容器通过方法setLayout()设置某种布局。2.Swing2.Swing介绍介绍nSwing 组件在javax.swing包中。其特点:(1)Swing组件是用100纯Java代码实现的轻量级(light-weight)组件.n没有本地代码,不依赖操作系统的支持,这是它与重量级组件AWT的最大区别。nSwing比AWT组件具有更强的实用性和美观性。2.Swing2.Swing介绍介绍(2)Swing组件的多样化组件的多样化 Swing是AWT的扩展,Sw
7、ing组件以“J”开头.n有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本组件外,n增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。n大多数Swing组件从JComponent类继承nJComponent是一个抽象类:定义所有子类组件的一般方法,如:n使用setBorder()方法:设置组件外围的边框;n使用setTooltipText()方法:为组件设置对用户有帮助的提示信息。Swing 组件的继承的超类ObjectComponentContainerJComponentObjectComponent
8、JComponentContainer2.Swing2.Swing介绍介绍(3)可插入的外观感觉 Swing使得程序在一个平台上运行时能够有不同的外观。3.Swing3.Swing组件的分类组件的分类从功能上分:从功能上分:(1)顶层容器:JFrame,JApplet,JDialog,JWindow共4个(2)普通容器:JPanel,JScrollPane,JSplitPane,JToolBar(3)特殊容器:在GUI上起特殊作用的中间层JInternalFrame,JLayeredPane,JRootPane.(4)基本控件:实现人际交互的组件,如JButton,JComboBox,JLis
9、t,JMenu,JSlider,JTextField(5)向用户显示不可编辑信息的组件.例如JLabel,JProgressBar,ToolTip(6)向用户显示能被编辑的格式化信息的组件.如JColorChooser,JFileChooser,JTable,JTextArea4 4使用使用SwingSwing的基本规则的基本规则n与AWT组件不同,Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(content pane)上。n例如,对JFrame顶层容器而言,添加组件有两种方式:n方式方式1 1:用:用getContentPane()getCon
10、tentPane()方法获得方法获得JFrameJFrame的内容面板,再对的内容面板,再对其加入组件:其加入组件:frame.getContentPane().add(childComponent)frame.getContentPane().add(childComponent);n方式方式2 2:建立一个:建立一个JPanelJPanel或或 JDesktopPaneJDesktopPane之类的中间容器,把组之类的中间容器,把组件添加到容器中,用件添加到容器中,用setContentPane()setContentPane()方法把该容器置为方法把该容器置为JFrameJFrame的内
11、容面板:的内容面板:JPanel JPanel contentPanecontentPane=new JPanel();=new JPanel();/把其它组件添加到把其它组件添加到JPanelJPanel中中;frame.setContentPane(frame.setContentPane(contentPanecontentPane););把contentPane对象设置为frame的内容面板9.2 事件处理模型事件处理模型nJava 的图形用户界面是事件驱动的:n当用户与GUI组件交互时会引发一个系统预先定义好的事件。n一些常见的事件:鼠标移动、单击鼠标按钮、鼠标单击按钮button、
12、在文本框中进行输入、在菜单中选择菜单项、关闭窗口等。nGUI事件对象:从java.awt.event.AWTEvent类继承java.awt.eventjava.awt.event包中的事件类包中的事件类ObjectEventObjectAWTEventActionEventAdjustmentEventItemEventTextEventContainerEventFocusEventPaintEventWindowEventInputEventMouseWheelEventComponentEventKeyEventMouseEvent9.2 事件处理模型事件处理模型1.Java的事件处理
13、模型由三部分组成:n 事件源事件源(Event source):是用户交互的各种GUI组件。n 事件对象事件对象(Event object):封装了发生事件的有关信息。n 事件监听器事件监听器(Event listener):当事件发生时被通知到接受事件的事件监听对象,然后调用事件监听对象中对应的方法响应该事件。n一个事件监听对象是实现了系统规定的事件监听接口的类的对象。n事件监听接口中提供了事件处理的抽象方法的描述。图图9-4 9-4 JavaJava系统的系统的事件监听接口事件监听接口njava.awt.event包定义了Java系统的一组事件监听接口类型,一个监听接口往往声明了一个以上的
14、抽象方法。每个抽象方法对应着要处理的事件动作,由用户实现它。EventListenerActionListenerAdjustmentListenerComponentListenerContainerListenerFocusListenerItemListenerKeyListenerMouseListenerMouseMotionListenerTextListenerWindowListener9.2 事件处理模型事件处理模型 2.2.当需要对组件的某种事件进行响应和处理时,当需要对组件的某种事件进行响应和处理时,程序员必须完成两个步骤:程序员必须完成两个步骤:1)为组件注册实现规定接
15、口的事件监听器;2)实现事件监听器接口中声明的事件处理抽象方法。例如,button组件的事件响应过程:JButton button=new JButton(Press);/(1)为button组件注册事件监听器button.addActionListener(new ButtonHandler();ClassButtonHandler implementsActionListener/实现事件监听接口的类 public void actionPerformed(ActionEvent event)/(2)实现事件处理方法。/事件处理代码 鼠标单击,触发事件ActionEvent将调用方法act
16、ionPerformed9.2 事件处理模型事件处理模型3.ActionEvent3.ActionEvent动作事件动作事件 nActionEvent:当特定组件(例如Button)的动作(例如点击按钮)发生时,由组件生成此动作事件。n该事件被传递给使用组件的 addActionListener 方法注册的每一个 ActionListener 对象,用以接收这类事件.n能够触发这个事件的动作,主要包括:(1)点击按钮(2)双击一个列表中的选项;(3)选择菜单项;(4)在文本框中输入回车。9.2 事件处理模型事件处理模型 ActionEvent事件常用的一些方法:(1)String getAct
17、ionCommand():返回引发事件的动作的命令字符串。例如,对于Button按钮返回的是Button的标签。对于JTextField返回的是文本内容。(2)String getSource():返回引发该事件的组件对象(事件源)的引用。使用getSource()方法可以区分产生动作命令的不同事件源 下面将介绍各个GUI组件时将结合相应的事件类型和事件监听器接口类型进行程序设计的过程。9.3 9.3 命令按钮命令按钮JButtonJButton n命令按钮(JButton)是一种组件,当用户通过单击按钮时将产生动作事件ActionEvent,以触发特定的动作代码,从而完成预先指定的功能。nS
18、wing中JButton既支持文本按钮,也支持图像按钮,或两者兼有。9.3 9.3 命令按钮命令按钮JButtonJButton 1 1创建按钮对象创建按钮对象JButton类常用的一组构造方法:(1)JButton(String text):创建一个带文本的按钮。(2)JButton(Icon icon):创建一个带图标的按钮。(3)JButton(String text,Icon icon):创建一个带文本和图标的按钮。2按钮对象的常用方法按钮对象的常用方法 getLabel()getLabel():返回按钮的标签字符串;setLabel(String s)setLabel(String
19、s):设置按钮的标签为字符串s。9.3 9.3 命令按钮命令按钮JButtonJButton3 3ActionEventActionEvent事件响应事件响应n当用户单击一个按钮时就引发了一个动作事件ActionEvent。n调用JButton的方法addActionListenern给按钮注册实现ActionListener接口的事件监听器n为这个接口的actionPerformed(ActionEvent e)方法编写方法体。ne.getSource():获取引发动作事件的按钮对象引用ne.getActionCommand():获取按钮的标签。9.3 9.3 命令按钮命令按钮JButton
20、JButton例例9-1 文本按钮和图像按钮的程序设计示例文本按钮和图像按钮的程序设计示例 import java.awt.import java.awt.*;import java.awt.event.import java.awt.event.*;import javax.swing.import javax.swing.*;public class ButtonTest extends JFrame public class ButtonTest extends JFrame private JButton plainButton,fancyButton;private JButton
21、plainButton,fancyButton;public ButtonTest()public ButtonTest()/set up GUI/set up GUI super(JButton super(JButton的程序设计的程序设计););Container container=getContentPane();Container container=getContentPane();container.setLayout(new FlowLayout();container.setLayout(new FlowLayout();plainButton=new JButton(pl
22、ainButton=new JButton(文本按钮文本按钮););container.add(plainButton);container.add(plainButton);Icon bug1=Icon bug1=new ImageIcon(getClass().getResource(bug1.gif);new ImageIcon(getClass().getResource(bug1.gif);Icon bug2=Icon bug2=new ImageIcon(getClass().getResource(bug2.gif);new ImageIcon(getClass().getRes
23、ource(bug2.gif);fancyButton=new JButton(fancyButton=new JButton(文本图像按钮文本图像按钮,bug1);,bug1);fancyButton.setRolloverIcon(bug2);fancyButton.setRolloverIcon(bug2);container.add(fancyButton);container.add(fancyButton);ButtonHandler handler=new ButtonHandler();ButtonHandler handler=new ButtonHandler();fanc
24、yButton.addActionListener(handler);fancyButton.addActionListener(handler);plainButton.addActionListener(handler);plainButton.addActionListener(handler);fancyButtonfancyButton的的默任图标默任图标bug1bug1当鼠标置于该按当鼠标置于该按钮上时钮上时,显示图标显示图标bug2bug2为为 button button 事件处理创建事件处理创建类类 ButtonHandlerButtonHandler的对象的对象 setSiz
25、e(275,100);setSize(275,100);setVisible(true);setVisible(true);/end ButtonTest constructor/end ButtonTest constructor public static void main(String args)public static void main(String args)ButtonTest application=new ButtonTest();ButtonTest application=new ButtonTest();application.setDefaultCloseOper
26、ation(JFrame.EXIT_ON_CLOSE);application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/inner class for button event handling/inner class for button event handling private class ButtonHandler implements ActionListener private class ButtonHandler implements ActionListener /handle button event/handle
27、button event public void actionPerformed(ActionEvent event)public void actionPerformed(ActionEvent event)JOptionPane.showMessageDialog(JOptionPane.showMessageDialog(ButtonTest.thisButtonTest.this,你按下的是你按下的是:+:+event.getActionCommand()event.getActionCommand(););9.4 9.4 标签、单行文本框、多行文本域标签、单行文本框、多行文本域与滚动
28、条面板与滚动条面板 n搭建GUI图形界面使用最多的Swing组件:n标签(JLabel)、n单行文本框(JTextField、JTextPassword)n多行文本域(JTextArea)n滚动条面板(JScrollPane)(JScrollPane)9.4.1 9.4.1 标签标签 JLabelJLabel nJLabel标签是用户不能修改只能查看其内容的文本显示区域,它起到信息说明的作用。nJLabel 对象可以显示文本和图像。9.4.1 9.4.1 标签标签 JLabelJLabeln使用使用JLabelJLabel类的构造方法创建类的构造方法创建标签对象。标签对象。JLabel类常用的
29、构造方法有:(1)JLabel(String text)(2)JLabel(Icon image)(3)JLabel(String text int horizontalAlignment)水平对齐方式HorizontalAlignment值:SwingConstants接口中静态常量:LEFT、CENTER、RIGHT、LEADING 或 TRAILING。(4)JLabel(String text,Icon icon,int horizontalAlignment)创建具有指定文本、图像和水平对齐方式的JLabel对象,该标签在其显示区内垂直居中对齐。文本位于图像的结尾。9.4.1 9.4
30、.1 标签标签 JLabelJLabeln设置或读取设置或读取JLabelJLabel对象属性的常用方法对象属性的常用方法:(1)设置或读取JLabel显示的文本。setText(String text)、String getText():(2)设置或读取JLabel显示的图像:setIcon(Icon image)、getIcon()(3)设置JLabel显示文本的前景色和背景色。setForeground(Color c)setBackground(Color c):(4)设置JLabel显示的文本字体:setFont(Font f):。9.4.1 9.4.1 标签标签 JLabelJLa
31、beln例如:创建文本内容是“文本标签”且颜色是红色的 JLabel实例的语句:label1=new JLabel(“用户名);label1.setColor(Color.RED);例:创建文本内容为“照片”,图像是czims.jpg,且整个标签水平靠左对齐的JLabel实例语句:Icon bug=new ImageIcon (getClass().getResource(czims.jpg);label2=new JLabel(“照片,bug,SwingConstants.LEFT);/设置label2的文本相对于图片的位置:水平方向居中对齐,垂直方向在图片的底部 label2.setHor
32、izontalTextPosition(SwingConstants.CENTER);label2.setHorizontalTextPosition(SwingConstants.CENTER);label2.setVerticalTextPosition(SwingConstants.BOTTOM);label2.setVerticalTextPosition(SwingConstants.BOTTOM);9.4.2 JTextField9.4.2 JTextField与与JTextAreaJTextArean从JTextComponent父类派生n单行文本框JTextField、JPas
33、swordField 允许编辑单行文本,JTextField显示用户输入的内容,JPasswordField隐藏用户实际输入的内容。n多行文本域JTextArea 允许用户编辑多行文本。n滚动条面板JScrollPane:提供JTextArea内容水平滚动和纵向滚动。1JTextField和JPasswordFieldnJTxtField常用的构造方法:(1)JTextField():构造一个内容为空的JTextField实例。(2)JTextField(int columns):构造一个内容为空和指定列宽 的JTextField实例。(3)JTextField(String text):构造
34、一个用指定文本的JTextField实例。(4)JTextField(String text,int columns):构造一个指定文本和列宽的JTextField实例。n JPassword类的构造方法类似于JTextField.9.4.2 JTextField9.4.2 JTextField与与JTextAreaJTextArea3 3JTextComponentJTextComponent对象的常用方法对象的常用方法:void setText(String)设置文本内容 String getText()取得文本内容 void setEditable(boolean b)设置TextCom
35、ponent是否为可编辑的(b值为true时)。String getSelectedText()返回TextComponent中包含的选定文本。9.4.2 JTextField9.4.2 JTextField与与JTextAreaJTextArea4TextEventTextEvent和和ActionEventActionEvent事件响应事件响应nJTextField和JTextArea的事件响应首先由它们的父类JTextComponent决定nTextComponent引发事件TextEventn当用户对文本做编辑修改操作时,将引发TextEvent文本改变事件。nJTextField比J
36、TextArea多产生一种事件ActionEvent n当用户在文本框中按回车键时,将引发ActionEvent动作事件。JTextArea却不能产生ActionEvent事件.9.4.3 9.4.3 滚动条面板滚动条面板JScrollPaneJScrollPane nJScrollPane是带滚动条的面板。它是一个容器组件,其作用是通过滚动条在一个较小的区域显示较多大的内容。nJScrollPane的构造方法:JScrollPane(Component view):创建一个显示指定组件内容的 JScrollPane,只要组件的内容超过视图大小就会显示水平和垂直滚动条。n例例9-2 JLabe
37、l9-2 JLabel、JTextFieldJTextField、JPasswordFieldJPasswordField和和JTextAreaJTextArea的应用。的应用。程序运行输出结果如图程序运行输出结果如图9-79-7。程序的功能:。程序的功能:(1 1)当用户分别在用户名和口令的文本框中输入内容按回车键)当用户分别在用户名和口令的文本框中输入内容按回车键后,将在标签为后,将在标签为“显示用户名或口令显示用户名或口令”的文本框中显示用户的文本框中显示用户输入的内容。输入的内容。(2 2)在图的下半部分定义了一个水平方向的)在图的下半部分定义了一个水平方向的BoxBox对象,加入对象
38、,加入BoxBox的组件按水平方向排列。在的组件按水平方向排列。在BoxBox对象中加入了三个对象中加入了三个GUIGUI组件:组件:两个两个JTextAreaJTextArea和一个和一个JButtonJButton。用户可通过鼠标选择左边用户可通过鼠标选择左边的的textArea1textArea1的内容,然后鼠标的内容,然后鼠标单击标签为单击标签为“拷贝拷贝”按钮按钮,会会将选中的将选中的textArea1textArea1的内容拷贝到右边的内容拷贝到右边JScrollPaneJScrollPane中。两个中。两个JTextAreaJTextArea对象分别放入两个对象分别放入两个JSc
39、rollPaneJScrollPane滚动条面板对象中滚动条面板对象中.import java.awt.import java.awt.*;import java.awt.event.import java.awt.event.*;import javax.swing.import javax.swing.*;public class LabelandTextTest extends JFrame public class LabelandTextTest extends JFrame private JTextField textField1,textField3;private JText
40、Field textField1,textField3;private JTextArea textArea1,textArea2;private JTextArea textArea1,textArea2;private JPasswordField passwordField;private JPasswordField passwordField;private JButton copyButton;private JButton copyButton;public LabelandTextTest()/set up GUI public LabelandTextTest()/set u
41、p GUI super(JTextField,JPasswordField super(JTextField,JPasswordField 和和JTextAreaJTextArea的使用的使用););Container container=getContentPane();Container container=getContentPane();container.setLayout(new FlowLayout();container.setLayout(new FlowLayout();JLabel label1=new JLabel(JLabel label1=new JLabel(用户
42、名用户名:);:);container.add(label1 );container.add(label1 );textField1=new JTextField(10);textField1=new JTextField(10);container.add(textField1);container.add(textField1);container.add(new JLabel(container.add(new JLabel(口令口令:);:);passwordField=new JPasswordField(10);passwordField=new JPasswordField(10
43、);container.add(passwordField);container.add(passwordField);Icon bug=new ImageIcon(czims.jpg);Icon bug=new ImageIcon(czims.jpg);JLabel label2=new JLabel(JLabel label2=new JLabel(照片照片:,bug,SwingConstants.LEFT);:,bug,SwingConstants.LEFT);label2.setHorizontalTextPosition(SwingConstants.CENTER);label2.s
44、etHorizontalTextPosition(SwingConstants.CENTER);label2.setVerticalTextPosition(SwingConstants.BOTTOM);label2.setVerticalTextPosition(SwingConstants.BOTTOM);container.add(label2 );container.add(label2 );textField3=new JTextField(textField3=new JTextField(显示用户名或口令显示用户名或口令,30);,30);textField3.setEditab
45、le(false);container.add(textField3);textField3.setEditable(false);container.add(textField3);/register event handlers/register event handlersTextFieldHandler handler=new TextFieldHandler();TextFieldHandler handler=new TextFieldHandler();textField1.addActionListener(handler);textField1.addActionListen
46、er(handler);passwordField.addActionListener(handler);passwordField.addActionListener(handler);Box box=Box.createHorizontalBox();Box box=Box.createHorizontalBox();String string=This is a demo string ton+String string=This is a demo string ton+illustrate textarea programming n;illustrate textarea prog
47、ramming n;textArea1=new JTextArea(string,5,12);textArea1=new JTextArea(string,5,12);box.add(new JScrollPane(textArea1);box.add(new JScrollPane(textArea1);copyButton=new JButton(copyButton=new JButton(拷贝拷贝 ););box.add(copyButton);box.add(copyButton);copyButton.addActionListener(new ActionListener()co
48、pyButton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent event)public void actionPerformed(ActionEvent event)textArea2.setText(textArea1.getSelectedText();textArea2.setText(textArea1.getSelectedText();););textArea2=new JTextArea(5,12);textArea2=new JTextArea(5,12);textA
49、rea2.setEditable(false);textArea2.setEditable(false);box.add(new JScrollPane(textArea2);box.add(new JScrollPane(textArea2);container.add(box);container.add(box);setSize(500,400);setSize(500,400);setVisible(true);setVisible(true);public static void main(String args)public static void main(String args
50、)LabelandTextTest application=new LabelandTextTest();LabelandTextTest application=new LabelandTextTest();application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/private inner class for event handling for two TextFields /private inner cla