目录
2° drawLine(int x1, int y1, int x2, int y2) : 画直线
3° drawRect(int x, int y, int width, int height) : 画矩形边框
4° fillRect(int x, int y, int width, int height) : 画填充矩形
5° drawImage(image img, int x, int y, int width, int heght, ImageObserver observer) : 画图片
6° setFont(Font font) : 设置画笔的字体
7° drawString(String str, int x, int y) : 画字符串
一、坐标体系
1.像素 :
在一个由数字序列表示的图像中的一个最小单位,称为像素。计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。
eg : 某一个计算机显示器的分辨率是1440 * 900,表示该显示器每一行由1440个像素构成,共900行;或者说每一列由900个像素构成,共1440列。而整个显示器屏幕共有1440 * 900 = 1296000个像素。
注意 : 像素不是一个长度单位,因此直接比较像素没有意义;像素只是一个相对的表示图像的最小单位,如果该显示器是确定的,那么像素更像是一个密度单位。
2.坐标系 :
在java的坐标系中,像素为基本单位。坐标原点位于坐标系的左上角,向右水平延伸是x轴,代表水平方向;垂直x轴向下延伸即是y轴,代表竖直方向。如下图所示 :
其中,(x, y)表示水平方法x个像素,竖直方向y个像素。
二、绘图
1.机制 :
画框——定义一个测试类去继承JFrame类,该测试类相当于一个画框。
画板——定义一个类去继承JPanel类;该类的一个实例化就是一个画板。
画笔——paint方法中的形参(Graphics g)就是一个画🖊。(Graphics类中提供了大量绘图的方法。)paint方法中要存放绘图信息(即画什么)。
2.实例 :
以PaintOval类为演示类,画一个椭圆,代码如下 :
packagecsdn.advanced.draw; importjavax.swing.*; importjava.awt.*; publicclassPaintOvalextendsJFrame { publicstaticvoidmain(String[] args) { newPaintOval(); //实例化画框即可作画。 } //1.定义画板(显式初始化为null)privateSketchpadsketchpad=null; publicPaintOval() { //2.初始化画板sketchpad=newSketchpad(); //3.将画板嵌入画框this.add(sketchpad); //4.设置画板的大小(绘图区域)this.setSize(750, 500); this.setVisible(true); //true表示可见//5.设置点击“x”按钮即可退出程序this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } classSketchpadextendsJPanel { publicvoidpaint(Graphicsg) { super.paint(g); //注意 : 一定要使用带参数的父类的paint方法。//画一个特殊的椭圆(圆形)g.drawOval(200, 200, 400, 200); /*drawOval方法的四个形参:1° x : 起笔处的x坐标2° y : 起笔处的y坐标3° width : 所要画的椭圆的宽度4° height : 所要画的椭圆的高度*/ } }
运行结果 :
3.原理 :
Component类提供了两个与绘图相关的最重要的方法——
1°paint(Graphics g) : 绘制组件的外观;
2°repaint() : 刷新组件的外观;
PS : paint方法会在以下情况被调用——
1° 当组件第一次在屏幕上显示时,程序会自动地调用paint方法来绘制组件;
2° 当窗口改变大小时,同上;
3° 当窗口被最小化,又重新显示时,同上;
4° 当repaint方法被调用时,同上;
4.常用绘图方法 :
1° setColor(Color c) : 设置画笔颜色
eg : (在上文PaintOval类代码的基础上更改),代码如下 :
packagecsdn.advanced.draw; importjavax.swing.*; importjava.awt.*; publicclassPaintOvalextendsJFrame { publicstaticvoidmain(String[] args) { newPaintOval(); } privateSketchpadsketchpad=null; publicPaintOval() { sketchpad=newSketchpad(); this.add(sketchpad); this.setSize(750, 500); this.setVisible(true); //true表示可见this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } classSketchpadextendsJPanel { publicvoidpaint(Graphicsg) { super.paint(g); g.setColor(Color.CYAN); g.drawOval(200, 200, 400, 200); g.setColor(Color.cyan); g.drawOval(50, 50, 200, 200); } }
运行效果 :
2° drawLine(int x1, int y1, int x2, int y2) : 画直线
其中,(x1, y1)代表起笔处;(x2, y2)代表收笔处。
eg :代码如下 :
packagecsdn.advanced.draw; importjavax.swing.*; importjava.awt.*; publicclassPaintOvalextendsJFrame { publicstaticvoidmain(String[] args) { newPaintOval(); } privateSketchpadsketchpad=null; publicPaintOval() { sketchpad=newSketchpad(); this.add(sketchpad); this.setSize(750, 500); this.setVisible(true); //true表示可见this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } classSketchpadextendsJPanel { publicvoidpaint(Graphicsg) { super.paint(g); g.setColor(Color.pink); g.drawLine(100, 300, 500, 300); g.setColor(Color.cyan); g.drawLine(100, 150, 300, 150); } }
运行效果 :
3° drawRect(int x, int y, int width, int height) : 画矩形边框
其中,(x, y)代表起笔处;width代表矩形的宽度;height代表矩形的高度。
eg :代码如下 :
packagecsdn.advanced.draw; importjavax.swing.*; importjava.awt.*; publicclassPaintOvalextendsJFrame { publicstaticvoidmain(String[] args) { newPaintOval(); } privateSketchpadsketchpad=null; publicPaintOval() { sketchpad=newSketchpad(); this.add(sketchpad); this.setSize(750, 500); this.setVisible(true); //true表示可见this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } classSketchpadextendsJPanel { publicvoidpaint(Graphicsg) { super.paint(g); g.setColor(Color.pink); g.drawRect(50, 200, 500, 200); g.setColor(Color.cyan); g.drawRect(100, 100, 350, 150); } }
运行效果 :
4° fillRect(int x, int y, int width, int height) : 画填充矩形
其中,(x, y)代表起笔处;width代表矩形的宽度;height代表矩形的高度。
eg :代码如下 :
packagecsdn.advanced.draw; importjavax.swing.*; importjava.awt.*; publicclassPaintOvalextendsJFrame { publicstaticvoidmain(String[] args) { newPaintOval(); } privateSketchpadsketchpad=null; publicPaintOval() { sketchpad=newSketchpad(); this.add(sketchpad); this.setSize(750, 500); this.setVisible(true); //true表示可见this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } classSketchpadextendsJPanel { publicvoidpaint(Graphicsg) { super.paint(g); g.setColor(Color.pink); g.fillRect(100, 200, 500, 200); g.setColor(Color.cyan); g.fillRect(100, 100, 350, 50); } }
运行效果 :
5° drawImage(image img, int x, int y, int width, int heght, ImageObserver observer) : 画图片
其中,img表示图片对象(固定格式),(x, y)仍然代表起笔处,width代表图片的宽度,height代表图片的高度,最后要传入一个this。
eg :代码如下 :
packagecsdn.advanced.draw; importjavax.swing.*; importjavax.tools.Tool; importjava.awt.*; publicclassPaintOvalextendsJFrame { publicstaticvoidmain(String[] args) { newPaintOval(); } privateSketchpadsketchpad=null; publicPaintOval() { sketchpad=newSketchpad(); this.add(sketchpad); this.setSize(750, 500); this.setVisible(true); //true表示可见this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } classSketchpadextendsJPanel { publicvoidpaint(Graphicsg) { super.paint(g); /*这里的文件需要传入的是路径。*/Imageimage=Toolkit.getDefaultToolkit().getImage("C:\\Users\\Five\\Desktop\\ty.jpg"); g.drawImage(image, 50, 50 , 300, 350, this); } }
运行效果 :
6° setFont(Font font) : 设置画笔的字体
其中,可以更改字体的字体样式,字体粗细,字号等属性。
7° drawString(String str, int x, int y) : 画字符串
其中,(x, y)代表的是字符串左下角的坐标(注意)。
eg :代码如下 :
packagecsdn.advanced.draw; importjavax.swing.*; importjava.awt.*; publicclassPaintOvalextendsJFrame { publicstaticvoidmain(String[] args) { newPaintOval(); } privateSketchpadsketchpad=null; publicPaintOval() { sketchpad=newSketchpad(); this.add(sketchpad); this.setSize(750, 500); this.setVisible(true); //true表示可见this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } classSketchpadextendsJPanel { publicvoidpaint(Graphicsg) { super.paint(g); g.setColor(Color.cyan); g.setFont(newFont("楷体", Font.BOLD, 50)); //BOLD表示加粗g.drawString("Cyan_RA9", 100, 233); } }
运行效果 :
三、事件处理机制
1. 概述 :
java的事件处理采用“委派事件模型”。——当事件发生时,产生该事件的对象,并把相关信息传递给“事件的监听者”处理。
其中,
①事件源,就是指用户的操作,可以是一个按钮,也可以是一个窗口,即产生事件的对象;
②事件,就是承载事件源状态改变时生成的事件对象,比如键盘事件,窗口事件,鼠标事件等等,该对象保存着当前事件的很多信息,比如KeyEvent对象含有当前被按下键的Code值。java.awt.event包和javax.swing.event包下定义了各种事件类型。
示意图如下 :
2.事件监听器接口 :
当事件源产生了一个事件,可以传送给事件监听器处理。此处的事件监听器——本质上就是一个实现了事件监听器接口的类。(eg : 画板类实现KeyListener接口)。
一个类可以实现多个事件监听器接口。事件监听器接口有很多种,对应监听不同的事件。