畫圖板的重繪

南懿燁曦發表於2020-12-11

前言

我們畫圖板上的內容如果不加重繪的話就是一次性的,只要我的畫板被隱藏或是擴大,畫板上的內容就會消失。
在我之前的內容裡,我實現了一個基礎的畫線內容,它的原始碼是這樣的

	public void mouseDragged(MouseEvent e) {
		g.setColor(Color.white);
		g.drawLine(x1, y1, x3, y3);//將上一次的線塗白

		x2=e.getX();
		y2=e.getY();
		
		g.setColor(Color.black);
		g.drawLine(x1, y1, x2, y2);
		x3=x2;
		y3=y2;

而這會出現什麼問題呢,
如果我們在下一次的拖動操作中將拖動的線移到之前的線上,之前的線就會被擦除,這是由於“塗白”程式碼造成的。為了解決這個問題,我們想到實現重新

建立新的類記錄座標

import java.awt.Color;
import java.awt.Graphics;

public class Shape{
	public int x1,y1,x2,y2;
	void drawShape(Graphics g) {
		g.setColor(Color.black);
		g.drawLine(x1, y1, x2, y2);
	}
}

我們在這個類裡寫入了一個畫線的函式,這個函式也可以寫在別處,新類的主要作用是記錄座標

在我們的監聽器的類裡邊建立個Shape物件陣列用於記錄座標

public Shape []a=new Shape[100];
int index=0;
public void mouseReleased(MouseEvent e) {
    	x2=e.getX();
    	y2=e.getY();
    	Shape shape=new Shape();
    	shape.x1=x1;
    	shape.y1=y1;
    	shape.x2=x2;
    	shape.y2=y2;
    	a[index++]=shape;
    }

這樣就存入了一個shape物件的資訊

重繪的實現

很簡單,只需要在畫白線的後面加上重繪就行

public void mouseDragged(MouseEvent e) {
   	g.setColor(Color.white);
   	g.drawLine(x1, y1, x3, y3);
   	for(int i=0;i<a.length;i++) {
   		System.out.println("重繪");//用於檢測是否實現
   	Shape shape=a[i];
   	if(a[i]!=null)
   		shape.drawShape(g);
   	else
   		break;
   	}
   	x2=e.getX();
   	y2=e.getY();
   	
   	g.setColor(Color.black);
   	g.drawLine(x1, y1, x2, y2);
   	x3=x2;
   	y3=y2;
   	
   	
   } 

整個介面的重繪

要實現這個功能我們需要改寫我們的paint函式
paint函式本身隱含在我們的JFrame裡面,在我們的框架發生大小改變的時候會自動呼叫,我們現在要給它增添一些內容,並且保留原來的內容

public void paint(Graphics g) {
	super.paint(g);//繼承父類的功能
	for(int i=0;i<a.length;i++) {
		System.out.println("重繪");
	Shape shape=a[i];
	if(a[i]!=null)
	shape.drawShape(g);
	}
}

小結

以上就是關於重繪的一些簡單實現

相關文章