前面提過,AWT沒提供能夠直接顯示圖像的控制項,這無疑是個令人詬病的短板,因為一上來就得由程式員自己去定義新控制項,對於初學者來講很不友好。這個問題在Swing中也解決掉了,不過Swing並未提供單獨的圖像視圖,而是利用標簽控制項JLabel來顯示圖像。JLabel的setText方法用來設置標簽上的文本 ...
前面提過,AWT沒提供能夠直接顯示圖像的控制項,這無疑是個令人詬病的短板,因為一上來就得由程式員自己去定義新控制項,對於初學者來講很不友好。這個問題在Swing中也解決掉了,不過Swing並未提供單獨的圖像視圖,而是利用標簽控制項JLabel來顯示圖像。JLabel的setText方法用來設置標簽上的文本,而setIcon方法用來設置標簽上的圖標,根據兩個方法的調用與否狀況,標簽所展示的內容可分為下列三種情況:
1、只調用setText方法,未調用setIcon方法,此時標簽只顯示文本。
2、只調用setIcon方法,未調用setText方法,此時標簽只顯示圖像。
3、既調用setText方法,又調用setIcon方法,此時標簽同時顯示文本和圖像,且圖像在左邊、文本在右邊,即左圖右文。
然而setIcon方法的輸入參數卻是Icon圖標類型,並非早前介紹的緩存圖像BufferedImage,這意味著需要把緩存圖像轉換為圖標類型。其中的轉換過程用到了圖像圖標工具ImageIcon,由於該工具實現了Icon介面,因此它的實例可以作為setIcon方法的輸入參數。通過ImageIcon的構造方法,就能把緩存圖像轉為圖標對象,具體的轉換代碼如下所示:
// 把圖片文件讀到緩存圖像 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方法設置圖標與文字之間的空白距離。
接下來分別看看在標簽上顯示圖像與文本的組合結果,首先,只顯示圖像不顯示文本,則標簽控制項的方法調用代碼示例如下:
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("這是一個蘋果"); // 設置標簽的文本
運行以上的測試代碼,彈出的視窗界面如下圖所示,可見圖像和文本都顯示了出來。
再次,不顯示圖像只顯示文本,則標簽控制項的調用代碼如下所示:
label.setIcon(null); // 設置標簽的圖標為空,此時不顯示圖像 label.setText("這是一個蘋果"); // 設置標簽的文本
運行以上的測試代碼,彈出的視窗界面如下圖所示,可見JLabel控制項變為常規的文本標簽了。
更多Java技術文章參見《Java開發筆記(序)章節目錄》