java画笔覆盖在界面_Java实现画图程序和重绘
上次聊了一下事件監(jiān)聽(tīng)機(jī)制,今天就來(lái)聊一下怎么實(shí)現(xiàn)一個(gè)畫(huà)圖程序并且實(shí)現(xiàn)重繪。
一.實(shí)現(xiàn)畫(huà)圖程序
1.實(shí)現(xiàn)一個(gè)畫(huà)圖程序所需的API類?
JFrame窗體容器組件類
JPanel 面板元素組件類
JButton按鈕元素組件類
Dimension封裝組件的寬度和高度的類
BoarderLayout 邊框布局類
Graphics 畫(huà)筆類:提供各種繪制圖形的方法
Graphics2D 畫(huà)筆類:Graphics子類,提供各種繪制圖形更為復(fù)雜的控制。
Color顏色類:提供顏色
BasicStroke 接口Stroke的實(shí)現(xiàn)類,用于定義線條的特征
ActionListener 動(dòng)作事件接口
ActionEvent存儲(chǔ)動(dòng)作事件的相關(guān)(事件源對(duì)象)信息
MouseListener 鼠標(biāo)事件接口:提供處理按下,釋放,點(diǎn)擊,進(jìn)入和離開(kāi)動(dòng)作
MouseMotionListener鼠標(biāo)移動(dòng)事件接口:提供處理移動(dòng)和拖動(dòng)動(dòng)作的處理方法
MouseEvent存儲(chǔ)鼠標(biāo)事件的相關(guān)(事件源對(duì)象)信息
數(shù)組 是一個(gè)容器,用來(lái)存儲(chǔ)同一類型的數(shù)據(jù)
2.那怎么寫呢?
實(shí)現(xiàn)界面類
Public class ReDrawMain extends JPanel{
JFrame frame=new JFrame();
main(){}
initUI(){}
}
事件處理類
/**
* 1.定義DrawListener事件處理類,該類要實(shí)現(xiàn)ActionLIstener動(dòng)作事件接口、
* MouseListener鼠標(biāo)事件接口和MouseMotionListener鼠標(biāo)移動(dòng)事件接口,
*/
public class DrawListenerner implements ActionListener, MouseListener,
MouseMotionListener {}
3.一個(gè)畫(huà)圖程序需要實(shí)現(xiàn)的基本內(nèi)容
目標(biāo)1:點(diǎn)擊窗體上的不同的按鈕,獲取到按鈕上的文字信息。
事件監(jiān)聽(tīng)機(jī)制
1.事件源對(duì)象:所有的按鈕對(duì)象
2.事件監(jiān)聽(tīng)方法:addActionListener(ActionListener l);
3.事件接口(事件處理類):ActionListener
實(shí)現(xiàn)步驟:
1.定義DrawListener事件處理類,該類要實(shí)現(xiàn)ActionLIstener動(dòng)作事件接口,重寫接口中的所有抽象方法。
2.在重寫的事件處理方法中,獲取按鈕上的信息。
3.在ReDrawMain類的initUI方法中,實(shí)例化DrawListener事件處理類的對(duì)象,命名為dl。
4.將事件源按鈕對(duì)象通過(guò)addActionListener()監(jiān)聽(tīng)方法和事件處理類dl對(duì)象綁定。
目標(biāo)2:在窗體上按下鼠標(biāo)按鍵,然后釋放鼠標(biāo)按鍵,在按下和釋放的兩點(diǎn)之間繪制圖形
事件監(jiān)聽(tīng)機(jī)制
1.事件源對(duì)象:面板對(duì)象
2.事件監(jiān)聽(tīng)方法:addMouseListener(MouseListener l);
3.事件接口(事件處理類):MouseListener
實(shí)現(xiàn)步驟:
1.定義DrawListener事件處理類,該類要實(shí)現(xiàn)MouseListener鼠標(biāo)事件接口,重寫接口中的所有抽象方法。
2.在重寫的按下動(dòng)作和釋放動(dòng)作的事件處理方法中,在按下方法中獲取按下坐標(biāo)值,在釋放方法中獲取釋放的坐標(biāo)值;之后根據(jù)按下和釋放的坐標(biāo)值,以及圖形和顏色,使用Graphics來(lái)繪制對(duì)應(yīng)的圖形。
3.在ReDrawMain類的initUI方法中,實(shí)例化DrawListener事件處理類的對(duì)象,命名為dl。
4.將事件源窗體對(duì)象通過(guò)addMouseListener()監(jiān)聽(tīng)方法和事件處理類dl對(duì)象綁定。
目標(biāo)3:在窗體上按下鼠標(biāo)按鍵,然后拖動(dòng)鼠標(biāo),在按下和拖動(dòng)之間繪制曲線
事件監(jiān)聽(tīng)機(jī)制
1.事件源對(duì)象:面板對(duì)象
2.事件監(jiān)聽(tīng)方法:addMouseMotionListener(MouseMotionListener l);
3.事件接口(事件處理類):MouseMotionListener
二.重繪
1.實(shí)現(xiàn)畫(huà)圖程序后,問(wèn)題出現(xiàn)了 ≥﹏≤
我們會(huì)發(fā)現(xiàn)畫(huà)圖界面上繪制的圖形,當(dāng)我們放大或者最小化窗體,所有的圖形都將消失。
2.所以呢,我們必須知道重繪的原理 (? ˙o˙)?
所有的組件都是繪制出來(lái)的,那么組件就有一個(gè)繪制(paint)的方法;當(dāng)你改變窗體的大小時(shí),會(huì)自動(dòng)的去調(diào)用paint方法,將組件再畫(huà)一次。
當(dāng)改變窗體大小后,如果想要圖形不消失,必須要將圖形放在paint方法中進(jìn)行繪制。
3.敲黑板啦,那怎么實(shí)現(xiàn)我們繪制的圖形重繪? ???(??? ? ???)???
要讓圖形在面板的paint方法中,再畫(huà)一次。
定義圖形類,用來(lái)存儲(chǔ)圖形的四個(gè)坐標(biāo)、顏色、畫(huà)筆大小...
需要使用數(shù)組來(lái)存儲(chǔ)圖形數(shù)據(jù),數(shù)組的數(shù)據(jù)類型就為圖形類。
數(shù)組能存儲(chǔ)的元素個(gè)數(shù)是固定的,數(shù)組的大小就只能定義一個(gè)足夠大的。
三.實(shí)現(xiàn)一個(gè)有直線、填充矩形、填充圓、圓角矩形、3D矩形、文字、任意多邊形、五角星、
鉛筆、刷子、橡皮、噴槍、吸管以及可以選擇畫(huà)筆顏色的畫(huà)圖程序,并且實(shí)現(xiàn)重繪。
代碼如下:
package SummerCamp6;
/**
*界面類:實(shí)現(xiàn)一個(gè)有直線、填充矩形、填充圓、圓角矩形、3D矩形、文字、任意多邊形、
* 五角星、鉛筆、刷子、橡皮、噴槍、吸管以及可以選擇畫(huà)筆顏色的畫(huà)圖程序,并且實(shí)現(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("依米的畫(huà)圖板");
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ù)組,用來(lái)存儲(chǔ)按鈕上要顯示的顏色信息
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ù)組中的元素來(lái)實(shí)例化按鈕對(duì)象
for (int i = 0; i < colorArray.length; i++) {
JButton button = new JButton();
button.setBackground(colorArray[i]);
button.setPreferredSize(new Dimension(50, 50));
// 4.將事件源按鈕對(duì)象通過(guò)addActionListener()監(jiān)聽(tīng)方法和事件處理類dl對(duì)象綁定。
button.addActionListener(dl);
panel3.add(button);
}
frame.add(this, BorderLayout.CENTER);
frame.setBackground(this.getBackground());
frame.setVisible(true);// 可見(jiàn)必須在gr之前,否則看不到畫(huà)筆
Graphics gr = this.getGraphics();// 從窗體上獲取畫(huà)筆對(duì)象
this.addMouseListener(dl);
this.addMouseMotionListener(dl);
dl.setG(gr);
}
// 聲明圖形對(duì)象數(shù)組,數(shù)組的能存儲(chǔ)的元素個(gè)數(shù)是10000個(gè)圖形
/**
* 重寫組件的paint方法
*/
public void paint(Graphics gr) {
super.paint(gr);//調(diào)用父類的paint()
// 循環(huán)遍歷shapeArray數(shù)組
for (int i = 0; i < shapeArray.length; i++) {
Shape shape = shapeArray[i];// 從數(shù)組中獲取Shape對(duì)象
if(shape!=null)//shape是否不為空,如果不為空則調(diào)用畫(huà)圖形的方法
shape.draw((Graphics2D)gr);//調(diào)用繪制圖形的方法
}
}
}
/**
* 1.定義DrawListener事件處理類,該類要實(shí)現(xiàn)ActionLIstener動(dòng)作事件接口、
* MouseListener鼠標(biāo)事件接口和MouseMotionListener鼠標(biāo)移動(dòng)事件接口,
*/
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 = "鉛筆";// 聲明圖形屬性,用來(lái)存儲(chǔ)用戶選擇的圖形
private Color color = Color.black;// 聲明顏色屬性,用來(lái)存儲(chǔ)用戶選擇的顏色
private Graphics g;// 聲明Graphics畫(huà)筆類的對(duì)象名屬性
private int t1, t2, t3, t4, count = 0;
private int x1, y1, x2, y2;// 坐標(biāo)
private Shape shape;// 聲明圖形對(duì)象名
private Shape[] shapeArray;// 聲明存儲(chǔ)圖形對(duì)象的數(shù)組對(duì)象名屬性
private int number = 0;// 記錄數(shù)器,用來(lái)記錄已經(jīng)存儲(chǔ)的圖形個(gè)數(shù)。
private JPanel panel4;
Random r = new Random();
public BasicStroke s1;// 畫(huà)筆大小
BasicStroke s = new BasicStroke();
/**
* 1 構(gòu)造方法
*
* @param g是從DrawMain類的窗體上傳遞過(guò)來(lái)的畫(huà)筆對(duì)象
* @param shapeArray是從DrawMain類傳遞過(guò)來(lái)的存儲(chǔ)圖形的數(shù)組對(duì)象
*/
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();// 獲取事件源對(duì)象
String text = button.getText();// 獲取按鈕上的文字信息
if (text == null || text.equals("")) {// 判斷是否點(diǎn)擊的是顏色按鈕
color = button.getBackground();// 獲取按鈕的背景顏色
System.out.println("color = " + color);
} else {
type = button.getText();// 獲取按鈕上的文字信息
System.out.println("text = " + text);
}
}
/**
* 當(dāng)你在事件源對(duì)象上發(fā)生鼠標(biāo)按鍵按下動(dòng)作時(shí)執(zhí)行此方法
*/
public void mousePressed(MouseEvent e) {
// 2.在重寫的按下動(dòng)作和釋放動(dòng)作的事件處理方法中,在按下方法中獲取按下坐標(biāo)值
x1 = e.getX();
y1 = e.getY();
// //設(shè)置畫(huà)筆的顏色
// g.setColor(color);
if (type.equals("吸管")) {
try {
x1 = e.getXOnScreen();
y1 = e.getYOnScreen();
// 創(chuàng)建一個(gè)機(jī)器人對(duì)象
Robot jiqiren = new Robot();
// 2.構(gòu)造一個(gè)矩形區(qū)域,這個(gè)區(qū)域就是你要獲取顏色的區(qū)域
Rectangle rec = new Rectangle(x1, y1, 1, 1);
BufferedImage ima = jiqiren.createScreenCapture(rec);
// 3.獲取圖片的背景像素點(diǎn)顏色:三原色red blue green,獲取圖片指定像素點(diǎn)顏色
int a = ima.getRGB(0, 0);
color = new Color(a);
// 4.把顏色設(shè)置到畫(huà)筆上
} catch (AWTException e2) {
e2.printStackTrace();
}
}
}
/**
* 當(dāng)你在事件源對(duì)象上發(fā)生鼠標(biāo)按鍵釋放動(dòng)作時(shí)執(zhí)行此方法
*/
public void mouseReleased(MouseEvent e) {
// 2.在重寫的按下動(dòng)作和釋放動(dòng)作的事件處理方法中,在釋放方法中獲取釋放的坐標(biāo)值;
x2 = e.getX();
y2 = e.getY();
// 2.之后根據(jù)按下和釋放的坐標(biāo)值,以及圖形和顏色,使用Graphics來(lái)繪制對(duì)應(yīng)的圖形。
if (type.equals("直線")) {
// // System.out.println(">>>>>" + g);
// g.drawLine(x1, y1, x2, y2);// 調(diào)用繪制直線的方法
// 根據(jù)數(shù)據(jù)來(lái)實(shí)例化圖形對(duì)象
shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(1));
// 調(diào)用圖形的繪圖方法
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 將圖形對(duì)象存入到數(shù)組中
shapeArray[number++] = shape;
}
} else if (type.equals("任意多邊形")) {
if (count == 0) {
shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(1));
// 調(diào)用圖形的繪圖方法
shape.draw((Graphics2D) g);
count++;
t1 = x1;
t2 = y1;
}
else if (count != 0) {
shape = new ShapeLine(t3, t4, x2, y2, color, new BasicStroke(1));// 點(diǎn)擊鼠標(biāo)該點(diǎn)與前一個(gè)點(diǎn)相連
// 調(diào)用圖形的繪圖方法
shape.draw((Graphics2D) g);
if (e.getClickCount() == 2) {// 雙擊鼠標(biāo)則閉合線段,該最新的點(diǎn)與最早的點(diǎn)相連接,閉合圖形
shape = new ShapeLine(t1, t2, x2, y2, color, new BasicStroke(1));
shape.draw((Graphics2D) g);
count = 0;
}
// 記錄目前該點(diǎn)的位置
}
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) {
// 將圖形對(duì)象存入到數(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) {
// 將圖形對(duì)象存入到數(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) {
// 將圖形對(duì)象存入到數(shù)組中
shapeArray[number++] = shape;
}
}
}
/**
* 當(dāng)鼠標(biāo)在窗體上按下按鍵并且拖動(dòng)時(shí)執(zhí)行此方法
*/
public void mouseDragged(MouseEvent e) {
x2 = e.getX();
y2 = e.getY();
Graphics2D g2d = (Graphics2D) g;
if (type.equals("鉛筆")) {
// 根據(jù)數(shù)據(jù)來(lái)實(shí)例化圖形對(duì)象
shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(1));
// 調(diào)用圖形的繪圖方法
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 將圖形對(duì)象存入到數(shù)組中
shapeArray[number++] = shape;
}
x1 = x2;
y1 = y2;
} else if (type.equals("刷子")) {
// 根據(jù)數(shù)據(jù)來(lái)實(shí)例化圖形對(duì)象
shape = new ShapeLine(x1, y1, x2, y2, color, new BasicStroke(10));
// 調(diào)用圖形的繪圖方法
shape.draw((Graphics2D) g);
if (number < shapeArray.length) {
// 將圖形對(duì)象存入到數(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) {
// 將圖形對(duì)象存入到數(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) {
// 將圖形對(duì)象存入到數(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) {
// 將圖形對(duì)象存入到數(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) {
// 將圖形對(duì)象存入到數(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) {
// 將圖形對(duì)象存入到數(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) {
// 將圖形對(duì)象存入到數(shù)組中
shapeArray[number++] = shape;
}
}
}
/**
* 當(dāng)鼠標(biāo)在窗體上移動(dòng)鼠標(biāo)時(shí)執(zhí)行此方法
*/
public void mouseMoved(MouseEvent e) {
}
/**
* 當(dāng)你在事件源對(duì)象上發(fā)生鼠標(biāo)點(diǎn)擊(按下和釋放的動(dòng)作必須在同一個(gè)位置上)動(dòng)作時(shí)執(zhí)行此方法
*/
public void mouseClicked(MouseEvent e) {
}
/**
* 當(dāng)你的鼠標(biāo)光標(biāo)進(jìn)入事件源對(duì)象上時(shí)執(zhí)行此方法
*/
public void mouseEntered(MouseEvent e) {
}
/**
* 當(dāng)你的鼠標(biāo)光標(biāo)離開(kāi)事件源對(duì)象上時(shí)執(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畫(huà)筆對(duì)象
*/
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());// 設(shè)置畫(huà)筆顏色
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());// 畫(huà)筆大小
g.setColor(getColor());// 設(shè)置畫(huà)筆顏色
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類,該類是用來(lái)繪制矩形的類
*/
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畫(huà)筆對(duì)象
*/
public void draw(Graphics2D g) {
g.setStroke(getStroke());// 設(shè)置畫(huà)筆的粗細(xì)
g.setColor(getColor());// 設(shè)置畫(huà)筆的顏色
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); // 可以生成一個(gè)介于0(包含)到n(不包含)之間的整數(shù)
// nextInt(10)生成的就是0~10之間的隨機(jī)數(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");// 畫(huà)出圖片
g.drawImage(im.getImage(), getX1(), getY1(), getX2() - getX1(), getY2() - getY1(), null);// 釋放鼠標(biāo)畫(huà)出圖片
}
}
/**
* 定義ShapeLine類,該類是用來(lái)繪制直線的類
*/
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畫(huà)筆對(duì)象
*/
public void draw(Graphics2D g) {
g.setStroke(getStroke());// 設(shè)置畫(huà)筆的粗細(xì)
g.setColor(getColor());// 設(shè)置畫(huà)筆的顏色
g.drawLine(getX1(), getY1(), getX2(), getY2());// 繪制直線
}
}
/**
* 定義ShapeRoundRect類,該類是用來(lái)繪制圓角矩形的類
*/
package SummerCamp6;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
/**
* 定義ShapeRoundRect類,該類是用來(lái)繪制圓角矩形的類
*/
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畫(huà)筆對(duì)象
*/
public void draw(Graphics2D g) {
g.setStroke(getStroke());// 設(shè)置畫(huà)筆的粗細(xì)
g.setColor(getColor());// 設(shè)置畫(huà)筆的顏色
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());// 畫(huà)筆大小
g.setColor(getColor());//設(shè)置畫(huà)筆顏色
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="彈個(gè)吉他";
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());// 畫(huà)筆大小
g.setColor(getColor());//設(shè)置畫(huà)筆顏色
g.drawString(str, getX1(), getY1());// 5.文字
}
}
實(shí)現(xiàn)效果:
開(kāi)始畫(huà)圖,后臺(tái)顯示按鍵
令畫(huà)圖板最大化,圖形沒(méi)有消失
代碼段中夾有注釋,非常生動(dòng)形象,所以我就不一一再寫出來(lái)解釋了哈。
最后我們就把一個(gè)功能完好的畫(huà)圖板完成了,是不是很簡(jiǎn)單丫,有沒(méi)有心動(dòng)的感覺(jué),想不想寫一個(gè)丫,趕快動(dòng)手吧少年。
我get到的實(shí)現(xiàn)畫(huà)圖板和重繪(用數(shù)組保存圖形)的技能就差不多是這些了,如果以后又get到一些進(jìn)階技能我會(huì)在技術(shù)博客更新的哈,么么噠。
總結(jié)
以上是生活随笔為你收集整理的java画笔覆盖在界面_Java实现画图程序和重绘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新房除甲醛一次多少钱?
- 下一篇: ju开头的成语有哪些啊?