前面提过,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开发笔记(序)章节目录》

转载于:https://www.cnblogs.com/pinlantu/p/11240944.html

Java开发笔记(一百二十八)Swing的图标相关推荐

  1. java学习笔记(二十八)——开发一个小项目(VMeeting3.0)

    上篇文章按照较规范的产品需求文档梳理了项目的逻辑,感觉开发起来明晰了很多:挂上一篇文章java学习笔记(二十七)--开发一个小项目(VMeeting2.0)_Biangbangbing的博客-CSDN ...

  2. 【Java学习笔记之二十八】深入了解Java8新特性

    前言: Java 8 已经发布很久了,很多报道表明java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java ...

  3. Android开发笔记(二十八)利用Application实现内存读写

    全局变量 C/C++有所谓的全局变量,因为全局变量保存在内存中,所以操作全局变量就是操作内存,其速度远比操作数据库或者操作文件快得多,而且工程里的任何代码都可以引用全局变量,因此很多时候全局变量是共享 ...

  4. 易课寄在线购课系统开发笔记(二十八)--完成用户注册功能

    用户注册 功能分析 请求的 url:/user/register 参数:表单的数据:username.password.phone.email 返回值:JSON 数据.ECoursesResult 接 ...

  5. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  6. Android开发笔记(六十八)工程库打包

    写好一个Android模块,比如说一个自定义控件或某个功能的sdk,然后开放出来给别人使用,就得通过某种方式把源码提供给对方.常见的打包方式有: 一.直接给源码,由开发者把代码加入到自己的工程中 该方 ...

  7. Android开发笔记(二十四)res目录的结构与配置

    res目录结构 res是Android项目工程中存放各类的目录,主要包括布局.图形与配置等等.res的子目录主要有: anim : 存放动画的描述文件 drawable : 存放各类图形的描述文件,包 ...

  8. JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤...

    JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...

  9. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  10. JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤

    JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...

最新文章

  1. [eslint-plugin-vue] [vue/no-unused-vars] 'scope' is defined but never used.
  2. 华三交换机VLAN 篇
  3. “约见”面试官系列之常见面试题之第八十四篇之手写promise(建议收藏)
  4. SpringMVC 中设置日期字符串转换格式
  5. 传京东最快6月将在香港二次上市 已以保密形式提交上市申请
  6. 谷歌Linux基金会等联合推出开源软件签名服务 sigstore,提振软件供应链安全
  7. python显示当前日期_python显示当前时间
  8. DolphinPHP(海豚PHP)实战教程
  9. 使用JQuery快速高效制作网页交互特效 第十一章 蔚蓝网项目
  10. EDA与VHDL题目——七人表决器
  11. Unity快速安装教程
  12. r语言如何计算t分布临界值_医学统计与R语言:这个Calibration plot有点色!
  13. Spark高频面试题总结
  14. TypeScript等无法获取到歌曲播放的位置信息时,关于歌曲的续播
  15. 阿里巴巴大数据之路-维度设计
  16. 树莓派Pico开发版
  17. Failed to introspect Class from LaunchedURLClassLoader
  18. 一起来学Kotlin:概念:7. Kotlin 函数介绍:扩展函数,中缀函数,运算符函数,带有varrag输入的函数
  19. 想配个电脑玩魔兽世界9.0,要什么配置,大概多少钱?
  20. 湘潭大学计算机考研拟录取,湘潭大学2019年硕士研究生拟录取考生公示名单

热门文章

  1. java基础总结07-异常
  2. @RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法
  3. Java中为什么使用事务?什么时候使用事务?如何使用事务?
  4. jacoco+maven 初次使用覆盖率工具
  5. Codeforces 1110D. Jongmah 动态规划
  6. 定时器事件QtimerEvent 随机数 qrand Qtimer定时器
  7. Tarjan算法——强连通分量
  8. Magento 使用心得
  9. SQL日期格式化处理
  10. 如何使用STL寫XML轉檔程式? (C/C++) (STL) (Web) (XML)