packagecom.siwuxie095.swingpaint;
importjava.awt.BasicStroke;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.RenderingHints;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjavax.imageio.ImageIO;
importjavax.swing.JPanel;
//使用Java 2D完成界面的绘图优化
//MyPanel继承自JPanel
public classMyPanel extendsJPanel {
//创建一个BufferedImage
BufferedImage image=null;
publicMyPanel() {
try{
//使用ImageIO.read()读取图像,传入URL
//可以是本地图像,也可以是网络图像
//这里读取本地图像,因为使用的是getClass().getResource()
//所以img.png必须和调用的类MyPanel在同一个包中
//有异常抛出,使用try catch捕获
image=ImageIO.read(getClass().getResource("img.png"));
} catch(IOException e) {
e.printStackTrace();
}
}
//覆盖JPanel的paintComponent()方法,
//右键->Source->Override/Implement Methods->JComponent
//对于每一个组件来说,paintComponent()方法是绘制组件本身
//传入Graphics,通过它在界面绘制图像
@Override
protectedvoidpaintComponent(Graphics g) {
//注释掉默认的从父类继承的绘图方法
//super.paintComponent(g);
//如果不使用Java 2D,使用普通的绘图API,
//则绘制的图像有很明显的锯齿
//创建一个Graphics2D对象:g2d,需要强转
//g2d支持的属性和方法更多
Graphics2D g2d=(Graphics2D) g;
//图像渲染的提示,提示值代表了当前的绘图是否支持锯齿消除
//传入键值对,为Graphics2D添加抗锯齿
//(通过类调用静态值)
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Graphics2D完全兼容Graphics的一些方法,包括draw和fill方法
//draw方法绘制的都是线框、轮廓(空心),而fill方法绘制的是填充的图像(实心)
//对于一般的draw方法,都会有对应的fill方法(空心对实心)
//Graphics2D的setClip()方法
//需要指定X Y坐标,宽度,高度
//指定绘制图像的区域,超出就不会被绘制
g2d.setClip(0, 0, 500, 500);
//先使用setColor()为当前的绘图指定颜色
//使用匿名对象,创建一个新的Color对象
//每一个rgb的值最大为255,最小为0
//可以为不同的形状填充不同的颜色
g2d.setColor(newColor(255,0,0));//红色
//绘制方块,需要指定X Y坐标,宽度,高度
// 0 0即从左上角开始绘制
g2d.drawRect(0, 0, 100, 100);
//也可以使用静态方法通过类调用
g2d.setColor(Color.GREEN);
//绘制圆形、椭圆形,需要指定X Y坐标,宽度,高度
//如果宽高一致,绘制的就是圆形
g2d.drawOval(0, 0, 100, 100);//圆形
g2d.setColor(Color.BLUE);
g2d.drawOval(0, 25, 100, 50);//椭圆形
g2d.setColor(Color.ORANGE);
//填充方块,需要指定X Y坐标,宽度,高度
g2d.fillRect(100, 100, 100, 100);
//填充带圆角效果的方块,需要指定X Y坐标,宽度,高度,圆角的弧宽,圆角的弧高
//一般情况下,将圆角的弧宽,圆角的弧高,两个弧度值设置成相等
//弧宽越大,则X方向上圆角越长,弧高越大,则Y方向上圆角越长
//弧宽与弧高指定了X Y方向上圆角的大小
g2d.fillRoundRect(200, 0, 100, 100, 10, 10);
g2d.fillRoundRect(300, 100, 100, 100, 200, 50);
//绘制String,需要指定X Y坐标
//绘制Bytes Chars同String
//设置颜色与字体
g2d.setColor(Color.YELLOW);
g2d.setFont(newFont("Arial", Font.BOLD, 20));
g2d.drawString("TestAPI", 110, 50);
g2d.setColor(Color.CYAN);
//绘制弧线需要指定x y坐标,宽度,高度,起始角度,弧线延长的角度
//绘制时按照逆时针绘制弧线
//
//先画一个矩形,然后以这个矩形的中心为所要画的弧的中心,
//以水平向右为0度,逆时针为正方向
g2d.drawArc(0, 200, 100, 100, 270, 90);
g2d.fillArc(0, 200, 100, 100, 0, 270);
g2d.fillArc(100, 200, 100, 200, 0, 90);
g2d.drawArc(100, 200, 100, 200, 90, 90);
g2d.fillArc(200, 200, 100, 200, 30, 120);
//绘制图像,选择传参最少的方法
//需要指定:图像对象image,X Y坐标,observer(可指定为空)
//对于image可以在构造函数MyPanel()中加载图像
if(image!=null) {
g2d.drawImage(image, 0, 100, null);
//绘制图像时可以指定图像的大小
}
//绘制线段时,线段可以指定粗细等属性
//第一个参数是线段的粗细,
//第二个参数CAP表示线段头部的形状(圆/方等)
//第三个参数JOIN表示线段曲折的地方的形状(尖/圆等)
g2d.setStroke(newBasicStroke(5,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_ROUND));
g2d.setColor(newColor(0,0,0));
//绘制直线需要指定两组X Y坐标
g2d.drawLine(205, 105, 300, 200);
//绘制多边形,传入一组X坐标,一组Y坐标,和坐标数目
g2d.fillPolygon(newint[]{350,300,333,366,400}, newint[]{0,50,100,100,50}, 5);
g2d.drawPolygon(newint[]{350,300,333,366,400}, newint[]{200,250,300,300,250}, 5);
}
}