Java開發筆記(一百二十三)AWT圖像視圖

前面介紹了AWT的幾種基礎控件,從按鈕到文本標籤,從輸入框到選擇框,無一例外都能顯示文字,惟獨沒法顯示某張圖片文件。本覺得AWT會提供專門的控件來顯示圖片,然而恰恰沒有意料之中的圖像控件,這可真是弱爆了,竟然不能顯示奼紫嫣紅的圖片,讓程序員情何以堪呀。不過咱程序員不是吃素的,與其坐等天上掉餡餅,不如本身動手編寫符合要求的圖像視圖。AWT自帶的界面控件,大多由Component類派生而來,該類與展現有關的方法主要有下列兩個:
getPreferredSize:該方法可返回控件的推薦寬高。
paint:該方法可以使用畫筆Graphics繪製具體的圖案,包括各類形狀、文字與圖像。
看來若想自定義一個新控件,只需重寫getPreferredSize和paint兩個方法就行了,原來就這麼簡單。但是對於新手來講,天曉得要怎樣把圖片畫到界面上,一方面不知道AWT利用哪一種工具讀寫圖片,另外一方面也不知道怎樣用畫筆描繪圖像。目前爲止只知曉圖片文件能夠用File工具打開,且AWT控件屬於Component家族,其他的中間過程徹底是一團抓瞎。譬以下面的流程圖描述了AWT顯示圖片文件的步驟。html


上圖的好幾處地方尚不明確,例如:怎樣把圖片文件讀到AWT的緩存當中?AWT的緩存是什麼對象類型?怎樣把緩存的圖像數據描繪到控件上?這些問題如果不弄清楚,前頭說的圖像視圖根本無法作。固然,AWT確實提供了每一個環節須要的工具,儘管有些繁瑣,但畢竟能用。這些工具的名稱及其用法簡要說明以下:
一、圖像緩存類BufferedImage,它是AWT專用的圖像緩存工具,裏面保存着臨時的圖像數據。
二、圖像輸入輸出工具ImageIO,它是AWT讀寫圖片文件的利器,其中read方法可將圖片文件讀到圖像緩存中,而write方法可將圖像緩存保存爲圖片文件。
三、畫筆工具Graphics,前述paint方法的輸入參數正是Graphics類型,只要調用畫筆對象的drawImage方法,便可在控件上繪製圖像緩存。
如今有了上面三個工具,把它們替換進先前AWT顯示圖片的流程圖,完善後的流程圖就變成了下面這般:程序員


嘖嘖,顯示圖片的流程一會兒變得清晰了,經過BufferedImage、ImageIO、Graphics三板斧的協助,在控件上顯示圖片再也不是難事了。依據流程圖給出的思路,接着便能編寫圖像視圖的自定義代碼了,下面是支持顯示圖片文件的圖像視圖代碼例子:緩存

//定義一個顯示圖片用的圖像視圖
public class ImageView extends Component {
	private static final long serialVersionUID = 1L;
	private BufferedImage image; // 聲明一個緩存圖像

	// 設置圖片路徑
	public void setImagePath(String path) {
		try {
			image = ImageIO.read(new File(path)); // 把指定路徑的圖片文件讀到緩存圖像
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void paint(Graphics g) { // 繪製控件的方法
		if (image != null) {
			if (getWidth() > 0 && getHeight() > 0) { // 有指定寬高
				g.drawImage(image, 0, 0, getWidth(), getHeight(), null); // 按指定寬高繪製圖像
			} else { // 未指定寬高
				g.drawImage(image, 0, 0, null); // 按原尺寸繪製圖像
			}
		}
	}

	@Override
	public Dimension getPreferredSize() { // 獲取控件的推薦寬高
		if (image != null) {
			if (getWidth() > 0 && getHeight() > 0) { // 有指定寬高
				return new Dimension(getWidth(), getHeight()); // 返回setSize方法指定的寬高
			} else { // 未指定寬高
				return new Dimension(image.getWidth(), image.getHeight()); // 返回圖像的寬高
			}
		} else {
			return new Dimension(0, 0); // 無圖像則隱藏控件
		}
	}
}

而後回到主界面的代碼,先建立圖像視圖的控件對象,再設置該控件的寬高,以及待顯示的圖片文件路徑,最後將圖像控件添加到面板上,主要的調用代碼以下所示:app

		Panel panel = new Panel(); // 建立一個面板
		ImageView imageView = new ImageView(); // 建立一個自定義的圖像視圖
		imageView.setSize(320, 240); // 設置圖像視圖的寬高
		imageView.setImagePath("E:/apple.png");  // 在圖像視圖上顯示指定路徑的圖片
		panel.add(imageView); // 在面板上添加圖像視圖
		frame.add(panel); // 在窗口上添加面板

 

運行以上的圖像控件代碼,彈出的窗口界面以下圖所示,可見面板成功展現了指定的圖片。ide




更多Java技術文章參見《Java開發筆記(序)章節目錄工具

相關文章
相關標籤/搜索