第十三周学习总结
一、 知识总结
- 1.在Java的swing编程中,Java中的事件机制非常常用事件监听器的参与者:
- 1-1.事件对象:
- 一般继承自java.util.EventObject对象,由开发者自行定义
- 1-2.事件源:
- 就是触发事件的源头,不同的事件源会触发不同的事件类型.
- 1-3.事件监听器:
- 事件监听器负责监听事件源发出的事件。一个事件监听器通常实现java.util.EventListener这个标识接口.。
- 2.事件源可以注册事件监听器对象,并可以向事件监听器对象发送事件对象.事件发生后,事件源将事件对象发给已经注册的所有事件监听器.。
- 监听器对象随后会根据事件对象内的相应方法响应这个事件,以下为四种实现方式:
- 自身类作为事件监听器 ;外部类作为事件监听器 ;匿名内部类作为事件监听器;内部类作为事件监听器。
- 3.适配器(Adapter)类
- 有些监听器接口具有多种方法,当只对其中一种方法感兴趣时直接实现接口还需要提供其他方法的实现,十分的不方便,于是出现了适配器类,它为所有的方法都设置为默认方法,则可以通过扩展适配器类来指定某些事件的相应动作,而不需要实现接口中每个方法。
- 4.动作
- Action接口扩展于ActionListener接口,可以时多个组件(如JButton/JMenu/JToolBar)具有相同功能。可实现监听功能。
- 一个动作封装了:
- 4-1.命令的说明(一个文本字符(用来表示菜单或按钮的文本标签)和一个可选图标)
- 4-2.执行命令所需要的参数。可被转换为按钮和菜单项。实际上在JButton的构造方法 public JButton(Action action )中、JToolBar的add(Action action) 、以及JMenu的add(Action action )方法中都可以看出,他们都能够使用Action对象为参数,将Action自动的转化为按钮或者菜单项,你要做的仅仅是定义一个Action对象,之后仅仅需要调用上面的方法就能够自动的将Action转化成组件了。
- 4-3用同一个动作响应按钮、菜单项或按键的方法:
- 4-3-1.创建一个AbstractAction类
- 4-3-2.构建动作类对象
- 4-3-3.用动作类对象创建按钮或菜单项,构造器从动作对象中读取标签文本和图标
- Action blackAction = new colorAction("Black",Color.BLACK);
- buttonPanel.add(new JButton(blackAction));
- 如果要将快捷键与动作关联起来:
- 1.得到顶层控件的输入映射(InputMap)
- InputMap input = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
- 2.为需要的按键创建KeyStrike对象,将(按键,动作键)添加至输入映射(实际上是将按键映射到任意对象上)
- input.put(KeyStroke.getKeyStroke("ctrl L"), "black");
- 3.得到顶层空间的动作映射(ActionMap),将(动作键,动作对象)添加到映射中
- ActionMap amap = buttonPanel.getActionMap();
- amap.put("black", blackAction);
二、实验——图形界面事件处理技术
1、实验目的与要求
(1) 掌握事件处理的基本原理,理解其用途;
(2) 掌握AWT事件模型的工作机制;
(3) 掌握事件处理的基本编程模型;
(4) 了解GUI界面组件观感设置方法;
(5) 掌握WindowAdapter类、AbstractAction类的用法;
(6) 掌握GUI程序中鼠标事件处理技术。
2、实验内容和步骤
实验1: 导入第11章示例程序,测试程序并进行代码注释。
测试程序1:
l 在elipse IDE中调试运行教材443页-444页程序11-1,结合程序运行结果理解程序;
l 在事件处理相关代码处添加注释;
l 用lambda表达式简化程序;
l 掌握JButton组件的基本API;
l 掌握Java中事件处理的基本编程模型。
代码及注释:
package button; import java.awt.*; import javax.swing.*; /** * @version 1.34 2015-06-12 * @author Cay Horstmann */ public class ButtonTest { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new ButtonFrame();//创建对象 frame.setTitle("ButtonTest");//编写图形界面的题目 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭用户图形界面操作 frame.setVisible(true);//让图形界面可见 }); } } package button; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * A frame with a button panel */ public class ButtonFrame extends JFrame { private JPanel buttonPanel; private static final int DEFAULT_WIDTH = 300;//定义用户界面的宽度 private static final int DEFAULT_HEIGHT = 200;//定义用户界面的高度 public ButtonFrame() { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // 通过在按钮构造器中指定一个标签字符串、一个图标 或两项都指定来创建一个按钮,下面的三个按钮都是如此 JButton yellowButton = new JButton("Yellow"); JButton blueButton = new JButton("Blue"); JButton redButton = new JButton("Red"); buttonPanel = new JPanel(); // add buttons to panel buttonPanel.add(yellowButton); buttonPanel.add(blueButton); buttonPanel.add(redButton); // add panel to frame add(buttonPanel); // 为每个颜色构造一个对象 ColorAction yellowAction = new ColorAction(Color.YELLOW); ColorAction blueAction = new ColorAction(Color.BLUE); ColorAction redAction = new ColorAction(Color.RED); // 调用add方法将按钮添加到面板上 yellowButton.addActionListener(yellowAction); blueButton.addActionListener(blueAction); redButton.addActionListener(redAction); } /** * An action listener that sets the panel's background color. */ private class ColorAction implements ActionListener//颜色储存在监听器类中 { private Color backgroundColor; public ColorAction(Color c) { backgroundColor = c; } public void actionPerformed(ActionEvent event)// { buttonPanel.setBackground(backgroundColor); } } }