外观
绘图
简单的绘图操作可以使用Graphics类完成,但是若想对图片进行调整,或调整画笔粗细等其他操作就需要使用Graphics2D类。
Graphics2D是推荐使用的绘图类,但是程序设计中的绘图对象都是Graphics类的对象,这时应使用强制转换。
使用Java绘图的步骤,第一步先创建窗体,第二步创建画布,Canvas,第三步使用Graphics对象或者创建Graphics2D对象,第四步使用绘图方法。
绘图的第一要素就是创建画布,Canvas类提供了两个绘图方法,paint(),repaint(),第一个是初次绘图调用的方法,第二个是对图片做修改使用的方法。
Graphics2D特有许多方法,最大特点是draw(),和fill()方法,分别可以绘空心图形和实心图形。
我们在绘图时,不要使用new创建画布,最好自定义一个画布类,继承画布类,然后重写绘图方法,把所有的绘图方法放到自定义画布类,最后在容器里添加此画布即可。
先介绍Graphics类。它提供了如下一些绘图方法:
drawArc(int x, int y, int width, int height, int startAngle, int arcAngle):画弧,前两个参数是坐标,第三个第四个参数是大小,第三个参数是开始角度,第四个参数是总共画的角度。drawLine(int x1, int y1, int x2, int y2):画直线,参数分别是起始位置横纵坐标和终点位置横纵坐标。drawOval(int x, int y, int width, int height):画椭圆,前两个参数是坐标,后两个参数是大小。drawRect(int x, int y, int width, int height):画矩形,前两个参数是坐标,后两个参数是大小。drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight):画圆角矩形,前两个参数是坐标,中间两个参数是大小,最后两个参数是角的角度。drawPolygon(int xPoints[], int yPoints[], int nPoints):画多边形,第一个参数是横坐标数组,第二个参数是纵坐标数组,第三个参数是多边形的顶点数。fillArc(int x, int y, int width, int height, int startAngle, int arcAngle):画实心弧,前两个参数是坐标,第三个第四个参数是大小,第三个参数是开始角度,第四个参数是总共画的角度,所以这里应是画到270度。drawPolyline(int xPoints[], int yPoints[], int nPoints):画多直线,第一个参数是顶点横坐标数组,第二个参数是顶点纵坐标数组,第三个参数是定点数。fillOval(int x, int y, int width, int height):画实心椭圆,前两个参数是坐标,后两个参数是大小。fillRect(int x, int y, int width, int height):画实心矩形,前两个参数是坐标,后两个参数是大小。fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)画实心圆角矩形,前两个参数是坐标,中间两个参数是大小,最后两个参数是角的角度。fillPolygon(int xPoints[], int yPoints[], int nPoints):画实心多边形,第一个参数是横坐标数组,第二个参数是纵坐标数组,第三个参数是多边形的顶点数。
示例代码如下:
package JavaDraw;
import javax.swing.*;
import java.awt.*;
public class DemoGraphics2D extends JFrame {
//简单的绘图操作可以使用Graphics类完成 但是若想对图片进行调整 或调整画笔粗细等其他操作就需要使用Graphics2D类
//Graphics2D是推荐使用的绘图类 但是程序设计中的绘图对象都是Graphics类的对象 这时应使用强制转换
//使用Java绘图的步骤 第一步先创建窗体 第二步创建画布 Canvas 第三步使用Graphics对象或者创建Graphics2D对象 第四步使用绘图方法
//绘图的第一要素就是创建画布 Canvas类提供了两个绘图方法 paint() repaint() 第一个是初次绘图调用的方法 第二个是对图片做修改使用的方法
//Graphics2D特有许多方法 最大特点是draw() 和fill()方法 分别可以绘空心图形和实心图形
//我们在绘图时 不要使用new创建画布 最好自定义一个画布类 继承画布类 然后重写绘图方法 把所有的绘图方法放到自定义画布类 最后在容器里添加此画布即可
DemoGraphics2D() {
super("Java绘图");
setBounds(400, 300, 420, 200); //设置容器大小位置
add(new MyCanvas());
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new DemoGraphics2D();
}
private class MyCanvas extends Canvas { //自定义画布类 继承画布类
public void paint(Graphics g) { //这里重写paint()绘图方法
g.drawArc(10, 10, 40, 40, 90, 180);
//画弧 前两个参数是坐标 第三个第四个参数是大小 第三个参数是开始角度 第四个参数是总共画的角度 所以这里应是画到270度
g.drawLine(60, 10, 100, 50);
//画直线 参数分别是起始位置横纵坐标和终点位置横纵坐标
g.drawOval(110, 10, 60, 40);
//画椭圆 前两个参数是坐标 后两个参数是大小
g.drawRect(180, 10, 60, 40);
//画矩形 前两个参数是坐标 后两个参数是大小
g.drawRoundRect(250, 10, 60, 40, 10, 10);
//画圆角矩形 前两个参数是坐标 中间两个参数是大小 最后两个参数是角的角度
g.drawPolygon(new int[]{320, 390, 320, 390}, new int[]{10, 10, 60, 60}, 4);
//画多边形 第一个参数是横坐标数组 第二个参数是纵坐标数组 第三个参数是多边形的顶点数
g.fillArc(10, 80, 40, 40, 90, 180);
//画实心弧 前两个参数是坐标 第三个第四个参数是大小 第三个参数是开始角度 第四个参数是总共画的角度 所以这里应是画到270度
g.drawPolyline(new int[]{50, 90, 50, 90}, new int[]{80, 80, 140, 140}, 4);
//画多直线 第一个参数是顶点横坐标数组 第二个参数是顶点纵坐标数组 第三个参数是定点数
g.fillOval(110, 80, 60, 40);
//画实心椭圆 前两个参数是坐标 后两个参数是大小
g.fillRect(180, 80, 60, 40);
//画实心矩形 前两个参数是坐标 后两个参数是大小
g.fillRoundRect(250, 80, 60, 40, 10, 10);
//画实心圆角矩形 前两个参数是坐标 中间两个参数是大小 最后两个参数是角的角度
g.fillPolygon(new int[]{320, 390, 320, 390}, new int[]{80, 80, 140, 140}, 4);
}
}
}运行结果如下:

Graphics2D类继承自Graphics类,它添加了更多功能,在绘图时一般使用该类。它可以使用具体的图形类绘制不同的形状:
- Arcs2D。
- CubicCurve2D。
- Ellipse2D。
- Line2D。
- Point2D。
- QuadCurve2D。
- Rectangle2D。
- RoundRectangle2D。
实例化这些对象后,使用Graphics2D对象的draw(Shape s)或fill(Shape s)即可绘制这些图形。
设置画笔和颜色
画笔——Stroke类
默认情况下,Graphics类使用1像素宽的线条绘制图形,而Graphics2D可以通过更改画笔绘制更多形状的图形。
使用Graphics2D的setStroke(Stroke stroke)来更改画笔。其中Stroke参数代表实现了Stroke接口的画笔类。Java提供了一个最基本的BasicStroke画笔类,可以通过构造方法来初始化画笔的形状:
BasicStroke()。BasicStroke(float width)。BasicStroke(float width, int cap, int join)。BasicStroke(float width, int cap, int join, float miterlimit)。BasicStroke(float width, int cap, int join, float miterlimit, float[] dash, float dash_phase)。
参数说明如下:
- width:画笔宽度,必须大于等于0.0f。
- cap:线端点的装饰,有以下几个可选值:
- CAP_BUTT:无装饰,长度最短。
- CAP_ROUND:用半圆装饰端点。
- CAP_SQUARE:用正方形装饰端点,实际长度较CAP_BUTT要长一些。
- join:线段交点处的装饰,有以下几个可选值:
- JOIN_BEVEL:交点处会有一半角度的过渡。
- JOIN_MITER:交点处无过渡。
- JOIN_ROUND:交点处使用圆弧过渡。
- miterlimit:斜接处的剪裁限制,必须大于等于0.0f。
- dash:表示虚线模式的数组。
- dash_phase:开始虚线模式的偏移量。
示例代码在下方。
颜色——Color类
Color类支持任意颜色,不管该平台是否支持该颜色。Color类的构造方法如下:
Color(inr r, int g, int b)。Color(int rgb)。
参数说明如下:
- r:三原色中红色的取值。
- g:三原色中绿色的取值。
- b:三原色中蓝色的取值。
- rgb:红绿蓝三原色的总值,可用一个十六进制数字表示。
Color定义了一些色彩的常量,如Color.black代表黑色,Color.white代表白色。
绘图或Swing组件可以使用setColor(Color color)来设置颜色。
画笔和颜色的示例代码如下:
package JavaDraw;
import javax.swing.*;
import java.awt.*;
public class DemoColorAndStroke extends JFrame {
public DemoColorAndStroke() {
super("画笔和颜色程序");
setBounds(400, 300, 420, 200); //设置容器大小位置
add(new MyCanvas());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new DemoColorAndStroke();
}
private class MyCanvas extends Canvas { //自定义画布类 继承画布类
public void paint(Graphics g) { //这里重写paint()绘图方法
Graphics2D g2D = (Graphics2D) g; //将Graphics对象转换成Graphics2D对象以使用更强大的绘图方法
g2D.drawLine(10, 10, 390, 10); //第一个直线 没有修改 作对比
//颜色类有两个构造方法 三个参数的分别是三原色红黄蓝的取值 一个参数的是色彩对应的数字 也可使用常量初始化
Color color1 = new Color(125, 0, 0);
Color color2 = new Color(125000);
//这里使用常量初始化
Color color = Color.ORANGE;
//要先改变颜色再使用draw()方法
g2D.setColor(color);
g2D.drawLine(10, 30, 390, 30); //第二个直线 橘色
//Stroke类 画笔类 可以调整画笔的大小和粗细
//第一个参数是画笔粗细 单位是像素
//第二个参数是线条端的修饰 CAP_BUTT默认 不加修饰 CAP_ROUND 圆角线头 CAP_SQUARE 会在线条端加一个正方形 看起来仅仅加长了线条 效果不明显
//第三个参数是线条交汇处的修饰 JOIN_MITER交汇处是尖的 JOIN_ROUND交汇处是圆的 JOIN_BEVEL 交汇处是一半一半过度的
Stroke stroke = new BasicStroke(15, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
//使用setStroke()方法可以修改画笔
g2D.setStroke(stroke);
int[] x = {10, 390, 390, 10};
int[] y = {70, 70, 110, 110};
g2D.drawPolyline(x, y, 4); //第三个直线 橘色 线条宽度是15像素 线条端和线条交汇处是圆的
}
}
}运行结果如下:
