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

Java开发笔记(一百二十八)Swing的图标的更多相关文章

  1. Java开发笔记(二十八)布尔包装类型

    前面介绍了数值包装类型,因为不管是整数还是小数,它们的运算操作都是类似的,所以只要学会了Integer的用法,其它数值包装类型即可一并掌握.但是对于布尔类型boolean来说,该类型定义的是“true ...

  2. Java开发笔记(三十八)利用正则表达式校验字符串

    前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...

  3. Java开发笔记(二十九)大整数BigInteger

    早期的编程语言为了节约计算机的内存,给数字变量定义了各种存储规格的数值类型,比如字节型byte只占用一个字节大小,短整型short占用两个字节大小,整型int占用四个字节大小,长整型long占用八个字 ...

  4. Java开发笔记(二十四)方法的组成形式

    经过前面的学习,我们发现演示的Java代码越来越复杂,而且每个例子的代码都堆在入口方法main内部,这会导致如下问题:1.一个方法内部堆砌了太多的代码行,看着费神,维护起来也吃力:2.部分代码描述的是 ...

  5. Java开发笔记(二十五)方法的输入参数

    前面通过main方法介绍了方法的定义形式,对于方法的输入参数来说,还有几个值得注意的地方,接下来分别对输入参数的几种用法进行阐述.一个方法可以有输入参数,也可以没有输入参数,倘若无需输入参数,则方法定 ...

  6. Java开发笔记(二十六)方法的输出参数

    前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...

  7. Java开发笔记(四十八)类的简单继承

    前面介绍了类的基本用法,主要是如何封装一个类的各项要素,包括成员属性.成员方法.构造方法等,想必大家对类的简单运用早已驾轻就熟.所谓“物以类聚,人以群分”,之所以某些事物会聚在一起,乃是因为它们拥有类 ...

  8. Java开发笔记(五十八)简单接口及其实现

    前面介绍了抽象方法及抽象类的用法,看似解决了不确定行为的方法定义,既然叫唤动作允许声明为抽象方法,那么飞翔.游泳也能声明为抽象方法,并且鸡类涵盖的物种不够多,最好把这些行为动作扩展到鸟类这个群体,于是 ...

  9. Java开发笔记(六十八)从泛型方法探究泛型的起源

    前面介绍各种容器之时,通过在容器名称后面添加包裹数据类型的一对尖括号,表示该容器存放的是哪种类型的元素.这样一来总算把Java当中的各类括号都凑齐了,例如包裹一段代码的花括号.指定数组元素下标的方括号 ...

  10. Java开发笔记(七十八)面向对象的后门——反射

    作为一门面向对象的编程语言,Java认为一切皆是对象,每个对象都能归属于某个类,甚至每个类均可提取出一种特殊的类型,即Class类型.早在前面介绍多态的时候,就提到每个类都存在独一无二的基因,通过比较 ...

随机推荐

  1. Linear Discriminant Analysis Algorithm

    线性判别分析算法. 逻辑回归是一种分类算法,传统上仅限于两类分类问题. 如果有两个以上的类,那么线性判别分析算法是首选的线性分类技术.LDA的表示非常直接.它包括数据的统计属性,为每个类计算.对于单个 ...

  2. zeebe 0.20.0 集群部署试用

    zeebe 0.20.0 是生产可用的第一个版本,同时也有好多变动,以下是一个简单集群的运行以及一个简单 的运行说明 环境准备 docker-compose 文件   version: "3 ...

  3. 回文数 js 解法

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  4. [BZOJ1191]超级英雄Hero

    Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的 多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确 ...

  5. js constructor typeOf 区别

    constructor 属性返回对创建此对象的数组函数的引用. 例如:const obj = {a: 1}        console.log(obj.constructor)   // funct ...

  6. mysql 组合聚集函数

    mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...

  7. QML学习(二)——<QML语法>

    一.Qml类型 QML类型分为三类:基本类型.QML对象类型以及JavaScript类型 1 基本类型 我们可以再qt帮助文档中搜索基本类型查看 基本类型的概念是相对于QML对象类型而言的,QML 对 ...

  8. IDEA实现SpringBoot热部署

    1.pom.xml添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  9. shell中$(( ))、$( )、``与${ }的区别

    转 :shell $(( )).$( ).``与${ }的区别 $( )与` `(反引号)命令替换 在bash中,$( )与` `(反引号)都是用来作命令替换的.命令替换与变量替换差不多,都是用来重组 ...

  10. Vue简单归纳

    目录 Vue.JS Vue.JS介绍 概述 MVVM模式 示例图 快速入门 事件绑定 什么是事件 单击事件绑定 键盘事件 按键修饰符 鼠标事件 事件修饰符 数据绑定 插值 v-text v-bind ...