java基础day06---事件

java基础day06—事件

1、像素:计算机在屏幕上显示的内容都是由屏幕上的每个像素组成 eg.显示器分辨率800*600,表示每一行有800个点,有600行,整个屏幕共有480000个像素
2、绘图原理:1)paint(Graphics g)绘制组件外观 2)repaint()刷新组件外观
当组件第一次在屏幕上显示的时候,程序会自动调用paint()方法来绘制组件
以下情况paint()会被调用:1)窗口最大化/最小化 2)窗口大小发生变化 3)repaint函数被调用
Graphics类:可理解为一支画笔,提供多种绘制图形的方法 eg.画直线、画矩形、画图片

package com.mys;
import java.awt.*;
import javax.swing.*;

public class Demo1 extends JFrame{
    MyPanel mp=null;
    public static void main(String []args){
        Demo1 demo1=new Demo1();
    }
    //构造函数
    public Demo1(){
        mp=new MyPanel();
        this.add(mp);
        this.setSize(300,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}
//定义一个MyPanel(用于绘图和显示绘图的区域)
class MyPanel extends JPanel{
    //覆盖JPanel的paint方法,Graphic绘图的重要类,可理解为一支画笔
    public void paint(Graphics g){
        //调用父类函数进行初始化
        super.paint(g);
        //填充矩形
        //g.fillRect(0,0 ,300 ,400 );
        //画圆
        //g.drawOval(20,20,20,20);
        //设置颜色
        //g.setColor(Color.CYAN);
        //填充矩形
        //g.fill3DRect(20,20,40,60,true);
        //在面板上画图片
        //getDefaultToolkit获取默认工具包;getImage返回从指定文件获取像素数据的图像
        Image im=Toolkit.getDefaultToolkit().getImage("src/cn/mys/qq.jpg");
        g.drawImage(im,20,20,200,150,this);//this代表JPanel
        //画字
        //g.setFont(new Font("隶书", Font.BOLD,20 ));
        //g.drawString("mys",40 ,60 );
        //画弧线
        //g.drawArc(40,60 ,100 ,200 ,400 ,300 );
    }
}

3、Java事件处理机制
初步介绍:当事件发生时,产生事件的对象(事件源)信息传递给事件的监听者处理的一直种方式,信息即事件的对象java基础day06---事件_第1张图片
一个类实现监听的步骤:1)实现相应的接口【eg.Key Listener】2)把接口处理的方法根据需要重写 3)事件源注册监听 4)事件传递靠事件对象

import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Demo2 extends JFrame implements ActionListener {
    //定义组件
    JButton jb1,jb2;
    JPanel jp;
    public static void main(String []args){
        Demo2 demo2=new Demo2();
    }
    public Demo2(){
        //创建组件
        jb1=new JButton("黑色");
        jb2=new JButton("红色");
        jp=new JPanel();
        jp.setBackground(Color.BLACK);//设置背景颜色

        Cat cat=new Cat();

        //注册监听
        jb1.addActionListener(this);//事件源对象jb1 事件监听对象this
        jb1.addActionListener(cat);//事件源对象jb1 事件监听对象cat
        jb2.addActionListener(this);
        //指定anction命令
        jb1.setActionCommand("黑色");
        jb2.setActionCommand("红色");

        this.add(jb1,BorderLayout.NORTH);
        this.add(jb2,BorderLayout.SOUTH);
        this.add(jp,BorderLayout.CENTER);

        this.setSize(400,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    //对事件处理的方法 actionPerformed
    @Override
    public void actionPerformed(ActionEvent e) {//ActionEvent e 事件的对象
        //判断是那个按钮被点击
        if(e.getActionCommand().equals("黑色")){
            System.out.println("黑色被按下");
            jp.setBackground(Color.BLACK);//设置背景颜色为黑色
        }else if(e.getActionCommand().equals("红色")){
            System.out.println("红色被按下");
            jp.setBackground(Color.RED);//设置背景颜色为红色
        }else{
            System.out.println("不知道");
        }
    }
}
//任何一个类,只要其实现了相应的接口,就可以去监听某个事件源
class Cat implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        //判断是那个按钮被点击
        if(e.getActionCommand().equals("黑色")){
            System.out.println("猫猫知道黑色被按下");
        }else if(e.getActionCommand().equals("红色")){
            System.out.println("猫猫知道红色被按下");//为什么猫猫不知道红色被按下???
        }else{
            System.out.println("不知道");
        }
    }
}

深入理解:
1)事件源:一个产生或触发的事件对象,当这个事件源对象的某个状态发生某种变化时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件
2)事件:承载事件源状态改变信息的载体,or事件源向事件监听者传输事件状态信息的载体,查阅jdk文档:常见的事件类AtionEvent、AdjustmentEvent、ComponentEvent、ContainerEvent、FocusEvent、ItemEvent、KeyEvent、MouseEvent、TextEvent、WindowEvent
3)事件监听者:一个类,实现某个事件监听器接口,作为事件监听者对接收到的事件进行处理,不同的事件监听器接口可以监听不同的事件,一个类可以实现一个事件监听器接口,也可以实现多个事件监听器接口

/*
功能:一个事件源可能会生成多个不同类型的事件,
一个类可以实现一个事件监听器接口,也可以实现多个事件监听器接口
 */
package com.mys;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Demo4 extends JFrame{
    //定义组件
    MyPanel2 mp2;
    public static void main(String []args){
        Demo4 demo4=new Demo4();
    }
    public Demo4(){
        mp2=new MyPanel2();
        this.add(mp2);
        //注册监听
        this.addMouseListener(mp2);
        this.addKeyListener(mp2);
        this.addMouseMotionListener(mp2);

        this.setSize(300,400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}
class MyPanel2 extends JPanel implements MouseListener,KeyListener,MouseMotionListener{
    public void paint(Graphics g){
        super.paint(g);
        g.fillOval(10,10 ,10 ,10 );
    }
    //鼠标点击
    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("鼠标点击:x="+e.getX()+" y="+e.getY());
    }
    //鼠标按下
    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("鼠标按下");
    }
    //释放鼠标
    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("释放鼠标");
    }
    //鼠标移动到MyPanel
    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("鼠标移动到MyPanel");
    }
    //鼠标离开MyPanel
    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("鼠标离开MyPanel");
    }
    //键值
    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("键值:"+e.getKeyChar());
    }
    //键按下
    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("键按下:"+e.getKeyChar());
    }
    //键释放
    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("键释放");
    }
    //鼠标拖拽
    @Override
    public void mouseDragged(MouseEvent e) {
        System.out.println("鼠标拖拽");
    }
    //鼠标移动
    @Override
    public void mouseMoved(MouseEvent e) {
        System.out.println("鼠标移动,当前位置:x="+e.getX()+" y="+e.getY());
    }
}

小结

1.Java采用委托机制处理事件
2.Java中的事件是分类的,如窗体事件、鼠标事件
3.Java一个类要监听某个事件,则必须实现相应的事件监听接口
4.事件监听接口有多种,要根据不同的情况实现不同的接口
5.实现监听接口的类中需要重写处理函数
6.在事件源中需要注册事件监听类,否则事件监听类接收不到事件源发生的事件

你可能感兴趣的:(java)