java画笔覆盖在界面_Java实现画图程序和重绘
上次聊了一下事件監(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实现画图程序和重绘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新房除甲醛一次多少钱?
- 下一篇: 基于c语言优先级病房呼叫_C语言