java画笔覆盖在界面_Java实现画图程序和重绘

本文介绍了如何使用Java实现一个画图程序并处理重绘问题。通过事件监听机制,实现了点击不同按钮绘制图形、鼠标按下拖动绘制曲线等功能。同时,针对界面缩放导致图形消失的问题,通过重绘原理和使用数组存储图形数据来确保图形在窗口调整大小后仍然可见。文章详细展示了代码实现,包括图形类、事件处理类和界面类的定义,以及画笔、颜色、图形类型的处理。
摘要由CSDN通过智能技术生成

上次聊了一下事件监听机制,今天就来聊一下怎么实现一个画图程序并且实现重绘。

一.实现画图程序

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到一些进阶技能我会在技术博客更新的哈,么么哒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值