事件模型

ActionEvent

 事件模型如何理解呢,举个例子,你老婆出门了,让你在家看孩子,难道你每过一分钟就去看一次孩子吗,对于计算机来说,我做一个按钮,难道就一直监听这个按钮使用没有吗,这样的话对于资源消耗太大了,所以最好的办法就是在孩子手上系个铃铛,孩子一有动静铃铛就响,你过去看就行了。反映到计算机上,你可以把某个代码写好,然后告诉某个对象比方说button,当button一执行,就让他自动调用你写好的代码,这样对计算机的压力就并不是很重,这个叫钩子函数,也叫回调函数

import java.awt.*;
import java.awt.event.*;
public class TestActionEvent {
    public static void main(String[] args) {
        Frame f = new Frame("Test");
        Button b = new Button("Press Me");
        Monitor bh = new Monitor();
        b.addActionListener(bh);
        f.add(b,BorderLayout.CENTER);
        f.pack();
        f.setVisible(true);
    }
}
class Monitor implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("a button has been pressed");
    }
}

 当事件发生时,就会自动调用actionPerformed函数,参数是一个事件对象,这个对象中包装了很多关于事件的信息,比方说发生的时间,发生的情况等等

import java.awt.*;
import java.awt.event.*;
public class TestActionEvent {
    public static void main(String[] args) {
        Frame f = new Frame("Test");
        Button b1 = new Button("start");
        Button b2 = new Button("stop");
        Monitor2 bh = new Monitor2();
        b1.addActionListener(bh);
        b2.addActionListener(bh);
        b2.setActionCommand("Game Over");
        f.add(b1,BorderLayout.NORTH);
        f.add(b2,BorderLayout.SOUTH);
        f.pack();
        f.setVisible(true);
    }
}
class Monitor2 implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("a button has been pressed " + e.getActionCommand());
    }
}

MouseEvent

 java中事件监听的接口名称都非常有规律,监听动作的叫ActionListener,监听鼠标的叫MouseListener,监听键盘的叫KeyListener  MouseLinsenter中有四个方法

 但是如果我们写自己的鼠标监听器类,继承这个接口需要实现四个方法,非常麻烦,所以一般我们都直接继承MouseAdapter类,这个类已经实现了MouseListener的所有方法,我们只要重写其方法即可

import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class MyMouseAdapter {
    public static void main(String[] args) {
        new MyFrame1("drawing...");
    }
}
class MyFrame1 extends Frame {
    ArrayList<Point> points = null;
    MyFrame1(String s) {
        super(s);
        points = new ArrayList();
        setLayout(null);
        setBounds(300,300,400,300);
        setBackground(new Color(204,204,255));
        setVisible(true);
        addMouseListener(new Monitor());
    }
    public void paint(Graphics g) {
        Iterator<Point> i = points.iterator();
        while(i.hasNext()) {
            Point p = (Point)i.next();
            g.setColor(Color.blue);
            g.fillOval(p.x,p.y,8,8);
        }
    }
    public void addPoint(Point p) {
        points.add(p);
    }
}
class Monitor extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
        MyFrame1 f = (MyFrame1)e.getSource();
        f.addPoint(new Point(e.getX(),e.getY()));
        f.repaint();
    }
}

 这是一个画点的程序,鼠标在Frame上点击一下就会在当前位置点出一个点,需要注意的是,repaint方法的执行过程可以理解为:update()->paint(),首先更新,然后画点,所以repaint方法在画图的时候必须加上

WindowEvent

 之前我们做的所有窗口程序,都无法通过右上角的“X”关掉窗口,只能停止程序关闭窗口,下面我们就通过WindowEvent来设置关闭,下图是WindowListener接口中的方法

import java.awt.*;
import java.awt.event.*;
public class WindowsClose {
    public static void main(String[] args) {
        new MyFrame55("MyFrame");
    }
}
class MyFrame55 extends Frame {
    MyFrame55(String s) {
        super(s);
        setLayout(null);
        setBounds(300,300,400,300);
        setBackground(new Color(204,204,255));
        setVisible(true);
        addWindowListener(new MyWindowMonitor());
    }
    class MyWindowMonitor extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            setVisible(false);
            System.exit(0);
        }
    }
}

 同样的,因为接口的方法太多,我们自己实现太麻烦,可以通过继承WindowAdapter类来重写某些方法。这个程序实现了关闭窗口的效果

KeyEvent

 下图是KeyListener接口的方法,同样的,也有一个类实现了这个接口,叫KeyAdapter,接下来我们直接做一个摁键盘上下左右,然后打印对应的字符串

import java.awt.*;
import java.awt.event.*;
public class TestKey {
    public static void main(String[] args) {
        new KeyFrame().launchFrame();
    }
}
class KeyFrame extends Frame {
    public void launchFrame() {
        setSize(200,200);
        setLocation(300,300);
        addKeyListener(new MyKeyMonitor());
        setVisible(true);
    }
    class MyKeyMonitor extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            switch(keyCode) {
            case KeyEvent.VK_UP:System.out.println("UP");break;
            case KeyEvent.VK_DOWN:System.out.println("DOWN");break;
            case KeyEvent.VK_LEFT:System.out.println("LEFT");break;
            case KeyEvent.VK_RIGHT:System.out.println("RIGHT");break;
            }
        }
    }
}

 键盘上的每一个值,在KeyEvent类中都有对应的虚拟数值,只要进行比对就行

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

CSS魔法堂:"那不是bug,是你不懂我!" by inline-block

前言  每当来个需要既要水平排版又要设置固定高宽时,我就会想起display:inline-block,还有为了支持IE5.5/6/7的hack*display...

22180
来自专栏前端杂货铺

ReactJS分析之入口函数render

前言   在使用React进行构建应用时,我们总会有一个步骤将组建或者虚拟DOM元素渲染到真实的DOM上,将任务交给浏览器,进而进行layout和paint等...

39690
来自专栏好好学java的技术栈

特别的520,送给特别的你们,还不来看看?

12820
来自专栏deepcc

emmet(Zen coding)前端写代码神器

39170
来自专栏游戏杂谈

利用threshold实现的遮罩引导

点击“开始引导”,则进入引导操作。除指定的按钮可以操作外,其它区域均不可点击。这种应用当新功能或是新产品上线后,用来引导用户来使用产品/功能,是十分有用的。fa...

11410
来自专栏智能大石头

GridView绑定小技

1,使用表达式。如下,缺货的产品用红色,别的绿色。 ? ? 实际上,就这个表达式: (Int32)Eval("Num")<(Int32)Eval("MinNum...

22680
来自专栏我的博客

Jquery学习第一天

1、jQuery优点 轻量级,强大的选择器,出色的DOM操作,可靠的事件处理,完善的Ajax,不污染的顶级变量,出色的浏览器兼容,链式操作,隐式迭代,行为层和结...

37580
来自专栏章鱼的慢慢技术路

Go指南练习_切片

18530
来自专栏web编程技术分享

js学习: 自定义类库 - miniQuery 2.0

38370
来自专栏从零开始学 Web 前端

11 - JavaSE之GUI

PS: Panel 的 setBounds 方法中设置的位置大小是相对于相对装入的 Frame 窗口位置和大小的。

21750

扫码关注云+社区

领取腾讯云代金券