GUI编程主要有两点:
一、图形界面的绘制。对Frame,Button,TextArea,Menu等控件的使用和对布局方式Layout的运用。
二、事件的处理。 对事件的处理首先要弄清楚java的事件监听机制。
事件监听机制的特点:
1、事件源 就是awt或Swing包中的那些图形界面。
2、事件 每一种事件源都有自己特有的事件和共性事件。keyEvent,WindowEvent,MouseEvent等,都是不同的事件。
3、监听器 将可以触发某一个事件的动作都已经封装到了监听器中。
以上三者,在java中都已经定义好了,直接获取其对象就可以了。我们要做的事情就是对产生的事件进行处理:
4、事件处理 。
事件处理,就得要实现监听器中定义的方法。我们通常使用匿名内部类的形式实现我们对事件的自定义处理。为了我们不用重写所有的方法,
使用继承自适配器Adapter 的方法。
如WindowListener中定义了,窗口这个事件源可以有以下几种形为:
void |
windowActivated(WindowEvent e) 将 Window 设置为活动 Window 时调用。 |
void |
windowClosed(WindowEvent e) 因对窗口调用 dispose 而将其关闭时调用。 |
void |
windowClosing(WindowEvent e) 用户试图从窗口的系统菜单中关闭窗口时调用。 |
void |
windowDeactivated(WindowEvent e) 当 Window 不再是活动 Window 时调用。 |
void |
windowDeiconified(WindowEvent e) 窗口从最小化状态变为正常状态时调用。 |
void |
windowIconified(WindowEvent e) 窗口从正常状态变为最小化状态时调用。 |
void |
windowOpened(WindowEvent e) 窗口首次变为可见时调用。 |
于是就出现了一个WindowAdapter ,提供了一个空实现,当我们要实现某个功能时,以内部类的形式重写这个方法就可以。
常见的WindowListener,KeyListener,MouseListener都有自己的适配器,因这这些事件源都有多个事件方法。
特例:活动监听ActionListener只有一个方法,所以用不着适配器。
一个组件可以添加哪些监听方法,只有组件最清楚。添加ActionListener监听,需要重写ActionListener中的performed方法。且ActionListener监听的优先级
比鼠标键盘等事件监听优先级高。示例代码:
import java.awt.*; import java.awt.event.*; public class MouseKeyEventDemo { private Frame frame; private Button btn; public MouseKeyEventDemo() { init(); } public void init() { frame = new Frame("my frame"); frame.setBounds(300, 200, 500, 400); frame.setLayout(new FlowLayout()); btn = new Button("按钮"); frame.add(btn); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("actionPerformed动作后于mouse动作!只要活动就能运行。用键盘都能执行!"); } }); btn.addMouseListener(new MouseAdapter() { private int count = 1; public void mouseEntered(MouseEvent e) { System.out.println("鼠标第" + count + "次进入到按键上了!!"); count++; } public void mouseClicked(MouseEvent e) { if(e.getClickCount()==2) System.out.println("双击动作!"); } }); btn.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent k){ System.out.println(k.getKeyChar()+":"+k.getKeyCode()+k.getKeyText(k.getKeyCode())); } }); frame.setVisible(true); } public static void main(String[] args) { new MouseKeyEventDemo(); } }