1. 程式人生 > 實用技巧 >重繪

重繪

public class Practice {
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        int a = 1;
        int i = 1;
        int sum = 0;
        while(i <= n){
            a = a * i;
            sum += a;
            i++;
        }
        System.out.println(
"The final number is:"+sum); } }

引言:我們上次做的畫圖板中,可以注意到一旦將畫圖板介面最小化或者調整它的大小,

畫了的那些圖形就不見了。這是因為,當進行這些操作之後,其實有一個paint方法會重新把這個畫圖板介面畫出 來,

而我們在畫圖板上畫過的那些東西是沒有被儲存的。這時候我們就需要把畫的這些圖形的資料儲存。

問題來了,該如何儲存呢?我們可以把畫的那個圖形,包括所有的資料(名字、起止點座標還有顏色)全部都存到一個數組裡。

可以新建立一個Shape類,

程式碼如下:

package cl.drawFrame1119;
import java.awt.Graphics;
import java.awt.event.ActionListener; import java.awt.event.MouseListener; import javax.swing.JFrame; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; public class DrawFrame { public static void main(String[] args){ DrawFrame df = new DrawFrame(); df.showUI(); }
public void showUI(){ JFrame jf = new JFrame(); jf.setSize(800,800); jf.setTitle("畫圖工具"); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(3); //新增流式佈局。 FlowLayout flow = new FlowLayout(FlowLayout.LEFT);//設定對齊方式為左對齊,在括號裡面寫。 //上面只是建立這個物件,接下來要set一下。 jf.setLayout(flow); javax.swing.JButton jbu = new javax.swing.JButton("直線"); jf.add(jbu); javax.swing.JButton jbu2 = new javax.swing.JButton("圓"); jf.add(jbu2); javax.swing.JButton jbu3 = new javax.swing.JButton("矩形"); jf.add(jbu3); javax.swing.JButton jbu4 = new javax.swing.JButton("綠色"); jf.add(jbu4); javax.swing.JButton blue = new javax.swing.JButton(); //設定按鈕背景色 blue.setBackground(Color.BLUE); blue.setPreferredSize(new Dimension(30, 30)); jf.add(blue); jf.setVisible(true); Graphics g =jf.getGraphics(); DrawMouse mouse = new DrawMouse(); jf.addMouseListener(mouse); mouse.gr = g; //上面DrawMouse裡面已經定義了一個mouse物件了,這裡直接用mouse. //因為DrawMouse同時監聽了 MouseListener,ActionListen兩種動作。 jbu.addActionListener(mouse); jbu2.addActionListener(mouse); jbu3.addActionListener(mouse); jbu4.addActionListener(mouse); blue.addActionListener(mouse); } }

![](https://img2020.cnblogs.com/blog/2213939/202012/2213939-20201227172419485-970695699.png) ![](https://img2020.cnblogs.com/blog/2213939/202012/2213939-20201227172433207-720417812.png) 在Shape這個類裡面,定義x1,y1,x2,y2(起止點座標),name(名字),color(顏色),m,n(最小值)這些變數。 然後是構造方法。注意構造方法的格式是public+方法名(引數){方法體},注意這裡方法名只能與類同名!當然裡面的引數只要用的變數不同就可以了。 方法體裡面是賦值操作,也就是初始化。 然後是自己定義一個drawShape方法,括號裡面是引數(畫筆) 然後是m和n判斷最小值(這裡是畫矩形要用到的),注意這裡的判斷只能在方法裡面進行,不能在類那個地方進行。 然後這裡用了一個switch語句,看看我點選的那個是什麼(就是說我選擇畫的是直線、圓還是矩形)。然後,一定要在把對應的圖形畫出來之前設定顏色,否則沒用。就是要先g.setColor(color); 以上是drawShape的程式碼。 當然,我們上面所有的這些操作都是要在數組裡面進行的,所以最最最前提的是我們要先弄一個數組出來存這些資料。可以在DrawMouse裡面新建一個shape陣列,陣列長度這裡可以定義得長一點,就選擇1000.然後要設定一下下標,就設定index,初始化值為0.程式碼如下: ![](https://img2020.cnblogs.com/blog/2213939/202012/2213939-20201227172446515-535118077.png) 然後,要記得去到畫對應的圖形的程式碼處,在畫完一個圖形後的那行程式碼的下面儲存資料。程式碼如下: ![](https://img2020.cnblogs.com/blog/2213939/202012/2213939-20201227172512254-85648295.png) ![](https://img2020.cnblogs.com/blog/2213939/202012/2213939-20201227172526922-1946019870.png) ![](https://img2020.cnblogs.com/blog/2213939/202012/2213939-20201227172537351-847547657.png) 這裡,我們同樣需要重建一個shape物件,然後後面那個Shape裡面就是所有的資料,接著把這個shape存到arr數組裡面。同時,陣列的下標必須要時刻更新,怎麼更新?可以就是上面那樣寫,存到數組裡後,就讓index加加一下。其次,Shape引數裡面的ab,color引數,都要定義成全域性變數,在最開始時定義就OK了。 接下來,還不行。我們需要再新建一個MyFrame類,在MyFrame類裡,繼承我的JFrame.程式碼如下: ![](https://img2020.cnblogs.com/blog/2213939/202012/2213939-20201227172709304-1578786800.png)