一、介绍
下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。
二、像素
概念:计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。需要注意的是,像素是一个密度单位,而厘米是长度单位,两者无法比较
三、绘图原理
Component类提供了两个和绘图相关最重要的方法:
1.paint(Graphics g)绘制组件的外观
2.repaint)刷新组件的外观。
当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件
在以下情况paint0将会被调用:
(1)窗口最小化,再最大化
(2)窗口的大小发生变化
(3)repaint方法被调用
四、入门案例
在面板上画一个圆圈
步骤如下:
1.先定义一个MyPanel类, 继承JPanel类, 画图形,就在面板上画
2.在MyPanel中重写paint()方法,在paint方法中调用Graphics类中的方法来画图
3.定义一个面板,让主类继承JFrame,
4.定义一个构造器,在里面设置窗口的大小等
5.调用该构造器,完成绘图
public class DrawCircle extends JFrame { //JFrame对应窗口,可以理解成是一个画框
//定义一个面板
private MyPanel mp = null;
public static void main(String[] args) {
new DrawCircle();
}
public DrawCircle() {//构造器
//初始化面板
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 提供了很多绘图的方法
@Override
public void paint(Graphics g) {//绘图方法
super.paint(g);//调用父类的方法完成初始化.
//画出一个圆形.
g.drawOval(10, 10, 100, 100);
}
}
五、Graphics类
Graphics常用方法(以下代码演示只需将上面入门案例中g.drawOval(10, 10, 100, 100)改成下述代码即可)
(1)画直线
drawLine(int x1,int y1,int x2,int y2),x1,y1表示直线起点的坐标,x2,y2表示直线尾部的坐标
g.drawLine(10, 10, 100, 100);
效果:
(2)画矩形边框
drawRect(int x, int y, int width, int height) ,x,y表示矩形边框左上角的坐标,width,height分别表示矩形边框的宽高
g.drawRect(10, 10, 100, 100);
效果:
(3)画椭圆边框
drawOval(int x, int y, int width, int height),x,y表示包围椭圆的边框左上角的坐标,width,height分别表示边框的宽高
g.drawOval(10, 10, 100, 100);
效果:
(4)填充矩形、设置画笔的颜色
fillOval(int x, int y, int width, int height),x,y表示矩形左上角的坐标,width,height分别表示该矩形的宽高
g.setColor(Color.blue),Color.blue就是设置的画笔颜色,默认黑色
g.setColor(Color.blue);//设置画笔颜色为蓝色
g.fillRect(10, 10, 100, 100);
效果:
(5)填充椭圆
fillOval(int x, int y, int width, int height),x,y表示包围椭圆的边框左上角的坐标,width,height分别表示边框的宽高
g.setColor(Color.red);//设置画笔颜色为红色
g.fillOval(10, 10, 100, 100);
效果:
(6)放图片
drawImage(Image img, int x, int y, int width, int height, this),img为图片资源对象,x,y表示图片左上角的坐标,width,height分别表示图片的宽高,this表示在当前的画板
获取图像资源时,maven的项目的根目录是resources,我是在resources目录下新建了一个image的目录,在把图片放到image目录下,这里用的是绝对路径
//1. 获取图片资源, /image/a.png为图片地址
Image image =Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/image/a.png"));
g.drawImage(image, 10, 10, 175, 221, this);
效果:
(7)写文字和设置字体
dramString(String str, int x, int y),str就是要写上去的字符串,x,y是字符串的左下角坐标
setFont(new Font("隶书", Font.BOLD, 50)),Font.BOLD表示设置为粗体,50表示字体的大小
g.setColor(Color.red);
g.setFont(new Font("隶书", Font.BOLD, 50));
g.drawString("北京你好", 100, 100);
效果:
六、综合案例
画一个小坦克
代码:
MyPanel类
import javax.swing.*;
import java.awt.*;
public class MyPanel extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.cyan);
g.fillRect(47, 50, 10,50);
g.fillRect(77, 50, 10,50);
g.fillRect(57, 60, 20,30);
g.setColor(Color.blue);
g.fillOval(57, 65, 20, 20);
g.drawLine(67, 75, 67, 50);
}
}
draw类
import javax.swing.*;
public class draw extends JFrame {
private MyPanel myPanel = null;
public draw() {
myPanel = new MyPanel();
this.add(myPanel);
this.setSize(500, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
主类Execute类
public class Execute {
public static void main(String[] args) {
new draw();
}
}
运行效果: