• [转]关于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使用的例子已经上传。

  • 相关阅读:
    统计学——单(双)因素方差分析
    Android开发笔记(1)——View
    django 无法生成表
    django 学习笔记
    Django models模型(1)
    Django中MEDIA_ROOT和MEDIA_URL
    数据结构(二叉树)
    ubuntu16.04搭建geodjango+postgresql+postgis的WebGIS框架(三)加载空间数据
    ubuntu16.04搭建geodjango+postgresql+postgis的WebGIS框架(二))安装postgresql和postgis
    ubuntu16.04搭建geodjango+postgresql+postgis的WebGIS框架(一)安装第三方空间库
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3440192.html
Copyright © 2020-2023  润新知