坦克大战01 Java绘图坐标体系与事件处理机制

1 Java绘图坐标体系

1.1 介绍

在这里插入图片描述

1.2 像素

计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示 器的分辨率是800x600,表示计算机屏幕上的每一行由800个点组成,共有600行, 整个计算机屏幕共有480000个像素。像素是一个密度单位,而厘米是长度单位,两者无法比较

1.3 示例

public class DrawCircle extends JFrame{
    private MyPanel mp = null;

    public static void main(String[] args) {
        new DrawCircle();
    }
    public DrawCircle() {
        mp = new MyPanel();
        //将panel添加到frame
        this.add(mp);
        //设置窗口大小
        this.setSize(400,300);
        this.setVisible(true);//可以显示
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击X释放程序

    }
}

//定义面板
class MyPanel extends JPanel {
    @Override
    public void paint(Graphics g) {
        super.paint(g);//保留,调用父类的方法完成初始化
        g.drawOval(10,10,100,100);//画一个圆
    }
}

1.3 绘图原理

Component类提供了两个和绘图相关最重要的方法

  1. paint(Graphics g):绘制组件的外观
  2. repaint():刷新组件的外观

当组件第一次在屏幕显示时,程序会自动调用paint()方法来绘制组件

在以下情况下paint()会被调用:

  1. 窗口最小化。再最大化
  2. 串口的大小发生变化
  3. repaint()方法被调用

1.3 Graphics类

  1. 画直线 drawLine(int x1,int y1,int x2,int y2)
  2. 画矩形边框 drawRect(int x, int y, int width, int height)
  3. 画椭圆边框 drawOval(int x, int y, int width, int height)
  4. 填充矩形 fillRect(int x, int y, int width, int height)
  5. 填充椭圆 fillOval(int x, int y, int width, int height)
  6. 画图片drawlmage(Image img, int x, int y, …)
  7. 画字符串drawString(String str, int x, int y)
  8. 设置画笔的字体setFont(Font font)
  9. 设置画笔的颜色setColor(Color c)

2 Java事件处理机制

2.1 问题

小球受键盘控制上下左右移动

public class BallMove extends JFrame{
    MyPanel mp = null;

    public static void main(String[] args) {
        new BallMove();
    }

    public BallMove() {
        mp = new MyPanel();
        this.add(mp);
        this.setSize(400, 300);
        this.addKeyListener(mp);//JFrame对象可以监听到mp面板上发生的键盘事件
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

}
//面板
//KeyListener监听器可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
    //为了让小球移动,将小球坐标设为变量
    int x = 10;
    int y = 10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x, y, 20, 20);
    }

    @Override
    public void keyTyped(KeyEvent e) {//监听字符输出时,触发

    }

    @Override
    public void keyPressed(KeyEvent e) {//监听某个键按下时,触发
//        System.out.println((char)e.getKeyCode() + "被按下");
        //根据按下不同的按键,处理小球的移动
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {//KeyEvent.VK_DOWN:方向键下键
            if ((y+=5) >= 240)
                y = 0;
        } else if (e.getKeyCode() == KeyEvent.VK_UP) {
            if ((y-=5) <= 0)
                y = 240;
        } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            if ((x+=5) >= 365)
                x = 0;
        } else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            if ((x-=5) <= 0)
                x = 365;
        }
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {//监听某个键释放了时,触发

    }
}

2.2 说明

java事件处理是采取“委派事件模型”。当事件发生时,产生事件的对象,会把此"信息"传递 给"事件的监听者"处理,这里所说的"信息"实际上就是java.awt.event事件类库里某个 类所创建的对象,把它称为"事件的对象"。

2.3 机制

在这里插入图片描述

2.4 深入理解

  1. 前面我们提到几个重要的概念事件源,事件,事件监听器我们下面来全面的介绍它们。

  2. 事件源:事件源是一个产生事件的对象,比如按钮,窗口等。

  3. 事件:事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件等等,会生成一个事件对象,该对象保存着当前事件很多信息,比如KeyEvent对象有 含有被按下键的Code值。java.awt.event包和javax.swing.event包中定义了各种事件类型

  4. 事件类型

    事件类说明
    ActionEvent通常在按下按钮,或双击一个列表项或造中某个菜单时发生
    AdjustmentEvent当操作一个滚动条时发生
    ComponentEvent当一个组件隐藏,移动,改变大小时发生
    ContainerEvent当一个组件从容器中加入或者删除时发生
    FocusEvent当一个组件获得或是失去焦点时发生
    ItemEvent当一个复选框或是列表项被选中时,当一个选择框或选择菜单被选中
    KeyEvent当从键盘的按键被按下,松开时发生
    MouseEvent当鼠标被拖动,移动,点击,按下…
    TextEvent当文本区和文本域的文本发生改变时发生。
    WindowEvent当一个窗☐激活,关闭,失效,恢复,最小化…
  5. 事件监听接口:

    1. 当事件源产生一个事件,可以传送给事件监听者处理
    2. 事件监听者实际上就是一个类,该类实现了某个事件监听器接口,比如前面我们案例中的 MyPanel 就是一个类,它实现了 KeyListener 接口,它就可以作为一个事件监听者,对接受到的事件 进行处理
    3. 事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现多个监听接口
    4. 这些接口在java.awt.event包和javax.swing.event包中定义。列出常用的事件监听器接口,查看jdk文档聚集了.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值