前面提過,AWT沒提供可以直接顯示圖像的控件,這無疑是個使人詬病的短板,由於一上來就得由程序員本身去定義新控件,對於初學者來說很不友好。這個問題在Swing中也解決掉了,不過Swing並未提供單獨的圖像視圖,而是利用標籤控件JLabel來顯示圖像。JLabel的setText方法用來設置標籤上的文本,而setIcon方法用來設置標籤上的圖標,根據兩個方法的調用與否情況,標籤所展現的內容可分爲下列三種狀況:
一、只調用setText方法,未調用setIcon方法,此時標籤只顯示文本。
二、只調用setIcon方法,未調用setText方法,此時標籤只顯示圖像。
三、既調用setText方法,又調用setIcon方法,此時標籤同時顯示文本和圖像,且圖像在左邊、文本在右邊,即左圖右文。
然而setIcon方法的輸入參數倒是Icon圖標類型,並不是早前介紹的緩存圖像BufferedImage,這意味着須要把緩存圖像轉換爲圖標類型。其中的轉換過程用到了圖像圖標工具ImageIcon,因爲該工具實現了Icon接口,所以它的實例能夠做爲setIcon方法的輸入參數。經過ImageIcon的構造方法,就能把緩存圖像轉爲圖標對象,具體的轉換代碼以下所示:html
// 把圖片文件讀到緩存圖像 BufferedImage image = ImageIO.read(new File("E:/apple.png")); ImageIcon icon = new ImageIcon(image); // 建立一個圖標
固然,ImageIcon自己是個圖標工具,讀取圖片文件何須要通過緩存圖像倒騰兩手呢?直接去指定的文件路徑讀取即是。因而依據圖片文件建立圖標對象的代碼變成了下面這樣:程序員
ImageIcon icon = new ImageIcon("E:/apple.png"); // 建立一個指定路徑的圖標
但是構造方法傳入字符串算什麼意思?難道字符串必定是文件路徑嗎?顯然傳入字符串的方式並不嚴謹。更好的作法是傳入一個URL地址對象,明明白白地告訴編譯器,構造方法的輸入參數必須是個合法的文件地址,就像如下代碼表達的那樣:緩存
URL url = new URL("file:///E:/apple.png"); // 建立一個本地路徑的URL對象 ImageIcon icon = new ImageIcon(url); // 建立一個指定URL的圖標
注意到構建URL對象的時候,文件路徑字符串添加了前綴「file:///」,表示該串爲本地的文件路徑。除了本地文件,URL對象還能用來表達網絡文件,只需將網絡文件的完整http地址傳進去便可,此時根據網絡圖片建立圖標對象的代碼示例以下:網絡
URL url = new URL("https://profile.csdnimg.cn/C/1/5/1_aqi00"); // 建立一個網絡地址的URL對象 ImageIcon icon = new ImageIcon(url); // 建立一個來自網絡圖片的圖標
上述的幾種構造方法,都能用來建立圖標對象。獲取到圖標對象以後,就能調用setIcon方法在標籤控件顯示圖像,還能調用setIconTextGap方法設置圖標與文字之間的空白距離。
接下來分別看看在標籤上顯示圖像與文本的組合結果,首先,只顯示圖像不顯示文本,則標籤控件的方法調用代碼示例以下:app
ImageIcon icon = new ImageIcon("E:/apple.png"); // 建立一個指定路徑的圖標 label.setIcon(icon); // 設置標籤的圖標 label.setText(null); // 設置標籤的文本爲空,此時不顯示文本
運行以上的測試代碼,彈出的窗口界面以下圖所示,可見標籤上的圖像居中展現。工具
其次,準備同時顯示圖像與文本,則標籤控件的setIcon方法和setText方法均應指定非空對象,此時調用代碼以下所示:測試
ImageIcon icon = new ImageIcon("E:/apple.png"); // 建立一個指定路徑的圖標 label.setIcon(icon); // 設置標籤的圖標(圖標在文字左邊) label.setIconTextGap(10); // 設置圖標與文字之間的間隔大小 label.setText("這是一個蘋果"); // 設置標籤的文本
運行以上的測試代碼,彈出的窗口界面以下圖所示,可見圖像和文本都顯示了出來。url
再次,不顯示圖像只顯示文本,則標籤控件的調用代碼以下所示:htm
label.setIcon(null); // 設置標籤的圖標爲空,此時不顯示圖像 label.setText("這是一個蘋果"); // 設置標籤的文本
運行以上的測試代碼,彈出的窗口界面以下圖所示,可見JLabel控件變爲常規的文本標籤了。對象
更多Java技術文章參見《Java開發筆記(序)章節目錄》