Java程序设计——11事件处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
myListener2
事件监听机制
button 事件源: 当事件发 生时事件源自动调用 监听器列表中各个对 象的相应方法 监听器对象
列表(LinkedList): 事件源的addActionListener 方法可以将监听器对象添 加到列表中
l1
l2
监听器类
public class Listener1 implements ActionListener { public void actionPerformed(ActionEvent e){…} } 事件类 interface ActionListener { void actionPerformed(ActionEvent e); } class ActionEvent { …… }
• 每个平台提供的图形界面元素都不一样。 • 不同平台上的awt库存在不同Bug。
– awt的事件处理模型在Java1.1版进行了大的改动后,到目前的版本基本 没变。
• swing:
– Java 2.0中出现。 – Swing组件全部是由纯Java编写的,用户界面元素都绘制在空白窗口上 ,绘制和行为都由swing类自己完成。各平台之间唯一不同的就是最外 层窗口的创建。
改变观感
• 改变观感使用两个静态方法:
– UIManager.setLookAndFeel(plaf)设置要使用的观感
• 参数plaf为观感的名字,实际为一个类名,可以为以下字符串:
– javax.swing.plaf.metal.MetalLookAndFeel – com.sun.java.swing.plaf.windows.WindowsLookAndFeel – com.sun.java.swing.plaf.motif.MotifLookAndFeel
监听器接口
赵志崑
事件监听器类的各种写法
• 监听器类的声明:
– – – – 将事件监听器作为单独的类。 将事件监听器作为组件的内部类。 直接使用已有类(通常是包含事件源的组件)作为事件监听器。 使用匿名内部类。
public class Example1 extends JFrame implements ActionListener { public void actionPerformed(ActionEvent e){…} }
• 总结:
– 尽管awt的用户界面组件仍然可以用,但是建议最好不要使用。 – 现在编写Java图形界面程序,使用swing组件 + awt事件处理模型。
赵志崑
事件处理概述
• 图形用户界面编程中,必须使用事件处理。
– 程序的执行不是一条连续的线,而是很多独立的片段。 – 支持GUI的操作环境会不断监视事件,并把事件报告给正在运行的程序。这 是多任务的需要。 事件 事件 – 每个程序自己决定如何响应这些事件。 事件源
计算机科学与技术学院 赵志崑 zhaozk@sdufe.edu.cn
GUI组件概述
• awt:Abstract Window Toolkit——抽象窗口工具集
– 从Java1.0中出现。 – awt处理用户界面元素的方法是把这些元素的创建和行为委托给每个目 标平台(如windows,Linux)上的本地GUI处理。
赵志崑
事件监听器编写
见Example1.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Example1 extends JFrame { public Example1() { setSize(320,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = getContentPane(); JButton testButton = new JButton("Test"); testButton.addActionListener(new MyListener1()); contentPane.setLayout(new BorderLayout()); contentPane.add(testButton,BorderLayout.SOUTH); } } class MyListener1 implements ActionListener { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "ActionCommand:"+e.getActionCommand()); } }
见Example2.java class MyListener1 implements ActionListener { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "ActionCommand:"+e.getActionCommand()); } } myListener1 class MyListener2 implements ActionListener { public void actionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand(); Color bkColor = null; if(actionCommand.equals("Red"))bkColor = new Color(255,0,0); else if(actionCommand.equals("Green"))bkColor = new Color(0,255,0); else if(actionCommand.equals("Blue"))bkColor = Color.blue; getContentPane().setBackground(bkColor); } } 赵志崑
见Example6.java private class MyWindowListener extends WindowAdapter { public void windowClosing(WindowEvent e) { int result = JOptionPane.showConfirmDialog(……); if(result == JOptionPane.OK_OPTION)System.exit(0); } }
• Java的事件处理采用的是事件监听器方式。
监听器
– 事件监听器是一个实现了监听器接口的对象。 – 事件源(如按钮组件)是一个能够注册监听器并为它们发送事件的对象(可视 构件)。 – 每个事件源拥有自己的事件监听器,可以有多个。 – 当事件源产生了一个事件后,事件源就会给所有监听器对象发送通知,即 调用事件监听器对象的相应方法。 – 事件的信息被封装在一个对象中,不同事件源能够产生不同种类的事件。 – 编程人员要做的就是编写事件监听器类,创建一个事件监听器对象,并添 加到相应的事件源。
• 编写事件处理程 序的步骤如下:
– 编写监听器类; – 在监听器类中实 现接口中需要的 方法; – 方法中可以使用 ActionEvent对象 获取事件参数; – 创建一个事件监 听器对象; – 将该对象添加到 事件源。
赵志崑
事件源与监听器的关系
• 一个事件源可以对应多个监听器。 • 一个监听器可以对应多个事件源。
• 监听器类的实现:
– 一个监听器类实现多个组件的监听器对象。
• 通过类中的实例字段来区分不同的监听器对象。
– 一个监听器对象作为多个组件的监听器。
• 在事件的响应方法中通过事件源区分不同的事件。
见Example3.java redButton.addActionListener(new ActionListener() { //匿名内部类监听器 public void actionPerformed(ActionEvent e) { …… } }); 赵志崑
赵志崑
MyW来自百度文库ndowAdapter
Java事件概述
• Java中所有事件都从java.util.EventObject类继承而来。 • 两个包中定义了事件:
– java.awt.event:awt的事件、监听器及适配器定义。 – java.swing.event:专门用于swing组件的附加事件。
添加窗口事件监听器 窗口事件监听器实现 WindowListener接口 要处理的窗口事件
适配器类
• 问题:仅仅需要处理关闭窗口事件,但却要写另外六个空方法。 • 解决方法:使用适配器类。
– 适配器类是一个实现了某个接口,但其中所有方法都为空的类。 – 每个具有不止一个方法的监听器接口都对应有一个适配器类。 – 编写监听器类时只需从适配器类派生一个子类即可。
窗口事件
• ActionListener接口非常简单,用于按钮事件处理。 • 相应的,WindowListener接口用于窗口事件处理。
见Example5.java public class Example5 extends JFrame { public Example5() { … setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new MyWindowListener()); } private class MyWindowListener implements WindowListener { public void windowOpened(WindowEvent e){} public void windowClosing(WindowEvent e) { int result = JOptionPane.showConfirmDialog(……); if(result == JOptionPane.OK_OPTION)System.exit(0); } public void windowClosed(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowDeactivated(WindowEvent e){} } 赵志崑 }
由实现接口改为 继承自适配器类, 从而不用再写另 外六个无用方法。 也可写成 匿名内部类
WindowListener WindowAdapter
见Example6.java addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { int result = JOptionPane.showConfirmDialog(……); if(result == JOptionPane.OK_OPTION)System.exit(0); } });
– SwingUtilities.updateComponentTreeUI(panel)刷新要改变的组件
• 参数panel给出面板中的一个组件即可刷新整个面板。
见Example4.java tButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent aEvent) { try{ UIManager.setLookAndFeel(aPlafName); SwingUtilities.updateComponentTreeUI(Example4.this); }catch(Exception e){ e.printStackTrace(); }; } }); 赵志崑