版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、图形用户界面的设计与实现,教材第8章,GUI设计简介 AWT与Swing 容器 布局管理器 事件处理机制 标准组件,用户界面设计原则,使用图形界面GUI (Graphics User Interface) 字符界面采用命令行方式与用户交互。 图形界面用多种媒体显示信息,用直观、方便的GUI标准组件来接收命令。 控制权在用户(用户要由操作的主动权) 界面与操作的风格一致性。 宽容(容错)性。 简洁与美观并重。,界面构成,容器,标准 组件,用户自定义成分,创建GUI各组成成分,并安排相互 位置关系(包含,相邻,相交)。 定义GUI各成分对不同事件的响应, 实现与用户的交互与界面功能。,界面元素,容
2、器是用来组织其他界面成分和元素的单元。 可以形成容器的层次,构筑复杂结构 Window(Frame、Applet、Dialog ) 组件是图形用户界面的基本单位,它里面不再包含其他的成分。 GUI组件是图形用户界面标准化的结果。 GUI组件的作用是完成与用户的交互。 用户自定义成分 文字、图形、图象 不能像标准组件一样被系统识别和承认,只起装饰作用。 不能响应用户的动作,不具有交互功能。,Java GUI设计概况,回顾Java GUI的发展和演化,有3个主要的构建窗口程序库: AWT(Abstract Window Toolkit,抽象窗口工具包) Swing SWT(Standard Wid
3、get Toolkit,标准窗口小部件工具箱 )/JFace库,1. AWT(重量级),Abstract Windows Toolkit (抽象窗口工具箱) JDK1.0中提供,把组件的创建和行为都委托给本地计算机的GUI工具处理,因此在不同平台会有差别。,Java GUI应用程序,AWT组件,AWT本地对等实现 本地组件实现,2. Swing(轻量级),1997年在JavaOne大会上提出并于1998年5月发布的JFC(Java Foundation Classes)中包含了一个新GUI组件库叫做Swing。 Swing 的设计目标是消除操作系统的差异。 Swing使用“纯Java”开发了一
4、套模拟的GUI组件库,Swing遵循“最小公倍数”原则, Swing除了依赖于AWT顶层容器例如Applet, Window, Frame 和Dialog等之外,Swing几乎实现了所有平台上的标准组件。 Swing对组件特征的设计也遵循“最小公倍数”原则,它拥有所有平台上可提供的组件特征。 Swing应用程序的界面外观不再和原生应用程序的外观相似。 虽然在JVM中这些Swing应用程序已经得到了最大程度的性能改善,但是它们还是存在着其原生对应物所不具有的性能问题。并且,Swing应用程序消耗太多的内存,这样Swing不适于一些小设备,如PDA和移动电话等。,3. SWT,IBM把他们的Sma
5、lltalk原生窗口组件移植到Java上 ,后被取名为Standard Widget Toolkit 。 使用SWT可以开发Microsoft Windows、Mac OS X以及几种不同风格的UNIX/Linux等操作系统下的Java GUI程序。 SWT的设计采用了“最小公倍数”原则以提供一个各个平台上包含的组件的并集。如果一个组件已经被操作系统平台提供,那么SWT就会包装它并用java代码和JNI来调用它。反之,如果某个组件在某一平台上不存在,它就会用继承并以绘制Composite的方式来模拟该组件。 它直接从操作系统获取所有的事件并进行处理,SWT将组件的控制交给本地操作系统。 SWT
6、的开发工具WindowBuilder Pro(Eclipse插件),4. JFace,为了方便开发SWT程序,在SWT基础上又创建了一个更易用、功能强大的图形包“JFace”。然而,JFace并不能完全覆盖SWT的所有功能,所以编程时SWT、JFace都会要用到,但是一般来说,能用JFace的组件就最好不要用SWT的。 JFace的构建基于SWT,提供了在SWT基础之上的抽象层,是对SWT组件的更进一步的OOP封装,提供了更简易的MVC模式。 SWT使用直接的API提供了原生的窗口部件, 而JFace可以对抽象层编程,然后抽象层与SWT API交互来替代直接对SWT API编程。,表1:三个J
7、ava GUI库的比较,图形用户界面的设计与实现,教材第8章,GUI设计简介 AWT与Swing 容器 布局管理器 事件处理机制 标准组件,Java GUI设计思路,基本的java程序的GUI设计工具。主要包括下述几个概念: 组件Component (API) 容器-Container布局管理器LayoutManager 事件处理 在Java中,开发一个GUI程序,通常需要以下几步: (1) 构建一个顶层容器;通常是Frame或Applet (2)构建若干个组件,组件可以是其它容器; (3)设定容器的布局管理器;用容器的add方法将这些组件加入到这个容器中; (4) 设置组件事件;并将组件事件
8、与代码关联。,AWT包,Abstract Windows Toolkit(抽象窗口工具) AWT类库中的各种操作是被定义为在一个并不存在的“抽象窗口”中进行的。 抽取不同软硬件平台中所实现的窗口的公共特性。 所设计的界面独立于具体的界面实现 。 提供与机器无关的基本GUI标准组件。 选择类组件: 单选按钮、复选框、下拉选单、列表框 文字处理类组件: 标签、文本框、编辑框 命令类组件: 按钮、工具栏、菜单,AWT包,java.awt包,AWT的类,1AWTEvent类 AWTEvent类是JDK1.1中所有AWT事件的父类,它是一个抽象类,其中定义了AWT事件的一般模型和接口,在实际使用时不能直
9、接使用这个类。 2Font类 用来表示字体的类,通过它可以在GUI中使用多种系统支持的字体。,AWT的类(续一),3Component类 Component类是一个抽象类,它是构成Java图形用户界面的基础,大多数组件都是它的子类或间接子类,其中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括 getComponentAt(int x,int y)、getFont( )、getForeground( )、getName( )、getSize( )、paint(Gra
10、phics g)、repaint( )、update(Graphics g)、setVisible(boolean b)、setSize(Dimension d)、setName(String name)等。 4Container类 容器Container类是Component类的一个子类,因此容器本身也是一个组件,具有组件的所有性质,但它的主要功能是容纳其他组件和容器。,AWT的类(续二),5Graphics类 Graphics类是所有用来在组件上进行图形绘制时所用的图形上下文的父类,它提供了对组件进行图形绘制的一般方法的接口,一个Graphics对象中封装了用来进行图形绘制时必需的状态信息
11、,包括:要绘制的组件对象、当前颜色、当前字体、当前逻辑点的操作功能,当前XOR方式的替代颜色。 6布局管理器类 FlowLayout、BorderLayout、GridLayout、CardLayout、GridBagLayout是布局管理器类。布局管理器是Java语言中提供专门用来管理组件在容器中布局的工具,它负责组件在容器中的位置、大小等布局的管理,使用不同的布局管理器,组件在容器中的位置布局不同。,Component类,可显示在屏幕上的图形对象,可与用户交互。 方法: add(PopupMenupopup) 加一弹出菜单 addFocusListener(FocusListenerl)将
12、发生在本组件上的事件注册给监听者,以进行事件处理。 setBounds(intx, inty, intwidth, intheight) 设置组件位置与尺寸 setLocation(intx, inty ) 设置组件位置 setSize(intwidth, intheight) 设置组件尺寸 paint(Graphicsg) 重画组件 setFont(Fontf) 设置组件字体 setBackground(Colorc) 设置组件背景色 setForeground(Colorc) 设置组件前景色,Font类,java.awt.Font 设计字体显示效果(创建字体对象) Font fn = ne
13、w Font (String 字体,int 风格,int 字号); 字体:TimesRoman, Courier, Arial等 风格:三个常量 Font.PLAIN, Font.BOLD, Font.ITALIC 字号:字的大小(磅数) 使用字体对象 如设置某组件当前使用的字体: setFont(Font fn) 获取组件当前使用的字体:getFont(),Color类,java.awt.Color 构造函数1(设置颜色) Color c = new Color(intred, intgreen, intblue) 范围 :0255 new Color(200,200,200) new Co
14、lor(255,0,100) 构造函数2 Color c = new Color(int rgb) 兰色:07 位 绿色:815位 红色:1623位 颜色常量值 public static final Color black Color.black , Color.blue , Color.gray , Color. red Color.white ,Containers 容器组件,Window 不需要其他组件支撑,独立显示。 Frame Dialog 没有菜单条,不能改变大小 Panel 必须放在Window组件中(或Web浏览器窗口)才能显示。它为一矩形区域,在其中可摆放其他组件,可以有自
15、己的布局管理器。 基本方法 add(Component comp) 将指定组件放到容器中 add(Component comp,int index) remove(Componentcomp) 删除指定组件 setLayout(LayoutManagermgr) 设置容器布局 paint 画容器(及其上面的组件),容器的组件布局,依靠布局管理器(layout manager)方式 调用容器的setLayout方法,为容器指定某种布局管理器的一个对象。 例: setLayout(new FlowLayout() ) 该布局管理器对象负责确定容器中组件的位置和大小。 当容器需要定位组件和确定组件大
16、小时,就会给布局管理器对象发消息,让它完成该项工作。 直接管理组件方式 调用容器的 setLayout(null) 方法,关闭布局管理器。 调用每一个组件的setLocation()方法决定组件位置。 调用每一个组件的setSize()方法决定其大小。 直接管理组件将失去平台无关性。,布局管理器对象,布局管理器种类,FlowLayout: 组件在一行中从左至右水平排列,排满后折行 BorderLayout:北、南、东、西、中 GridLayout:以行和列的网格形式安排组件 GridBagLayout:更复杂、功能更强的网格布局 CardLayout:每一个组件作为一个卡片,容器仅显示多个卡片
17、中的某一个,确定容器布局,缺省的布局管理器 Window 、Frame、Dialog BorderLayout Panel 、Applet FlowLayout: 选择布局管理器的方法 建立布局管理器类的对象 利用容器的 setLayout () 为容器指定布局(即指定一个布局管理器的对象) 例:将myFrame布局设定为FlowLayout类型 myFrame.setLayout( new FlowLayout() );,AWT类层次关系图,AWT中的基本组件,Swing介绍,Swing组件 在javax.swing包中,定义了两种类型的组件:顶层容器(JFrame,JApplet,JDia
18、log和JWindow)和轻量级组件(JComponent)。 Swing组件都是AWT的Container类的直接子类和间接子类。 Swing组件以J开头,除了有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本组件外,还增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。,Swing组件从功能上可分为: (1)顶层容器:JFrame,JApplet,JDialog,JWindow共4个 (2)普通容器:JPanel,JScrollPane,JSplitPane,JToolBar (3)特殊容器:在GUI上起
19、特殊作用的中间层JInternalFrame,JLayeredPane,JRootPane. (4)基本控件:实现人际交互的组件,如JButton,JComboBox,JList,JMenu,JSlider,JTextField (5)向用户显示不可编辑信息的组件.例如JLabel,JProgressBar,ToolTip (6)向用户显示能被编辑的格式化信息的组件.如JColorChooser, JFileChooser,JTable,JTextArea,Swing介绍,AWT与Swing顶层窗口类之间的关系,Swing组件,图形用户界面的设计与实现,教材第8章,GUI设计简介 AWT与Sw
20、ing 容器 布局管理器 事件处理机制 标准组件,容器(Container),容器(Container)也是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。 1)容器可以简化图形化界面的设计,以整体结构来布置界面。 2)所有的容器都可以通过add()方法向容器中添加组件,通过remove()方法移除组件。(参看API),JFrame JDialog JApplet JWindow,JLayeredPane,JRootPane,JContentPane,JGlassPane,JMenuBar,Swing容器层次结构,容
21、器分类,顶层容器窗体 JFrame; JWindow; JApplet; 对话框JDialog(JOptionPane) 中间层容器 面板JPanel; 滚动窗格JScrollPane, JScrollBar; 拆分窗格JSplitPane; 索查标签窗格JTabbedPane 特殊容器 内部窗体JInternalFrame; 分层窗格JLayeredPane; 根窗格JRootPane,1. JFrame,窗口是最基本的用户界面元素。框架窗口是一种窗体,其中带有边框、标题栏及用于关闭和最大/最小化窗口的图标等。在GUI的应用程序中,一般至少应使用一个框架窗口。通常将框架窗口简称为窗口。 JF
22、rame构造方法主要有: JFrame(),建立一个无标题的JFrame。 JFrame(String title),建立一个标题为title的JFrame。,窗口的基本操作,(1) 创建窗口 直接生成一个JFrame类的实例即可建立一个窗口,或通过继承JFrame类来定义子类,再建立窗口。 例如,创建一个无标题的窗口,语句如下: JFrame frame=new JFrame(); (2) 设置标题 通过super(String title)调用基类的构造方法,或通过setTitle(String title)方法来设置标题。 例如: JFrame frame=new JFrame(“窗口示
23、例”); 或者: JFrame myFrame=new JFrame(); myFrame.setTitle(“窗口示例”);,窗口的基本操作,(3) 设置初始位置 通过setLocation (int x,int y)方法设置初始位置。其中x,y是窗口左上角在屏幕上的坐标值。 (4) 设置大小 通过setSize(int width,int height)方法设置初始大小。 (5) 设置图标 通过setIconImage(Icon icon)方法设置窗口图标。,窗口的基本操作,(6) 定义关闭行为 通过setDefaultCloseOperation(int operation)方法设置关闭
24、行为。其中operation的取值可以是以下几种: JFrame.DO_NOTHING_ON_CLOSE:当窗口关闭时,不做任何处理; JFrame.HIDE_ON_CLOSE:当窗口关闭时,隐藏这个窗口; JFrame.DISPOSE_ON_CLOSE:当窗口关闭时,隐藏并处理这个窗口; JFrame.EXIT_ON_CLOSE:当窗口关闭时,退出程序。 默认是HIDE_ON_CLOSE。,窗口的基本操作,(7) 添加组件 创建好JFrame之后,就可以向它的内容面板中添加组件。对JFrame添加组件有两种方式: i、用getContentPane( )方法获得JFrame的内容面板,再对其
25、加入组件:frame.getContentPane().add(childComponent) ii、建立一个JPanel或 JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板: JPanel conPane=new JPanel(); /把其它组件添加到JPanel中; frame.setContentPane(conPane); /把conPane对象设置成为frame的内容面板,窗口的基本操作,【例】 建立一个标题为“Swing窗口”,大小为(300,200),图标为javalogo.gif,位置居中的窗口
26、。屏幕效果如图所示。,2. 无边框的窗口JWindow JWindow可以构造无边框的窗口。主要构造方法有: JWindow():创建一个无边界的窗口; JWindow(Frame owner):创建一个依赖Frame对象的窗口。 3对话框JDialog 对话框与框架窗口类似,是有边框、有标题、可独立存在的顶级容器。对话框分为无模态对话框和模态对话框。JDialog的构造方法有: JDialog(Frame owner); JDialog(Frame owner,Boolean modal); JDialog(Frame owner,String title); JDialog(Frame o
27、wner,String title,Boolean modal);,4面板JPanel Swing的JPanel,它替代了AWT的画布(Canvas)和面板(Panel),兼有二者的功能。JPanel是一个非顶级的通用容器,总是处于其它一些容器中。JPanel不能象JFrame那样能够在桌面上浮动。利用JPanel可以使版面的排列方式更生动,对于复杂GUI,通常由多个面板组成,而每个面板以特定的布局来排列组件。 JPanel的构造方法有: JPanel(); JPanel(boolean isDoubleBuffered); JPanel(LayoutManager layout); JPan
28、el(LayoutManager layout,boolean isDoubleBuffered);,5. 分割面板JSplitPane JSplitPane一次可将两个组件同时显示在两个显示区中,若想要同时在多个显示区显示组件,便必须同时使用多个JSplitPane。JSplitPane提供两个常数:HORIZONTAL_SPLIT、VERTICAL_SPLIT,用来设置水平分割或是垂直分割。 6. JTabbedPane 如果一个窗口的功能有几项,可以给每项设置一个标签,每个标签下面包含为完成此功能专用的若干组件。用户要使用哪项功能,只要单击相应的标签,就可以进入相应的页面。这种选项卡功能
29、的实现就需要使用JTabbedPane这个中间层容器。,7. 滚动面板JScrollPane 当容器内要容纳的内容大于容器时,希望容器能够有一个滚动条,通过拖动滑块,就可以看到更多的内容。JScrollPane就是能够实现这种功能的容器。 8. JInternalFrame 使用JInternalFrame容器类可以实现在一个主窗口中打开很多个文档,每个文档各自占用一个新的窗口。JInternalFrame的使用跟JFrame几乎一样,可以最大化、最小化、关闭窗口、加入菜单;唯一不同的是JInternalFrame是轻量级组件,它只能是中间容器,必须依附于顶层容器上。,图形用户界面的设计与实现
30、,教材第8章,GUI设计简介 AWT与Swing 容器 布局管理器 事件处理机制 标准组件,FlowLayout是把组件从左向右、从上向下,一个接一个的放到容器中,它是JPanel的缺省布局管理器,,FlowLayout布局管理器,FlowLayout是把组件从左向右、从上向下,一个接一个的放到容器中,它是JPanel的缺省布局管理器。 构造函数: FlowLayout() FlowLayout(int align) FlowLayout(int align, int hgap, int vgap) align :对齐方式:FlowLayout.LEFT (左) FlowLayout.CENT
31、ER (居中)、FlowLayout.RIGHT (右) hgap :组件水平间距 (象素) vgap :组件垂直间距(象素) 无参数的构造函数创建的FlowLayout对象,其对齐方式默认为CENTER居中方式,组件间的横纵间距都为5个像素。,FlowLayout布局管理器,Frame f = new Frame(FlowLayout); f.setSize(400,300); /不起作用 f.setBackground(Color.gray); f.setLayout(new FlowLayout(FlowLayout.LEFT,10,20); b1 = new Button(button
32、1); b2 = new Button(button2); b3 = new Button(button3); f.add(b1); f.add(b2); f.add(b3); f.setVisible(true); f.pack();,8-1c,BorderLayout布局管理器,BorderLayout是JWindow、JFrame、JDialog、JApplet的缺省布局管理器。 当容器大小改变,组件相对位置不会改变。,构造方法: BorderLayout()组件之间的缺省间隔(水平和垂直)为零。 BorderLayout( int hgap, int vgap) 组件之间的水平间隔为h
33、gap,垂直间隔为vgap 使用方式: setLayout(new BorderLayout() ) add (组件,BorderLayout.NORTH);,BorderLayout布局管理器,f = new Frame(BorderLayout); f.setSize(200,200); b1 = new Button(button1); b5 = new Button(button5); f.add(b1,BorderLayout.NORTH); f.add(b2,BorderLayout.SOUTH); f.add(b3,BorderLayout.WEST); f.add(b4,Bor
34、derLayout.EAST); f.add(b5,BorderLayout.CENTER); f.setVisible(true);,8-1d,Border-Panel,class MyFrame extends Frame MyFrame() Button b1 = new Button( 1 ); Button b2 = new Button( 2 ); Button b3 = new Button( 3 ); Button b4 = new Button( 4 ); Panel p = new Panel(); p.add(b1); p.add(b2); add(p,BorderLay
35、out.NORTH); add(b3,BorderLayout.WEST); add(b4,BorderLayout.CENTER); pack(); setVisible(true);,8-1e,GridLayout布局管理器,创建GridLayout对象作为布局编辑器,指定划分网格的行数和列数(网格大小一样)。 setLayout(new GridLayout(行数, 列数); setLayout(new GridLayout(行数, 列数,行间隔,列间隔); 调用容器的方法add()将组件加入容器,组件填入容器的顺序将按照第一行第一个格中、第一行第二个格中、 每个网格中都必须填入组件,如
36、果希望某个网格为空白,可以为它加入一个空的标签: add (new Label();,GridLayout布局管理器,f = new Frame(GridLayout); f.setLayout(new GridLayout(2,3); f.setSize(200,100); f.setBackground(Color.gray); b1 = new Button(1); b6 = new Button(6); f.add(b1); f.setVisible(true);,8-1f,布局例,Frame fm = new Frame() fm.setLayout(new FlowLayout()
37、; tf = new TextField(22); fm.add(tf); Panel p1 = new Panel(); p1.setLayout(new GridLayout(4,3); p1.add(); Panel p2 = new Panel(); p2.setLayout(new GridLayout(4,3); p2.add(); fm. add(p1); fm. add(p2);,8-2布局,CardLayout布局管理器,将每一个组件视为一张卡片,同一时刻只能显示一个组件。 setLayout(new CardLayout() CardLayout方法(按序指定组件) fir
38、st (Containerparent) last (Containerparent) previous (Containerparent) next (Containerparent) CardLayout方法(按名显示组件) addLayoutComponent(Stringname, Componentc) show(Containerparent, Stringname),GridBagLayout布局管理器,每个GridBagLayout对象维护一个动态矩形网格, 每个组件可占据一个或多个单元作为它的显示区域。 每一个组件都与一个GridBagConstraints类的实例相连,以指
39、定在显示区域中如何摆放,并可确定大小。 步骤: setLayout(new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; (属性赋值) add(button1 , gbc ),GridBagLayout布局管理器,设置GridBagConstraints类实例属性值: gridx gridy 组件显示区域的左上角单元格坐标 gridwidth gridheight 指定显示区域行、列单元数 RELATIVE 指定紧挨着前一个组件摆放 fill 当显示区域大于组件时如何扩充组件
40、: HORIZONTAL 水平充满 VERTICAL 垂直充满 BOTH 全部填充 NONE 不调整(隐含) ipadx ipady 指定组件间最小间隔 anchor 当显示区域大于组件时如何摆放组件: CENTER(隐含), NORTH, EAST, SOUTH, WEST, SOUTHEAST, NORTHEAST, SOUTHWEST, NORTHWEST.,图形用户界面的设计与实现,教材第8章,GUI设计简介 AWT与Swing 容器 布局管理器 事件处理机制 标准组件,Java事件处理模型,用户操作GUI组件时会引发各种事件, Java中事件处理机制采用“委托方式”(或“监听器方式”
41、)。 Java的事件处理模型由三部分组成: 事件源(Event source) 事件对象(Event object) 事件监听器(Event listener),Java事件处理模型,事件源:事件的产生地。如按钮。 事件对象 :描述“发生了什么事情”的对象。 系统根据用户的操作构造出相应事件类的对象。 事件监听器:实现了监听器接口的类,它包含有事件处理程序。每个事件源要注册(指定)监听器对象。 事件处理程序:是一个方法,它接收一个事件对象,分析它,并完成对该事件的处理。 每个事件系统预先定义了一个相应的监听器接口,它规定了能够接收(并处理)该类事件的方法的规范。,鼠标单击按扭,Java事件处理
42、模型,ActionEvent事件,public void actionPerformed(ActionEvent e),ActionListener接口,ActionEvent事件,监听者类,监听者对象,调用按扭的 addActionListener ( ) 方法,为该按扭指定监听者。,实现接口,事件类,ActionEvent类 :存放这个事件的细节。该类的方法有: getSource() 返回事件发生的对象(名) getActionCommand() 返回按扭名。 ActionListener 接口 public void actionPerformed(ActionEvent e),图形用
43、户界面例,import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TestEventHandling public static void main(String args) MyFrame form1 = new MyFrame(); class MyFrame extends JFrame MyFrame() super(窗口标题); Container c = getContentPane();/创建内容面板 c.setLayout(new FlowLayout();/设置布局管理器,图
44、形用户界面例,JButton btn = new JButton(“Exit); c.add(btn); /将btn添加到内容面板中 /创建事件监听器对象listener EventHandling handler = new EventHandling(); btn.addActionListener ( handler ); /注册监听器对象 setBounds(200,200,300,200); /设置窗口位置与尺寸 setVisible(true); class EventHandling implements ActionListener public void actionPerf
45、ormed(ActionEvent e) System.exit(0); /退出程序 ,Java事件处理程序均可采用以下两步进行编写: 1定义监听器类,实现监听器接口 编写一个实现了SomethingListener接口的事件处理类。在其中包括用于事件处理的方法。例如:EventHandling 实现了 ActionListener接口,并覆盖接口中的actionPerformed()方法。 2注册监听器 声明并创建一个事件处理类的对象,即监听器。如handler。 调用组件的addSomethingListener (handler)方法,注册事件监听器对象,同时也就注册了用于事件处理的回调
46、程序。,监听者类,某个类可以兼职也可以专职做这件事(实现监听者接口)。 一个类若实现一个接口,必须实现接口的全部方法。 例如:ActionListener接口只有一个方法: void actionPerformed(ActionEvent e) 实现接口的类可以是: 自定义内部类 例:JB1.java 匿名类 例:JB2.java 一般类 例:JB3.java,8.15 内部类,8.16 匿名类,8.17 一般类,监听器适配器类,精简事件处理程序的技巧-使用监听器适配器类 在Java事件处理中,对于某些监听器接口(如WindowListener)而言,我们也许只想实现其中的一种或两种功能,使之
47、能够处理我们感兴趣的一个或两个事件。 每个SomethingListener接口中都可能定义了多个方法。java.awt.event和javax.swing.event包提供了事件监听器的适配器类(Adapter)。一个适配器类实现一个接口,并为该接口的所有方法提供默认实现(空方法体),从而允许我们仅仅覆盖自己感兴趣的少量方法。,例如:关闭窗口事件,关闭窗口框时引发 WindowEvent事件,对应WindowListener接口 WindowListener接口有7 个方法,都必须实现。 windowActivated(WindowEvent e) windowClosed(WindowEv
48、ent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e) WindowAdapter :系统实现的处理窗口事件的抽象适配器类,用空内容实现了WindowListener接口的全部7个方法。 class Wclose extends WindowAdapter ,仅须编写需要的方法,【例】 关闭窗口事件处理。,/ CloseDemo1.
49、java import javax.swing.*; import java.awt.event.*; public class CloseDemo1 public static void main(String args) JFrame jframe = new JFrame(关闭窗口例); jframe.setSize(400,100); / 设置窗口大小 jframe.setVisible(true); / 使窗口可见 /以下创建事件监听器对象 myWinClose handler = new myWinClose(); / 注册事件监听器 jframe.addWindowListene
50、r(handler); ,/ 实现了WindowListener接口的类的定义 class myWinClose implements WindowListener / 关闭窗口的事件处理方法 public void windowClosing(WindowEvent e) System.exit(0); public void windowClosed(WindowEvent e) public void windowOpened(WindowEvent e) public void windowIconified(WindowEvent e) public void windowDeico
51、nified(WindowEvent e) public void windowActivated(WindowEvent e) public void windowDeactivated(WindowEvent e) ,【例】 利用适配器,进行关闭窗口事件处理。,/ CloseDemo2.java import javax.swing.*; import java.awt.event.*; public class CloseDemo2 public static void main(String args) JFrame jframe=new JFrame(关闭窗口例); jframe.s
52、etSize(400,100); jframe.setVisible(true); myWinClose2 handler = new myWinClose2(); jframe.addWindowListener(handler); / 定义继承于窗口适配器的类 class myWinClose2 extends WindowAdapter public void windowClosing(WindowEvent e)System.exit(0); ,事件处理有关问题,有哪些事件类 (java.awt.event) ? 每个事件类的监听者接口? 每个监听者接口规定的方法? 多方法的监听者接
53、口的适配器(实现接口的抽象类)是什么? 组件的事件委托(注册)方法?,表2 AWT库事件与相应的监听器接口、方法、适配器,表3 AWT组件及其可触发的事件类型,Swing中组件、事件及事件监听器接口之间的对应关系,表4 Swing中组件、事件及事件监听器接口之间的对应关系,表4 Swing中组件、事件及事件监听器接口之间的对应关系(续),表5 Swing提供的事件监听器接口及其方法,表5 Swing提供的事件监听器接口及其方法(续一),ActionEvent事件,引发原因: 单击按扭,双击列表框中选项,选择菜单项,文本框中的回车 事件监听接口:ActionListener 接口方法: acti
54、onPerformed(ActionEvent e) 组件注册该事件方法: addActionListener(监听者对象),TextEvent事件,引发原因: 文本框或文本区域内容改变 事件监听接口:TextListener 接口方法: textValueChanged(TextEvente) 组件注册该事件方法: addTextListener(监听者对象),ItemEvent事件,引发原因: 改变列表框中的选中项 改变复选框选中状态 改变下拉选单的选中项 事件监听接口:ItemListener 接口方法: itemStateChanged(ItemEvente) 组件注册该事件方法: a
55、ddItemListener(监听者),AdjustmentEvent事件,引发原因: 操作滚动条改变滑块位置 事件监听接口:AdjustmentListener 接口方法: adjustmentValueChanged(AdjustmentEvente) 组件注册该事件方法: addAdjustmentListener(监听者),KeyEvent事件,引发原因: 敲完键(KEY-TYPED) 按下键 (KEY-PRESSED) 释放键 (KEY-RELEASE) 事件监听接口:KeyListener 接口方法: keyPressed(KeyEvente) 键已被按下时调用 keyReleas
56、ed(KeyEvente) 键已被释放时调用 keyTyped(KeyEvente) 键已被敲完时调用 KeyEvent方法:char ch = e.getKeyChar(); 事件监听适配器(抽象类)KeyAdapter 组件注册该事件方法: addKeyListener(监听者),MouseEvent事件,引发原因: (鼠标作用在一个组件上) 鼠标事件:鼠标键按下,鼠标键抬起,单击鼠标 ,鼠标光标进入一个组件,鼠标光标离开一个组件。 鼠标移动事件:鼠标移动,鼠标拖动 鼠标事件监听接口1: MouseListener 接受鼠标事件 该接口定义的方法: mouseClicked(MouseEv
57、ente) mouseEntered(MouseEvente) 鼠标光标进入一个组件 mouseExited(MouseEvente) 鼠标光标离开一个组件 鼠标事件监听适配器(抽象类)MouseAdapter,MouseEvent事件(续),鼠标事件监听接口2: MouseMotionListener 接受鼠标移动事件 该接口方法: mouseMoved(MouseEvente) 鼠标光标在组件上移动 mouseDragged(MouseEvente)用鼠标拖动一个组件 鼠标移动事件监听适配器 MouseMotionAdapter 组件注册鼠标事件方法: addMouseListener(监
58、听者) 组件注册鼠标移动事件方法: addMouseMotionListener(监听者),MouseEvent事件(续),MouseEvent方法 e.getClickCount() =1 单击 =2 双击 Point e.getPoint() 取鼠标光标位置 int e.getX() int e.getY() 取鼠标光标位置 e.getModifiers() = e.BUTTON1_MASK 鼠标左键 = e.BUTTON3_MASK 鼠标右键,鼠标事件,FocusEvent事件,引发原因: 组件获得焦点 组件失去焦点 事件监听接口 FocusListener 接口方法: focusGai
59、ned(FocusEvent e) 组件获得焦点时调用 focusLost(FocusEvente) 组件失去焦点时调用 接口适配器:FocusAdapter 组件注册该事件方法:addFocusListener,TextEvent事件,引发原因: 当组件(如文本框)文本改变时引发 事件监听接口:TextListener 接口方法: textValueChanged(TextEvente) 组件注册该事件方法: addTextListener,ComponentEvent 事件,引发原因: 当组件移动、改变大小、改变可见性时引发 事件监听接口:ComponentListener 接口方法: componentHidden(ComponentEvent e) 组件隐藏 componentMoved(ComponentEvente) 组件移动 compo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卡片盒皮夹子产业运行及前景预测报告
- 单杠产业深度调研及未来发展现状趋势
- 大班数活动我家漂亮尺子
- 射频发射器产业深度调研及未来发展现状趋势
- 新建商住楼电梯安装方案
- 高校与银行合作的创新发展方案
- 电力工程施工售后保障方案
- 工业厂房钢结构施工方案指南
- 2022年施工现场管理合同
- 流动医疗车运营控制方案
- 初中《学宪法讲宪法》第八个国家宪法日主题教育课件
- 2024医疗机构重大事故隐患判定清单(试行)学习课件
- 第一单元中国特色社会主义的开创、坚持、捍卫和发展单元测试-2023-2024学年中职高教版(2023)中国特色社会主义
- 汽车修理工岗前培训
- 苏州市2023-2024学年高一上学期期中考试化学试题 试卷及答案
- 高教版赵耐青卫生统计学习题答案
- 对山西煤矿企业托管经营的思考要点
- 单人临柜操作流程
- 珠宝店培训第四讲:服务礼仪
- 制药工程制图习题集答案
- (完整版)安全通道防护棚施工方案
评论
0/150
提交评论