您的位置:首页 > 编程语言 > Java开发

Java核心技术(事件处理)

2011-04-21 11:29 579 查看

事件处理基础

任何支持GUI的操作环境都要不断地监视敲击键盘或点击鼠标这样的事件。操作环境将这些事件报告给正在运行的应用程序。如果有事件

产生,每个应用程序将决定如何对他们做出响应。在AWT所知的事件范围内,完全可以控制事件从事件源到事件监听器的传递过程,并将任何

对象指派给事件监听器。事件源有一些向其注册事件监听器的方法。当某个事件源产生事件时,事件源会向为事件注册的所有事件监听器对象

发送一个通告。在Java中,所有的事件对象都最终派生于java.util.EventObject类。不同的事件源可以产生不同类别的事件。

AWT事件处理机制概要:

*监听器对象是一个实现了特定监听器接口的类的实例。

*事件源是一个能够注册监听器对象并发送事件对象的对象。

*当事件发生时,事件源将事件对象传递给所有注册的监听器。

*监听器对象将利用事件对象中的信息决定如何对事件作出响应。

动作

Action接口可以封装命令,并将它们连接到多个事件源。AbstractAction类实现了除了actionPerformed方法外的所有方法。为了将

动作与击键关联起来,首先需要生成KeyStroke类对象。KeyStroke类对象封装了对键的说明,通过调用getKeyStroke方法来构造

KeyStroke。

每个JComponent由三个输入映射,每一个映射的KeyStroke对象都与动作关联:

*WHEN_FOCUSED:当这个组件用友键盘焦点时

*WHEN_ANCESTOR_OF_FOCUSED_COMPONENT:当这个组件包含了拥有键盘焦点的组件时

*WHEN_IN_FOCUSED_WINDOW:当这个组件被包含在一个拥有键盘焦点组件的窗口中时

InputMap不能直接地将KeyStroke对象映射到Action对象,而是先映射到任意对象上,然后由ActionMap类实现将对象映射到动作上

的第二个映射。

鼠标事件

当用户点击鼠标按钮时,将会调用三个监听器方法:鼠标第一次被按下时调用mousePressed;鼠标被释放时调用mouseReleased;

最后调用mouseClicked。getModifiersEx方法能准确地报告鼠标事件的鼠标按钮和键盘修饰符。

下面代码实现了Swing程序的不同外观,同时支持键盘事件响应(1234Esc)

public class ActionDemo extends JFrame {
public static void main(String[] args) {
JFrame frame = new ActionDemo();
frame.setVisible(true);
}
public ActionDemo() {
setSize(WIDTH, HEIGHT);
setTitle("LookAndFeel");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
InputMap inputMap = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap actionMap = panel.getActionMap();
UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
for (int i = 0; i < infos.length; i++) {
Action action = new LookAndFeelAction(infos[i].getName(), infos[i].getClassName());
panel.add(new JButton(action));
inputMap.put(KeyStroke.getKeyStroke(49 + i, 0), infos[i].getName());
actionMap.put(infos[i].getName(), action);
}
add(panel, BorderLayout.CENTER);

inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "esc");
actionMap.put("esc", new AbstractAction(){
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
}
private static final int WIDTH = 500;
private static final int HEIGHT = 200;
class LookAndFeelAction extends AbstractAction {
public LookAndFeelAction(String name, String lookAndFeel) {
putValue(Action.NAME, name);
putValue(Action.SHORT_DESCRIPTION, "set frame lookandfeel to " + name);
putValue("lookAndFeel", lookAndFeel);
}
public void actionPerformed(ActionEvent e) {
try {
UIManager.setLookAndFeel(getValue("lookAndFeel").toString());
SwingUtilities.updateComponentTreeUI(ActionDemo.this);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: