分類  >  編程 >

畫圖板中重繪功能遇到的有關問題

tags:    時間:2013-12-23 08:49:04
畫圖板中重繪功能遇到的問題
畫圖板的功能還在日趨完善,現在正在努力實現利用自定義隊列存儲繪圖信息然後重繪的功能,在實現這個功能的過程中,遇到的最多的異常就是java.lang.ClassCastException了,



造成這個異常的原因就是重繪時讀取存儲的信息時出現了錯誤,導致一些類賦值時不匹配。

就拿直線來說,我們要保存直線的信息,需要在每次畫完直線時存儲這條直線的信息,即在滑鼠釋放(MouseReleased)裡面添加直線的首尾兩個點的坐標、用於判斷圖形類型的標識符、圖像線條的粗細以及直線的顏色。代碼如下:
( 其中x1,y1為直線的第一個點即滑鼠按下的點的坐標,list為用於存放信息的自定義隊列。)
 //滑鼠釋放的監聽 public void mouseReleased(MouseEvent e) { 	x2 = e.getX(); 	y2 = e.getY();  	//保存兩個點 	list.add(x1); 	list.add(y1); 	list.add(x2); 	list.add(y2); 		 	if("line".equals(shape_command))		 	{ 		//畫直線 		g.drawLine(x1, y1, x2, y2); 		//保存畫筆粗細 		list.add(0); 		//保存標識符 		list.add("line"); 		//保存顏色 		list.add(color_command); 	}       } 


然後我們會在DrawPanel裡面的paint方法依次取出list裡面的各項信息。
 public void paint(Graphics g) { 	super.paint(g); 		 	for(int i=0;i<list.length()/7;i++) 	{ 		//取出保存的兩個點 		int x1 = (Integer)list.get(7*i); 		int y1 = (Integer)list.get(7*i+1); 		int x2 = (Integer)list.get(7*i+2); 		int y2 = (Integer)list.get(7*i+3); 		int size_command = (Integer)list.get(7*i+4); 		//取出圖形命令 		String command = (String)list.get(7*i+5); 		//取出顏色 		Color color = (Color)list.get(7*i+6); 		 		g.setColor(color); 			 		//重繪 		if("line".equals(command)) 		{ 			//重繪直線 			g.drawLine(x1,y1,x2,y2); 		}        	 	} } 


如上,正因為重繪是「依次」來取的,所以任何一個存放的信息順序出現了問題,取信息時就會有錯誤發生,比如將Color類型的信息複製給了String類型的command等。這就需要我們完全掌握程序執行的順序,確保每一個信息存放的時候都是以7項為單位,按照指定的順序依次存放的。

當我第一次出現這個問題時不知道怎麼做,因為系統只提示出出現了ClassCastException這個異常,只告訴是哪一行有問題,但是不能指出是哪一個變數提取時出錯了。到後來我再遇到這個問題時,我能明白這個問題出現的原因,我會馬上去畫圖的方法里去尋找存放順序可能出現問題的地方,往往問題就出在那裡。

還有一點是檢測有沒有問題的方法,我覺得畫一個圖形重繪成功是不能說明什麼問題的,要測試重繪的方法有沒有出現ClassCastException異常,最好用多個圖形。比如我在實現重繪鉛筆功能的時候,畫一條線能成功重繪,但是畫兩條的時候就會報異常了。這個錯誤我個人覺得很經典,因為這個錯誤不是在MouseDragged裡面產生的,而是在滑鼠釋放的方法裡面。滑鼠釋放的部分代碼已經附在上面了,可以看到,在判斷畫直線之前程序就已經存放了兩個點,而我實現畫鉛筆的功能並沒有用MouseReleased方法,所以在保存鉛筆信息的最後就莫名其妙地多了兩個點的坐標,這樣第一條直線重繪的時候並不會出錯,因為只是多了兩個點而已,程序取不到String類型的command和Color類型的color,所以自然不會出現類轉換異常的ClassCastException,然而第二次取的時候就會報異常了,因為這些信息在隊列里會和第二條線結合起來,重繪的時候再取順序就會不匹配了。

既然已經發現問題,要解決這個問題也就很簡單了,即再自行添加一個標識符就行了:

 //滑鼠釋放的監聽 public void mouseReleased(MouseEvent e) { 	x2 = e.getX(); 	y2 = e.getY();  	//保存兩個點 	list.add(x1); 	list.add(y1); 	list.add(x2); 	list.add(y2); 		 	if("line".equals(shape_command))		 	{ 		//畫直線 		g.drawLine(x1, y1, x2, y2); 		//保存畫筆粗細 		list.add(0); 		//保存標識符 		list.add("line"); 	}else if("pencil".equals(shape_command)) 	{ 		//保存畫筆粗細 		list.add(0); 		//添加鉛筆標誌位 		list.add("pencil"); 	}         //保存顏色 	list.add(color_command);      } 


我們需要注意的是發現這個問題很不容易,我們需要非常了解這個代碼的執行順序以及各種功能的邏輯,發現問題並解決很重要,更重要的時能得到經驗,避免以後再出現類似的錯誤。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網