020Java基础之绘图技术

1、java 绘图坐标体系

1.1、坐标体系-介绍

在这里插入图片描述

1.2、坐标体系-像素

在这里插入图片描述

1.3、介绍-快速入门
package com.francis.draw;

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

/**
 * @author Francis
 * @create 2021-10-24 15:56
 */
@SuppressWarnings({"all"})
public class DrawCircle extends JFrame { //JFrame 对应窗口,可以理解成是一个画框
    //定义一个面板
//    private MyPanel mp = null;

    public static void main(String[] args) {
        new DrawCircle();
        System.out.println("退出程序~");
    }

    public DrawCircle() {//构造器
//初始化面板
        MyPanel mp = new MyPanel();
//把面板放入到窗口(画框)
        this.add(mp);
//设置窗口的大小
        this.setSize(400, 300);
//当点击窗口的小×,程序完全退出.
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);//可以显示
    }
}

//1.先定义一个 MyPanel, 继承 JPanel 类, 画图形,就在面板上画
class MyPanel extends JPanel {
    //说明:
//1. MyPanel 对象就是一个画板
//2. Graphics g 把 g 理解成一支画笔
//3. Graphics 提供了很多绘图的方法
//Graphics g
    @Override
    public void paint(Graphics g) {//绘图方法
        super.paint(g);//调用父类的方法完成初始化.
        System.out.println("paint 方法被调用了~");
//画出一个圆形.
        g.drawOval(10, 10, 100, 100);
//演示绘制不同的图形.. //画直线 drawLine(int x1,int y1,int x2,int y2)
g.drawLine(10, 10, 100, 100);
//画矩形边框 drawRect(int x, int y, int width, int height)
g.drawRect(10, 10, 100, 100);
//画椭圆边框 drawOval(int x, int y, int width, int height)
//填充矩形 fillRect(int x, int y, int width, int height)
//设置画笔的颜色
 g.setColor(Color.blue);
 g.fillRect(10, 10, 100, 100);
//填充椭圆 fillOval(int x, int y, int width, int height)
 g.setColor(Color.red);
 g.fillOval(10, 10, 100, 100);
//画图片 drawImage(Image img, int x, int y, ..)
//1. 获取图片资源, /bg.png 表示在该项目的根目录(out目录)去获取 bg.png 图片资源
// Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
// g.drawImage(image, 10, 10, 175, 221, this);
//画字符串 drawString(String str, int x, int y)//写字
//给画笔设置颜色和字体
        g.setColor(Color.red);
        g.setFont(new Font("隶书", Font.BOLD, 50));
//这里设置的 100, 100, 是 "北京你好"左下角
        g.drawString("北京你好", 100, 100);
//设置画笔的字体 setFont(Font font)
//设置画笔的颜色 setColor(Color c)
    }
}
1.4、绘图原理

Component类提供了两个和会话相关的重要方法
(1)paint(Graphics g) 绘制组件的外观
(2)repaint() 刷新组件的外观
其中,paint在组件第一次在屏幕上显示的时候会被自动调用来绘制组件、在窗口最小化,再最大化、窗口的大小发生变化、repaint方法被调用时,都会被调用

1.4.1、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)画图片 drawImage(Image img, int x, int y, …);Image image=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
(7)画字符串 drawString(String str, int x, int y)
(8)设置画笔的字体 setFont(Font font)
(9)设置画笔的颜色 setColor(Color c)

2、绘制坦克

package com.francis.tankgame1;

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

/**
 * @author Francis
 * @create 2021-10-24 17:10
 */
public class MyPanel extends JPanel {
    Hero hero = null;
    public MyPanel() {
        hero = new Hero(100, 100);//初始化自己坦克
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0, 0, 1000, 750);//填充矩形,默认黑色
//画出坦克-封装方法
        drawTank(hero.getX(), hero.getY(), g, 0, 0);
    }
//编写方法,画出坦克
    /**
     * @param x 坦克的左上角 x 坐标
     * @param y 坦克的左上角 y 坐标
     * @param g 画笔
     * @param direct 坦克方向(上下左右)
     * @param type 坦克类型
     */
    public void drawTank(int x, int y, Graphics g, int direct, int type) {
//根据不同类型坦克,设置不同颜色
        switch (type) {
            case 0: //我们的坦克
                g.setColor(Color.cyan);
                break;
            case 1: //敌人的坦克
                g.setColor(Color.yellow);
                break;
            default:
                break;
        }
//根据坦克方向,来绘制坦克
        switch (direct) {
            case 0: //表示向上
                g.fill3DRect(x, y, 10, 60, false);//画出坦克左边轮子
                g.fill3DRect(x + 30, y, 10, 60, false);//画出坦克右边轮子
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//画出坦克盖子
                g.fillOval(x + 10, y + 20, 20, 20);//画出圆形盖子
                g.drawLine(x + 20, y + 30, x + 20, y);//画出炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }
}
package com.francis.tankgame1;

import javax.swing.*;

/**
 * @author Francis
 * @create 2021-10-24 17:11
 */
public class TankGame01 extends JFrame {
    //定义 MyPanel
    MyPanel mp = null;
    public static void main(String[] args) {
        TankGame01 hspTankGame01 = new TankGame01();
    }
    public TankGame01() {
        mp = new MyPanel();
        this.add(mp);//把面板(就是游戏的绘图区域)
        this.setSize(1000, 750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}
package com.francis.tankgame1;

/**
 * @author Francis
 * @create 2021-10-24 17:09
 */
public class Tank {
    private int x;//坦克的横坐标
    private int y;//坦克的纵坐标

    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

}
package com.francis.tankgame1;

/**
 * @author Francis
 * @create 2021-10-24 17:09
 */
public class Hero extends Tank {
    public Hero(int x, int y) {
        super(x, y);
    }
}

3、java 事件处理机制

3.1、基本说明

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

package com.francis.draw.event_;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 * @author Francis
 * @create 2021-10-24 18:22
 */
public class BallMove extends JFrame { //窗口
    MyPanel mp = null;
    public static void main(String[] args) {
        BallMove ballMove = new BallMove();
    }
    //构造器
    public BallMove() {
        mp = new MyPanel();
        this.add(mp);
        this.setSize(400, 300);
//窗口 JFrame 对象可以监听键盘事件, 即可以监听到面板发生的键盘事件
        this.addKeyListener(mp);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}
//面板, 可以画出小球
//KeyListener 是监听器, 可以监听键盘事件
class MyPanel extends JPanel implements KeyListener {
    //为了让小球可以移动, 把他的左上角的坐标(x,y)设置变量
    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() + "被按下..");
//根据用户按下的不同键,来处理小球的移动 (上下左右的键)
//在 java 中,会给每一个键,分配一个值(int)
        if(e.getKeyCode() == KeyEvent.VK_DOWN) {//KeyEvent.VK_DOWN 就是向下的箭头对应的 code
            y++;
        } else if(e.getKeyCode() == KeyEvent.VK_UP) {
            y--;
        } else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
            x--;
        } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
            x++;
        }
//让面板重绘
        this.repaint();
    }
    //当某个键释放(松开),该方法会触发
    @Override
    public void keyReleased(KeyEvent e) {
    }
}
3.2、事件处理机制深入理解

(1)事件源:事件源是一个产生事件的对象,比如按钮、窗口等
(2)事件:事件就是承载事件源状态改变的对象,比如键盘、鼠标、窗口等等的状态发生改变时,就会产生一个事件对象,该对象保存这当前事件的很多信息,比如KeyEvent对象含有按下键的code值,java.awt.event和java.swing.event包中定义了各种事件类型
在这里插入图片描述
(3)事件监听器接口:
①当事件源产生一个事件,可以传递给事件监听者处理
②事件监听者实际上就是一个类,该类实现了某个事件监听器接口,比如前面的MyPanel,就实现了KeyListener接口,它就可以作为一个事件监听者,对接收到的时间进行处理
③事件监听器接口有多种,不同的事件监听器可以监听不同的时间,一个类可以实现多个监听器接口

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值