博客
关于我
关于Icon,Image,ImageIcon的简单的对比参考
阅读量:516 次
发布时间:2019-03-07

本文共 1898 字,大约阅读时间需要 6 分钟。

ImageIcon和Image在Java Swing中都是用于为用户界面组件添加图标的工具,但它们的使用方式和功能有以下区别和联系:

1. 定义与作用

  • ImageIcon:是一个接口,位于javax.swing包中,用于表示一个小型固定大小的图片,通常用于装饰界面组件。它实现了Icon接口,并扩展了AccessibleSerializable接口。
  • Image:一个抽象类,位于java.awt包中,是所有图像类的超类,用于表示图像。它需要通过特定平台的方式获取图像信息,通常与AWT定制工具包相关。

2. 构造方法

  • ImageIcon:可以通过不同的构造方法创建,如从Image对象、文件名、URL创建。
  • Image:需要通过Toolkit类获取,如getToolkit().getImage()Toolkit.getDefaultToolkit().getImage()

3. 主要方法

  • ImageIcon
    • 获取图片高度和宽度:getIconHeight()getIconWidth()
    • 绘制图片:paintIcon(Component c, Graphics g, int x, int y)
    • 获取和加载图片:getImage()loadImage(Image image)(前者保护访问)。
  • Image
    • 缩放图像:getScaledInstance(int width, int height, int hints),其中hints指定缩放算法,如SCALE_AREA_AVERAGINGSCALE_SMOOTH等。这些算法影响了图像质量和性能。
    • 获取缩放后的图像:getScaledInstance()返回一张按比例缩放后的图片。

4. 图片加载与处理

  • 使用ImageIcon:直接创建ImageIcon对象,处理起来相对简单。例如,new ImageIcon("image.png")即可创建一个装饰图标的Icon对象。
  • 使用Image:适合需要对图像进行处理,如缩放、调整大小或颜色处理的情况。例如,将一张大图片缩放并调整为按钮背景图,确保其适合放置在不同尺寸的按钮上。

5. 互相转换

  • 从ImageIcon转换为Image
    ImageIcon icon = new ImageIcon(image);Image image = icon.getImage();
  • 从Image转换为ImageIcon
    Image image = toolkit.getImage("image.png");ImageIcon icon = new ImageIcon(image);

6. 实际应用中的选择

  • 简单需求:使用ImageIcon更简单,操作步骤少,适合只需要固定大小和基本图片处理的场景。
  • 复杂需求:使用Image更灵活,支持对图片进行缩放、调整大小、处理颜色等操作,适合需要自定义图标显示效果的高级应用。

7. 示例代码

  • 使用ImageIcon
    JLabel label = new JLabel(new ImageIcon("a.png"));
  • 使用Image
    // 假设imagePath是一个有效路径Image image = toolkit.getImage(imagePath);BufferedImage bi = new BufferedImage=image.getWidth(), image.getHeight());Graphics2D g = bi.createGraphics();// 自定义绘制或缩放逻辑g.drawImage(image, 0, 0, bi.getWidth(), bi.getHeight(), Image.SCALE_default, null);g.dispose();JLabel label = new JLabel(new ImageIcon(bi));

8. 注意事项

  • 性能优化:选择合适的缩放算法,如SCALE_SMOOTH平滑缩放,SCALE_FAST优化缩放速度。此外,图片预加载可以避免第一次绘制时的延迟。
  • 代码规范:确保图片路径正确无误,处理不同移动设备或窗口尺寸时,图片显示适当缩放。

总结

ImageIcon和Image都是有效的图标处理工具,但在不同的场景中选择合适的工具会让开发更高效。Image提供了更高的灵活性,适合需要复杂图片处理的场合,而ImageIcon则更简单易用,适合常规的图标显示需求。理解它们的区别和使用场景,是在Java Swing开发中掌握的重要技能。

转载地址:http://xkejz.baihongyu.com/

你可能感兴趣的文章
oracle零碎要点---oracle em的web访问地址忘了
查看>>
Oracle零碎要点---多表联合查询,收集数据库基本资料
查看>>
Oracle静默安装
查看>>
Oracle面试题:Oracle中truncate和delete的区别
查看>>
ThreadLocal线程内部存储类
查看>>
thinkphp 常用SQL执行语句总结
查看>>
Oracle:ORA-00911: 无效字符
查看>>
Text-to-Image with Diffusion models的巅峰之作:深入解读 DALL·E 2
查看>>
TCP基本入门-简单认识一下什么是TCP
查看>>
tableviewcell 中使用autolayout自适应高度
查看>>
Orcale表被锁
查看>>
svn访问报错500
查看>>
Orderer节点启动报错解决方案:Not bootstrapping because of 3 existing channels
查看>>
org.apache.ibatis.exceptions.PersistenceException:
查看>>
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned
查看>>
org.apache.ibatis.type.TypeException: Could not resolve type alias 'xxxx'异常
查看>>
org.apache.poi.hssf.util.Region
查看>>
org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;
查看>>
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /
查看>>
org.hibernate.HibernateException: Unable to get the default Bean Validation factory
查看>>