上次聊了一下事件监听机制,今天就来聊一下怎么实现一个画图程序并且实现重绘。
一.实现画图程序
1.实现一个画图程序所需的API类?
JFrame窗体容器组件类
JPanel 面板元素组件类
JButton按钮元素组件类
Dimension封装组件的宽度和高度的类
BoarderLayout 边框布局类
Graphics 画笔类:提供各种绘制图形的方法
Graphics2D 画笔类:Graphics子类,提供各种绘制图形更为复杂的控制。
Color颜色类:提供颜色
BasicStroke 接口Stroke的实现类,用于定义线条的特征
ActionListener 动作事件接口
ActionEvent存储动作事件的相关(事件源对象)信息
MouseListener 鼠标事件接口:提供处理按下,释放,点击,进入和离开动作
MouseMotionListener鼠标移动事件接口:提供处理移动和拖动动作的处理方法
MouseEvent存储鼠标事件的相关(事件源对象)信息
数组 是一个容器,用来存储同一类型的数据
2.那怎么写呢?
实现界面类
Public class ReDrawMain extends JPanel{
JFrame frame=new JFrame();
main(){}
initUI(){}
}
事件处理类
/**
* 1.定义DrawListener事件处理类,该类要实现ActionLIstener动作事件接口、
* MouseListener鼠标事件接口和MouseMotionListener鼠标移动事件接口,
*/
public class DrawListenerner implements ActionListener, MouseListener,
MouseMotionListener {}
3.一个画图程序需要实现的基本内容
目标1:点击窗体上的不同的按钮,获取到按钮上的文字信息。
事件监听机制
1.事件源对象:所有的按钮对象
2.事件监听方法:addActionListener(ActionListener l);
3.事件接口(事件处理类):ActionListener
实现步骤:
1.定义DrawListener事件处理类,该类要实现ActionLIstener动作事件接口,重写接口中的所有抽象方法。
2.在重写的事件处理方法中,获取按钮上的信息。
3.在ReDrawMain类的initUI方法中,实例化DrawListener事件处理类的对象,命名为dl。
4.将事件源按钮对象通过addActionListener()监听方法和事件处理类dl对象绑定。
目标2:在窗体上按下鼠标按键,然后释放鼠标按键,在按下和释放的两点之间绘制图形
事件监听机制
1.事件源对象:面板对象
2.事件监听方法:addMouseListener(MouseListener l);
3.事件接口(事件处理类):MouseListener
实现步骤:
1.定义DrawListener事件处理类,该类要实现MouseListener鼠标事件接口,重写接口中的所有抽象方法。
2.在重写的按下动作和释放动作的事件处理方法中,在按下方法中获取按下坐标值,在释放方法中获取释放的坐标值;之后根据按下和释放的坐标值,以及图形和颜色,使用Graphics来绘制对应的图形。
3.在ReDrawMain类的initUI方法中,实例化DrawListener事件处理类的对象,命名为dl。
4.将事件源窗体对象通过addMouseListener()监听方法和事件处理类dl对象绑定。
目标3:在窗体上按下鼠标按键,然后拖动鼠标,在按下和拖动之间绘制曲线
事件监听机制
1.事件源对象:面板对象
2.事件监听方法:addMouseMotionListener(MouseMotionListener l);
3.事件接口(事件处理类):MouseMotionListener
二.重绘
1.实现画图程序后,问题出现了 ≥﹏≤
我们会发现画图界面上绘制的图形,当我们放大或者最小化窗体,所有的图形都将消失。
2.所以呢,我们必须知道重绘的原理 (ง ˙o˙)ว
所有的组件都是绘制出来的,那么组件就有一个绘制(paint)的方法;当你改变窗体的大小时,会自动的去调用paint方法,将组件再画一次。
当改变窗体大小后,如果想要图形不消失,必须要将图形放在paint方法中进行绘制。
3.敲黑板啦,那怎么实现我们绘制的图形重绘? ⁽⁾◟(๑•́ ₃ •̀๑)◞⁽⁾
要让图形在面板的paint方法中,再画一次。
定义图形类,用来存储图形的四个坐标、颜色、画笔大小...
需要使用数组来存储图形数据,数组的数据类型就为图形类。
数组能存储的元素个数是固定的,数组的大小就只能定义一个足够大的。
三.实现一个有直线、填充矩形、填充圆、圆角矩形、3D矩形、文字、任意多边形、五角星、
铅笔、刷子、橡皮、喷枪、吸管以及可以选择画笔颜色的画图程序,并且实现重绘。
代码如下:
package SummerCamp6;
/**
*界面类:实现一个有直线、填充矩形、填充圆、圆角矩形、3D矩形、文字、任意多边形、
* 五角星、铅笔、刷子、橡皮、喷枪、吸管以及可以选择画笔颜色的画图程序,并且实现重绘。
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ReDrawMain extends JPanel {
JFrame frame=new JFrame();
public static void main(String[] args) {
new ReDrawMain().initUI();
}
private Shape[] shapeArray = new Shape[10000];
/**
* 初始化界面的方法
*/
public void initUI() {
frame.setTitle("依米的画图板");
frame.setDefaultCloseOperation(3);
frame.setSize(1000, 700);
frame.setLocationRelativeTo(null);
DrawListenerner dl = new DrawListenerner(this, shapeArray);
JPanel panel1 = new JPanel(); // 北边面板(存放铅笔,喷枪等工具按钮)
panel1.setPreferredSize(new Dimension(120, 50));
panel1.setBackground(Color.gray);
frame.add(panel1, BorderLayout.NORTH);
String[] str1 = { "铅笔", "刷子", "喷枪", "吸管", "橡皮" };
for (int i = 0; i < str1.length; i++) {
JButton button_1 = new JButton(str1[i]);
panel1.add(button_1);
button_1.setPreferredSize(new Dimension(110, 30));
button_1.addActionListener(dl);
}
JPanel panel2 = new JPanel(); // 西边面板(存放图形按钮)
panel2.setPreferredSize(new Dimension(130, 800));
panel2.setBackground(Color.gray);
frame.add(panel2, BorderLayout.WEST);
String[] str2 = { "直线", "填充圆", "文字", "图片", "圆角矩形", "填充矩形", "3d矩形", "五角星",
"任意多边形" };
for (int i = 0; i < str2.length; i++) {
JButton button_2 = new JButton(str2[i]);
panel2.add(button_2);
button_2.setPreferredSize(new Dimension(120, 30));
button_2.addActionListener(dl);
}
JPanel panel3 = new JPanel(); // 东边面板(存放颜色按钮)
panel3.setPreferredSize(new Dimension(130, 800));
panel3.setBackground(Color.gray);
frame.add(panel3, BorderLayout.EAST);
// 定义Color数组,用来存储按钮上要显示的颜色信息
Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,
Color.lightGray, Color.ORANGE, Color.PINK,
new Color(123, 100, 132) };
// 循环遍历colorArray数组,根据数组中的元素来实例化按钮对象
for (int i = 0; i < colorArray.length; i++) {
JButton button = new JButton();
button.setBackground(colorArray[i]);
button.setPreferredSize(new Dimension(50, 50));
// 4.将事件源按钮对象通过addActionListener()监听方法和事件处理类dl对象绑定。
button.addActionListener(dl);
panel3.add(button);
}
frame.add(this, BorderLayout.CENTER);
frame.setBackground(this.getBackground());
frame.setVisible(true);// 可见必须在gr之前,否则看不到画笔
Graphics gr = this.getGraphics();// 从窗体上获取画笔对象
this.addMouseListener(dl);
this.addMouseMotionListener(dl);
dl.setG(gr);
}
// 声明图形对象数组,数组的能存储的元素个数是10000个图形
/**
* 重写组件的paint方法
*/
public void paint(Graphics gr) {
super.paint(gr);//调用父类的paint()
// 循环遍历shapeArray数组
for (int i = 0; i < shapeArray.length; i++) {
Shape shape = shapeArray[i];// 从数组中获取Shape对象
if(shape!=null)//shape是否不为空,如果不为空则调用画图形的方法
shape.draw((Graphics2D)gr);//调用绘制图形的方法
}
}
}
/**
* 1.定义DrawListener事件处理类,该类要实现ActionLIstener动作事件接口、
* MouseListener鼠标事件接口和MouseMotionListener鼠标移动事件接口,
*/
package SummerCamp6;
import java.awt.AWTException;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JPanel;
public class DrawListenerner implements ActionListener, MouseListener,
MouseMotionListener {
private String type = "铅笔";// 声明图形属性,用来存储用户选择的图形
private Color color = Color.black;// 声明颜色属性,用来存储用户选择的颜色
private Graphics g;// 声明Graphics画笔类的对象名属性
private int t1, t2, t3, t4, count = 0;
private int x1, y1, x2, y2;// 坐标
private Shape shape;// 声明图形对象名
private Shape[] shapeArray;// 声明存储图形对象的数组对象名属性
private int number = 0;// 记录数器,用来记录已经存储的图形个数。
private JPanel panel4;
Random r = new Random();
public BasicStroke s1;// 画笔大小
BasicStroke s = new BasicStroke();
/**
* 1 构造方法
*
* @param g是从DrawMain类的窗体上传递过来的画笔对象
* @param shapeArray是从DrawMain类传递过来的存储图形的数组对象
*/
public DrawListenerner(JPanel panel4, Shape[] shapeArray) {
this.panel4 = panel4;
this.shapeArray = shapeArray;
}
public void setG(Graphics g) {
this.g = g;
}
/**
* 重写ActionListener接口中的actionPerformed抽象方法。
*/
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();// 获取事件源对象
String text = button.getText();// 获取按钮上的文字信息
if (text == null || text.equals("")) {// 判断是否点击的是颜色按钮
color = button.getBackground();// 获取按钮的背景颜色
System.out.println("color = " + color);
} else {
type = button.getText();// 获取按钮上的文字信息
System.out.println("text = " + text);
}
}
/**
* 当你在事件源对象上发生鼠标按键按下动作时执行此方法
*/
public void mousePressed(MouseEvent e) {
// 2.在重写的按下动作和释放动作的事件处理方法中,在按下方法中获取按下坐标值
x1 = e.getX();
y1 = e.getY();
// //设置画笔的颜色
// g.setColor(color);
if (type.equals("吸管")) {
try {
x1 = e.getXOnScreen();
y1 = e.getYOnScreen();
// 创建一个机器人对象
Robot jiqiren = new Robot();
// 2.构造一个矩形区域,这个区域就是你要获取颜色的区域
Rectangle rec = new Rectangle(x1, y1, 1, 1);
BufferedImage ima = jiqiren.createScreenCapture(rec);
// 3.获取图片的背景像素点颜色:三原色red blue green,获取图片指定像素点颜色
int a = ima.getRGB(0, 0);
color = new Color(a);
// 4.把颜色设置到画笔上
} catch (AWTException e2) {
e2.printStackTrace();
}
}
}
/**
* 当你在事件源对象上发生鼠标按键释放动作时执行此方法
*/
public void mouseReleased(MouseEvent e) {
// 2.在重写的按下动作和释放动作的事件处理方法中,在释放方法中获取释放的坐标值;
x2 = e.getX();
y2 = e.getY();
// 2.之后根据按下和释放的坐标值,以及图形和颜色,使用Graphics来绘制对应的图形。
if (type.equals("直线")) {
// // System.out.println(">>>>>" + g);
// g.drawLine(x1, y1, x2, y2);// 调用绘制直线的方法
// 根据数据来实例化图形对象
shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(1));
// 调用图形的绘图方法
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
} else if (type.equals("任意多边形")) {
if (count == 0) {
shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(1));
// 调用图形的绘图方法
shape.draw((Graphics2D) g);
count++;
t1 = x1;
t2 = y1;
}
else if (count != 0) {
shape = new ShapeLine(t3, t4, x2, y2, color, new BasicStroke(1));// 点击鼠标该点与前一个点相连
// 调用图形的绘图方法
shape.draw((Graphics2D) g);
if (e.getClickCount() == 2) {// 双击鼠标则闭合线段,该最新的点与最早的点相连接,闭合图形
shape = new ShapeLine(t1, t2, x2, y2, color, new BasicStroke(1));
shape.draw((Graphics2D) g);
count = 0;
}
// 记录目前该点的位置
}
t3 = x2;
t4 = y2;
if (number < shapeArray.length) {
shapeArray[number++] = shape;
}
} else if (type.equals("圆角矩形")) {
shape = new ShapeRoundRect(Math.min(x1, x2), Math.min(y1, y2),
Math.abs(x1 - x2), Math.abs(y1 - y2), color,
new BasicStroke(), 30, 30);
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
} else if (type.equals("填充圆")) {
shape = new ShapeCircle(x1, y1, x2, y2, color, s);
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
} else if (type.equals("五角星")) {
shape = new ShapeStar(x1, y1, x2, y2, color, s);
shape.draw((Graphics2D) g);
System.out.println(">>>>>>>>>"+x1+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+y1);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
}
}
/**
* 当鼠标在窗体上按下按键并且拖动时执行此方法
*/
public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
Graphics2D g2d = (Graphics2D) g;
if (type.equals("铅笔")) {
// 根据数据来实例化图形对象
shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(1));
// 调用图形的绘图方法
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
x1 = x2;
y1 = y2;
} else if (type.equals("刷子")) {
// 根据数据来实例化图形对象
shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(10));
// 调用图形的绘图方法
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
x1 = x2;
y1 = y2;
} else if (type.equals("喷枪")) {
g2d.setColor(color);
shape = new ShapeGum(x1, y1, x2, y2, color, s);
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
x1 = x2;
y1 = y2;
} else if (type.equals("橡皮")) {
shape = new ShapeEraser(x1, y1, x2, y2, color, s);
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
x1 = x2;
y1 = y2;
} else if (type.equals("图片")) {
shape = new ShapeImage(color, x1, y1, x2, y2);
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
} else if (type.equals("填充矩形")) {
shape = new ShapeFillRect(Math.min(x1, x2), Math.min(y1, y2),
Math.abs(x1 - x2), Math.abs(y1 - y2), color,
new BasicStroke(1));
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
} else if (type.equals("文字")) {
shape = new ShapeString(x1, y1, x2, y2, color, s);
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
} else if (type.equals("3d矩形")) {// 7.3d矩形
shape = new Shape3DRect(x1, y1, x2, y2, color, s);
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 将图形对象存入到数组中
shapeArray[number++] = shape;
}
}
}
/**
* 当鼠标在窗体上移动鼠标时执行此方法
*/
public void mouseMoved(MouseEvent e) {
}
/**
* 当你在事件源对象上发生鼠标点击(按下和释放的动作必须在同一个位置上)动作时执行此方法
*/
public void mouseClicked(MouseEvent e) {
}
/**
* 当你的鼠标光标进入事件源对象上时执行此方法
*/
public void mouseEntered(MouseEvent e) {
}
/**
* 当你的鼠标光标离开事件源对象上时执行此方法
*/
public void mouseExited(MouseEvent e) {
}
}
package SummerCamp6;
/**
* 定义Shape抽象类
*/
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
public abstract class Shape {
private int x1, y1, x2, y2;
private Color color;
private BasicStroke stroke;
public Shape(int x1, int y1, int x2, int y2, Color color, BasicStroke stroke) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.color = color;
this.stroke = stroke;
}
/**
* 绘制图形的方法
*
* @param g画笔对象
*/
public abstract void draw(Graphics2D g);
public int getX1() {
return x1;
}
public void setX1(int x1) {
this.x1 = x1;
}
public int getY1() {
return y1;
}
public void setY1(int y1) {
this.y1 = y1;
}
public int getX2() {
return x2;
}
public void setX2(int x2) {
this.x2 = x2;
}
public int getY2() {
return y2;
}
public void setY2(int y2) {
this.y2 = y2;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public BasicStroke getStroke() {
return stroke;
}
public void setStroke(BasicStroke stroke) {
this.stroke = stroke;
}
}
//3d矩形类
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
public class Shape3DRect extends Shape{
public Shape3DRect(int x1, int y1, int x2,int y2, Color color, BasicStroke s) {
super(x1, y1, x2, y2, color,s);
}
public void draw(Graphics2D g){
g.setStroke(g.getStroke());
g.setColor(getColor());// 设置画笔颜色
g.fill3DRect(getX1(), getY1(), getX2() - getX1(), getY2() - getY1(), true);
}
}
//填充圆类
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
public class ShapeCircle extends Shape {
public ShapeCircle(int x1, int y1, int x2, int y2, Color color,
BasicStroke s) {
super(x1, y1, x2, y2, color, s);
}
public void draw(Graphics2D g) {
g.setStroke(g.getStroke());// 画笔大小
g.setColor(getColor());// 设置画笔颜色
g.fillOval(getX1(), getY1(), getX2() - getX1(), getY2() - getY1());// 绘制圆的方法
}
}
//橡皮类
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import javax.swing.JFrame;
public class ShapeEraser extends Shape{
public ShapeEraser(int x1, int y1, int x2, int y2, Color color, BasicStroke s) {
super(x1, y1, x2, y2,color,s);
}
public void draw(Graphics2D g){
g.setStroke(new BasicStroke(20));// 橡皮大小
JFrame frame = new JFrame();
g.setColor(frame.getBackground());
g.drawLine(getX1(),getY1(),getX2(),getY2());
}
}
//填充矩形类
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
/**
* 定义ShapeRect类,该类是用来绘制矩形的类
*/
public class ShapeFillRect extends Shape {
public ShapeFillRect(int x1, int y1, int x2, int y2, Color color,
BasicStroke s) {
super(x1, y1, x2, y2, color, s);
}
/**
* 绘制图形的方法
*
* @param g画笔对象
*/
public void draw(Graphics2D g) {
g.setStroke(getStroke());// 设置画笔的粗细
g.setColor(getColor());// 设置画笔的颜色
g.fillRect(getX1(), getY1(), getX2(), getY2());// 绘制矩形
}
}
//喷枪类
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Random;
public class ShapeGum extends Shape{
Random r = new Random();
public ShapeGum(int x1, int y1, int x2, int y2,Color color,BasicStroke stroke) {
super(x1, y1, x2, y2, color, stroke);
}
public void draw(Graphics2D g){
g.setStroke(new BasicStroke(1));
g.setColor(g.getColor());
g.drawLine(getX2(),getY2 (),getX2(),getY2());
for (int i = 0; i < 10; i++) {
int p = r.nextInt(10);
int q = r.nextInt(10); // 可以生成一个介于0(包含)到n(不包含)之间的整数
// nextInt(10)生成的就是0~10之间的随机数,包含0和10
g.drawLine(getX2() + p, getY2() + q, getX2() + p, getY2() + q);
}
}
}
//图片类
package SummerCamp6;
import java.awt.Color;
import java.awt.Graphics2D;
import javax.swing.ImageIcon;
public class ShapeImage extends Shape{
public ShapeImage(Color color, int x1, int y1, int x2, int y2) {
super(x1, y1, x2, y2, null,null);
}
public void draw(Graphics2D g){
ImageIcon im = new ImageIcon("C:\\Users\\某某\\Desktop\\路线\\1.jpg");// 画出图片
g.drawImage(im.getImage(), getX1(), getY1(), getX2() - getX1(), getY2() - getY1(), null);// 释放鼠标画出图片
}
}
/**
* 定义ShapeLine类,该类是用来绘制直线的类
*/
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
public class ShapeLine extends Shape {
public ShapeLine(int x1, int y1, int x2, int y2, Color color,
BasicStroke stroke) {
super(x1, y1, x2, y2, color, stroke);
}
/**
* 绘制图形的方法
*
* @param g画笔对象
*/
public void draw(Graphics2D g) {
g.setStroke(getStroke());// 设置画笔的粗细
g.setColor(getColor());// 设置画笔的颜色
g.drawLine(getX1(), getY1(), getX2(), getY2());// 绘制直线
}
}
/**
* 定义ShapeRoundRect类,该类是用来绘制圆角矩形的类
*/
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
/**
* 定义ShapeRoundRect类,该类是用来绘制圆角矩形的类
*/
public class ShapeRoundRect extends Shape {
private int arcH, arcW;
public ShapeRoundRect(int x1, int y1, int x2, int y2, Color color,
BasicStroke s, int arcH, int arcW) {
super(x1, y1, x2, y2, color, s);
this.arcH = arcH;
this.arcW = arcW;
}
/**
* 绘制图形的方法
*
* @param g画笔对象
*/
public void draw(Graphics2D g) {
g.setStroke(getStroke());// 设置画笔的粗细
g.setColor(getColor());// 设置画笔的颜色
g.drawRoundRect(getX1(), getY1(), getX2(), getY2(), arcW, arcH);// 绘制矩形
}
}
//五角星类
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
public class ShapeStar extends Shape {
private int x,y;
private int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, b1, b2, b3, b4, b5,
b6, b7, b8, b9, b10;
public ShapeStar(int x1, int y1, int x2, int y2, Color color, BasicStroke s) {
super(x1, y1, x2, y2,color,s);
}
public void draw(Graphics2D g){
g.setStroke(new BasicStroke());// 画笔大小
g.setColor(getColor());//设置画笔颜色
x = (Math.abs(getX2()-getX1())) / 8;
y = (Math.abs(getY2()-getY1())) / 8;
a1 = getX1() + 4 * x;
b1 = getY1() + y;
a2 = getX1();
b2 = getY1() + 3 * y;
a3 = getX1() + 8 * x * 2 / 6;
b3 = getY1() + 3 * y;
a4 = getX1() + 8 * x * 4 / 6;
b4 = getY1() + 3 * y;
a5 = getX2();
b5 = getY1()+ 3 * y;
a6 = getX1() + 4 * x / 2;
b6 = getY1() + 4 * y;
a7 = getX1() + 6 * x;
b7 = getY1() + 4 * y;
a8 = getX1() + 4 * x;
b8 = getY1() + 8 * y * 2 / 3;
a9 = getX1();
b9 = getY2();
a10 = getX2();
b10 = getY2();
g.drawLine(a1, b1, a3, b3);
g.drawLine(a1, b1, a4, b4);
g.drawLine(a2, b2, a3, b3);
g.drawLine(a2, b2, a6, b6);
// g.drawLine(a3, b3, a4, b4);
// g.drawLine(a3, b3, a6, b6);
g.drawLine(a4, b4, a5, b5);
// g.drawLine(a4, b4, a7, b7);
g.drawLine(a5, b5, a7, b7);
// g.drawLine(a6, b6, a8, b8);
g.drawLine(a6, b6, a9, b9);
g.drawLine(a7, b7, a10, b10);
// g.drawLine(a7, b7, a8, b8);
g.drawLine(a8, b8, a10, b10);
g.drawLine(a8, b8, a9, b9);
}
}
//文字类
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
public class ShapeString extends Shape{
private String str="弹个吉他";
public ShapeString(int x1, int y1, int x2, int y2, Color color, BasicStroke s) {
super(x1, y1, x2, y2,color,s);
}
public void draw(Graphics2D g){
g.setStroke(new BasicStroke());// 画笔大小
g.setColor(getColor());//设置画笔颜色
g.drawString(str, getX1(), getY1());// 5.文字
}
}
实现效果:
开始画图,后台显示按键
令画图板最大化,图形没有消失
代码段中夹有注释,非常生动形象,所以我就不一一再写出来解释了哈。
最后我们就把一个功能完好的画图板完成了,是不是很简单丫,有没有心动的感觉,想不想写一个丫,赶快动手吧少年。
我get到的实现画图板和重绘(用数组保存图形)的技能就差不多是这些了,如果以后又get到一些进阶技能我会在技术博客更新的哈,么么哒。