日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java画笔覆盖在界面_Java实现画图程序和重绘 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上次聊了一下事件監(jiān)聽機制,今天就來聊一下怎么實現(xiàn)一個畫圖程序并且實現(xiàn)重繪。

一.實現(xiàn)畫圖程序

1.實現(xiàn)一個畫圖程序所需的API類?

JFrame窗體容器組件類

JPanel 面板元素組件類

JButton按鈕元素組件類

Dimension封裝組件的寬度和高度的類

BoarderLayout 邊框布局類

Graphics 畫筆類:提供各種繪制圖形的方法

Graphics2D 畫筆類:Graphics子類,提供各種繪制圖形更為復雜的控制。

Color顏色類:提供顏色

BasicStroke 接口Stroke的實現(xiàn)類,用于定義線條的特征

ActionListener 動作事件接口

ActionEvent存儲動作事件的相關(事件源對象)信息

MouseListener 鼠標事件接口:提供處理按下,釋放,點擊,進入和離開動作

MouseMotionListener鼠標移動事件接口:提供處理移動和拖動動作的處理方法

MouseEvent存儲鼠標事件的相關(事件源對象)信息

數(shù)組 是一個容器,用來存儲同一類型的數(shù)據(jù)

2.那怎么寫呢?

實現(xiàn)界面類

Public class ReDrawMain extends JPanel{

JFrame frame=new JFrame();

main(){}

initUI(){}

}

事件處理類

/**

* 1.定義DrawListener事件處理類,該類要實現(xiàn)ActionLIstener動作事件接口、

* MouseListener鼠標事件接口和MouseMotionListener鼠標移動事件接口,

*/

public class DrawListenerner implements ActionListener, MouseListener,

MouseMotionListener {}

3.一個畫圖程序需要實現(xiàn)的基本內容

目標1:點擊窗體上的不同的按鈕,獲取到按鈕上的文字信息。

事件監(jiān)聽機制

1.事件源對象:所有的按鈕對象

2.事件監(jiān)聽方法:addActionListener(ActionListener l);

3.事件接口(事件處理類):ActionListener

實現(xiàn)步驟:

1.定義DrawListener事件處理類,該類要實現(xiàn)ActionLIstener動作事件接口,重寫接口中的所有抽象方法。

2.在重寫的事件處理方法中,獲取按鈕上的信息。

3.在ReDrawMain類的initUI方法中,實例化DrawListener事件處理類的對象,命名為dl。

4.將事件源按鈕對象通過addActionListener()監(jiān)聽方法和事件處理類dl對象綁定。

目標2:在窗體上按下鼠標按鍵,然后釋放鼠標按鍵,在按下和釋放的兩點之間繪制圖形

事件監(jiān)聽機制

1.事件源對象:面板對象

2.事件監(jiān)聽方法:addMouseListener(MouseListener l);

3.事件接口(事件處理類):MouseListener

實現(xiàn)步驟:

1.定義DrawListener事件處理類,該類要實現(xiàn)MouseListener鼠標事件接口,重寫接口中的所有抽象方法。

2.在重寫的按下動作和釋放動作的事件處理方法中,在按下方法中獲取按下坐標值,在釋放方法中獲取釋放的坐標值;之后根據(jù)按下和釋放的坐標值,以及圖形和顏色,使用Graphics來繪制對應的圖形。

3.在ReDrawMain類的initUI方法中,實例化DrawListener事件處理類的對象,命名為dl。

4.將事件源窗體對象通過addMouseListener()監(jiān)聽方法和事件處理類dl對象綁定。

目標3:在窗體上按下鼠標按鍵,然后拖動鼠標,在按下和拖動之間繪制曲線

事件監(jiān)聽機制

1.事件源對象:面板對象

2.事件監(jiān)聽方法:addMouseMotionListener(MouseMotionListener l);

3.事件接口(事件處理類):MouseMotionListener

二.重繪

1.實現(xiàn)畫圖程序后,問題出現(xiàn)了 ≥﹏≤

我們會發(fā)現(xiàn)畫圖界面上繪制的圖形,當我們放大或者最小化窗體,所有的圖形都將消失。

2.所以呢,我們必須知道重繪的原理 (? ˙o˙)?

所有的組件都是繪制出來的,那么組件就有一個繪制(paint)的方法;當你改變窗體的大小時,會自動的去調用paint方法,將組件再畫一次。

當改變窗體大小后,如果想要圖形不消失,必須要將圖形放在paint方法中進行繪制。

3.敲黑板啦,那怎么實現(xiàn)我們繪制的圖形重繪? ???(??? ? ???)???

要讓圖形在面板的paint方法中,再畫一次。

定義圖形類,用來存儲圖形的四個坐標、顏色、畫筆大小...

需要使用數(shù)組來存儲圖形數(shù)據(jù),數(shù)組的數(shù)據(jù)類型就為圖形類。

數(shù)組能存儲的元素個數(shù)是固定的,數(shù)組的大小就只能定義一個足夠大的。

三.實現(xiàn)一個有直線、填充矩形、填充圓、圓角矩形、3D矩形、文字、任意多邊形、五角星、

鉛筆、刷子、橡皮、噴槍、吸管以及可以選擇畫筆顏色的畫圖程序,并且實現(xiàn)重繪。

代碼如下:

package SummerCamp6;

/**

*界面類:實現(xiàn)一個有直線、填充矩形、填充圓、圓角矩形、3D矩形、文字、任意多邊形、

* 五角星、鉛筆、刷子、橡皮、噴槍、吸管以及可以選擇畫筆顏色的畫圖程序,并且實現(xiàn)重繪。

*/

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數(shù)組,用來存儲按鈕上要顯示的顏色信息

Color[] colorArray = { Color.BLUE, Color.GREEN, Color.RED, Color.BLACK,

Color.lightGray, Color.ORANGE, Color.PINK,

new Color(123, 100, 132) };

// 循環(huán)遍歷colorArray數(shù)組,根據(jù)數(shù)組中的元素來實例化按鈕對象

for (int i = 0; i < colorArray.length; i++) {

JButton button = new JButton();

button.setBackground(colorArray[i]);

button.setPreferredSize(new Dimension(50, 50));

// 4.將事件源按鈕對象通過addActionListener()監(jiān)聽方法和事件處理類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);

}

// 聲明圖形對象數(shù)組,數(shù)組的能存儲的元素個數(shù)是10000個圖形

/**

* 重寫組件的paint方法

*/

public void paint(Graphics gr) {

super.paint(gr);//調用父類的paint()

// 循環(huán)遍歷shapeArray數(shù)組

for (int i = 0; i < shapeArray.length; i++) {

Shape shape = shapeArray[i];// 從數(shù)組中獲取Shape對象

if(shape!=null)//shape是否不為空,如果不為空則調用畫圖形的方法

shape.draw((Graphics2D)gr);//調用繪制圖形的方法

}

}

}

/**

* 1.定義DrawListener事件處理類,該類要實現(xiàn)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;// 聲明存儲圖形對象的數(shù)組對象名屬性

private int number = 0;// 記錄數(shù)器,用來記錄已經存儲的圖形個數(shù)。

private JPanel panel4;

Random r = new Random();

public BasicStroke s1;// 畫筆大小

BasicStroke s = new BasicStroke();

/**

* 1 構造方法

*

* @param g是從DrawMain類的窗體上傳遞過來的畫筆對象

* @param shapeArray是從DrawMain類傳遞過來的存儲圖形的數(shù)組對象

*/

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);

}

}

/**

* 當你在事件源對象上發(fā)生鼠標按鍵按下動作時執(zhí)行此方法

*/

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();

// 創(chuàng)建一個機器人對象

Robot jiqiren = new Robot();

// 2.構造一個矩形區(qū)域,這個區(qū)域就是你要獲取顏色的區(qū)域

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();

}

}

}

/**

* 當你在事件源對象上發(fā)生鼠標按鍵釋放動作時執(zhí)行此方法

*/

public void mouseReleased(MouseEvent e) {

// 2.在重寫的按下動作和釋放動作的事件處理方法中,在釋放方法中獲取釋放的坐標值;

x2 = e.getX();

y2 = e.getY();

// 2.之后根據(jù)按下和釋放的坐標值,以及圖形和顏色,使用Graphics來繪制對應的圖形。

if (type.equals("直線")) {

// // System.out.println(">>>>>" + g);

// g.drawLine(x1, y1, x2, y2);// 調用繪制直線的方法

// 根據(jù)數(shù)據(jù)來實例化圖形對象

shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(1));

// 調用圖形的繪圖方法

shape.draw((Graphics2D) g);

if (number < shapeArray.length) {

// 將圖形對象存入到數(shù)組中

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) {

// 將圖形對象存入到數(shù)組中

shapeArray[number++] = shape;

}

} else if (type.equals("填充圓")) {

shape = new ShapeCircle(x1, y1, x2, y2, color, s);

shape.draw((Graphics2D) g);

if (number < shapeArray.length) {

// 將圖形對象存入到數(shù)組中

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) {

// 將圖形對象存入到數(shù)組中

shapeArray[number++] = shape;

}

}

}

/**

* 當鼠標在窗體上按下按鍵并且拖動時執(zhí)行此方法

*/

public void mouseDragged(MouseEvent e) {

x2 = e.getX();

y2 = e.getY();

Graphics2D g2d = (Graphics2D) g;

if (type.equals("鉛筆")) {

// 根據(jù)數(shù)據(jù)來實例化圖形對象

shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(1));

// 調用圖形的繪圖方法

shape.draw((Graphics2D) g);

if (number < shapeArray.length) {

// 將圖形對象存入到數(shù)組中

shapeArray[number++] = shape;

}

x1 = x2;

y1 = y2;

} else if (type.equals("刷子")) {

// 根據(jù)數(shù)據(jù)來實例化圖形對象

shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(10));

// 調用圖形的繪圖方法

shape.draw((Graphics2D) g);

if (number < shapeArray.length) {

// 將圖形對象存入到數(shù)組中

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) {

// 將圖形對象存入到數(shù)組中

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) {

// 將圖形對象存入到數(shù)組中

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) {

// 將圖形對象存入到數(shù)組中

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) {

// 將圖形對象存入到數(shù)組中

shapeArray[number++] = shape;

}

} else if (type.equals("文字")) {

shape = new ShapeString(x1, y1, x2, y2, color, s);

shape.draw((Graphics2D) g);

if (number < shapeArray.length) {

// 將圖形對象存入到數(shù)組中

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) {

// 將圖形對象存入到數(shù)組中

shapeArray[number++] = shape;

}

}

}

/**

* 當鼠標在窗體上移動鼠標時執(zhí)行此方法

*/

public void mouseMoved(MouseEvent e) {

}

/**

* 當你在事件源對象上發(fā)生鼠標點擊(按下和釋放的動作必須在同一個位置上)動作時執(zhí)行此方法

*/

public void mouseClicked(MouseEvent e) {

}

/**

* 當你的鼠標光標進入事件源對象上時執(zhí)行此方法

*/

public void mouseEntered(MouseEvent e) {

}

/**

* 當你的鼠標光標離開事件源對象上時執(zhí)行此方法

*/

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(不包含)之間的整數(shù)

// nextInt(10)生成的就是0~10之間的隨機數(shù),包含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.文字

}

}

實現(xiàn)效果:

開始畫圖,后臺顯示按鍵

令畫圖板最大化,圖形沒有消失

代碼段中夾有注釋,非常生動形象,所以我就不一一再寫出來解釋了哈。

最后我們就把一個功能完好的畫圖板完成了,是不是很簡單丫,有沒有心動的感覺,想不想寫一個丫,趕快動手吧少年。

我get到的實現(xiàn)畫圖板和重繪(用數(shù)組保存圖形)的技能就差不多是這些了,如果以后又get到一些進階技能我會在技術博客更新的哈,么么噠。

總結

以上是生活随笔為你收集整理的java画笔覆盖在界面_Java实现画图程序和重绘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。