[轉]關於Icon,Image,ImageIcon的簡單的對比參考


轉自:http://blog.csdn.net/bcmissrain/article/details/7190886

其實就算是現在,我還是有不少地方概念模糊,但是下面的內容是是沒有什么問題的。稍微介紹一下,或許有些地方我無法解釋:

大部分內容都是查的Java SE 5.0 API

Icon:

Icon位於javax.swing包中,它是一個接口 public interface Icon,介紹為:一個小的固定大小的圖片,通常用於裝飾組件

有三個方法:

int getIconHeight();

int getIconWidth();

void paintIcon(Component c,Graphics g,int x,int y);

Icon木有用過,提到它是因為ImageIcon實現了Icon接口(ImageIcon還實現了Accessible,Serializable接口,不過這里不具體說明了)

ImageIcon:

ImageIcon位於javax.swing包中。可以根據Image繪制Icon(這句話很關鍵),可以使用MediaTracker預載圖像(Image也可以)

構造方法不少,舉幾個常用的:

ImageIcon(Image image);

ImageIcon(String name);

ImageIcon(URL url);

主要方法:

 

int getIconHeight();

int getIconWidth();

void paintIcon(Component c,Graphics g,int x,int y);

image getImage();

void setImage(Image image);

protect void loadImage(Image image); 加載圖像,並在圖像已經加載后才返回

要給控件加圖片的話,可以很輕松地

JLabel label = new JLabel(new ImageIcon("a.png"));搞定(這個是用來與后面的Image的加圖片對比的);

 

Image:來自於java.awt包中,抽象類Image是表示圖形圖像的所有類的超類,必須以特定於平台的方式獲取圖像。

它的主要方法是:Image getScaledInstance(int width,int height,int hints)

hints為:指示用於圖像重新取樣的算法類型的標志,具體可用的幾個參數如下:

SCALE_AREA_AVERAGING 使用 Area Averaging 圖像縮放算法。
SCALE_DEFAULT     使用默認的圖像縮放算法。
SCALE_FAST     選擇一種圖像縮放算法,在這種縮放算法中,縮放速度比縮放平滑度具有更高的優先級。
SCALE_REPLICATE    使用 ReplicateScaleFilter 類中包含的圖像縮放算法。
SCALE_SMOOTH     選擇圖像平滑度比縮放速度具有更高優先級的圖像縮放算法

我們生成Image對象時需要借助於Toolkit類的getImage方法,而生成Toolkit對象有兩種方法,一是借助於Component類的getToolkit()方法,一是借助於Toolkit的靜態方法getDefaultToolkit();

所以呢,如果要使用Image類來為組件添加圖標的話有兩種方法

一種是:

//該類繼承了Component或其子類

Image image = getToolkit().getImage("a.png");

JButton jb = new JButton(new ImageIcon(image));

另一種:

Image image = new Toolkit.getDefaultToolkit().getImage("a.png");

JButton jb = new JButton(new ImageIcon(image));

那么,為什么不直接用ImageIcon呢?前者不是更簡單嗎?

是的,前者更簡單。但是Image可以對圖像進行加工(比如調節大小使圖像變灰等等)。

舉一個例子,使用一個大圖片來設置為小按鈕的背景圖:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ImageTest
{
    public static void main(String[] args)
    {
        JFrame jf = new JFrame("圖片測試");
        MyPanel mp = new MyPanel();
        jf.add(mp);
        jf.pack();
        jf.validate();
        jf.setVisible(true);
    }

}

class MyPanel extends JPanel
{
    private JButton jb1 = null;
    private JButton jb2 = null;
    private Image image = getToolkit().getImage("play.png");
    private ImageIcon imageIcon = new ImageIcon("play.png");

    public MyPanel()
    {
        super();
        jb1 = new JButton();
        /*您只要注釋掉這句話,就會發現這兩者的效果是完全相同的*/
        image = image.getScaledInstance(50,50,image.SCALE_DEFAULT);
        jb1.setIcon(new ImageIcon(image));
        jb2 = new JButton(imageIcon);
        this.add(jb1);
        this.add(jb2);
    }

}

 

效果圖如下:

 

我想看了上面的內容,關於Image和ImageIcon的區別您已經有所體會了吧。

 

關於他們的互相的轉換,也希望大家能夠記住,使用起來會相當順手:

Image的圖給ImageIcon

Image image 

ImageIcon imageIcon

1.new ImageIcon(image);

2.imageIcon.getImage(image);

3.很可惜的,loadImage方法為protected,我們使用不到了。

ImageIcon的圖給Image

1.image = imageIcon.getImage();

 

作為新手的我,最近在看《設計模式》,我想恐怕要過很久了,那個時候我們從設計的角度來看這三個類

今天差不多就說到這里吧。演示Image和ImageIcon使用的例子已經上傳。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM