提起AWT的标签控件Label,那个使用体验可真叫糟糕,不但不支持文字换行,而且对中文很不友好,既可能把中文显示为乱码,还不支持博大精深的各种中文字体。所幸Swing的升级版标签JLabel在各方面都做了优化,使之成为一个功能强大的标签控件,那么到底JLabel拥有哪些提升之处呢?且待笔者一一道来。

首先看JLabel相较Label增加的新方法,这些方法主要有下列几个:
setOpaque:设置标签的背景是否为不透明。true表示不透明,false表示透明。注意如果想让setBackground方法设置的背景色生效,就必须调用setOpaque方法设置为true。
setHorizontalAlignment:设置标签文字在水平方向的对齐方式。
setVerticalAlignment:设置标签文字在垂直方向的对齐方式。
由于JLabel支持显示多行文字,因此内部文字的对齐方式被分解为水平方向与垂直方向两种,各自对应setHorizontalAlignment与setVerticalAlignment,于是JLabel不再提供setAlignment这种未区分方向的对齐方法了。

其次,JLabel的setFont方法支持中文字体,而非AWT的Label那样无动于衷。本来字体工具Font的构造方法就有三个参数,第一个参数表示字体名称,第二个参数表示字体类型,第三个参数表示文字大小,然而对于AWT的Label来说,字体名称的参数根本没作用,无论填楷体还是隶书,展示出来的依旧是默认的宋体。如今JLabel控件总算真正启用前述的字体名称参数了,只要在Font的构造方法中填入“楷体”或者“隶书”或者其它中文字体的名称,界面就会让文本显示对应的中文字体。比如下面的代码片段打算在标签控件上展示楷体文字:

		JLabel label = new JLabel(); // JLabel无需另外设置文件的字符编码
label.setPreferredSize(new Dimension(350, 100)); // 设置标签的推荐宽高
label.setFont(new Font("楷体", Font.PLAIN, 25)); // 设置标签文字的字体与大小
// 设置标签的文本。注意换行符\n不管用
label.setText("床前明月光,疑是地上霜。\n举头望明月,低头思故乡。");
label.setHorizontalAlignment(JLabel.LEFT); // 设置标签文字在水平方向的对齐方式
label.setVerticalAlignment(JLabel.CENTER); // 设置标签文字在垂直方向的对齐方式
label.setOpaque(true); // 设置标签为不透明
label.setBackground(Color.WHITE); // 设置标签的背景色

运行上面的测试代码,弹出的程序窗口如下图所示,可见界面上的汉字终于显示为楷体了。


不过按照以上的界面效果,标签的内部文本仍然没有换行,即使在字符串中添加换行符也不行。这是因为JLabel的setText方法通过HTML标记完成换行操作,倘若要求标签控件对超长的文本串自动换行,则需将该文本串用html标签包裹起来。也就是说:在字符串的开头添加“<html>”,在字符串的结尾添加“</html>”。如此一来,能够自动换行的文本设置代码要改成如下这样:

				// 设置按钮的文本(自动换行)
label.setText("<html>床前明月光,疑是地上霜。举头望明月,低头思故乡。</html>");

运行修改后的测试代码,弹出的程序窗口如下图所示,可见一行塞不下的文字被自动另起一行,而不是像刚才那样被省略号所代替了。


可是自动换行依赖于控件的宽度,只有填满一行之后,剩余的文字才会换到下一行。有时候我们希望文本串在某个位置必须换行,譬如那首唐诗《静夜思》,理应在句号处就要换行,这样才算对仗工整的五言绝句。之所以换行符在setText方法中不起作用,是因为换行符只在纯文本的情况下才有效,它在HTML格式的网页文本中并不奏效,真正管用的是HTML文本专用的换行标记“<br>”。以下便是在绝句中间添加“<br>”的代码例子:

				// 设置按钮的文本(手动换行)
label.setText("<html>床前明月光,疑是地上霜。<br>举头望明月,低头思故乡。</html>");

运行添加了换行标记的测试代码,弹出的程序窗口如下图所示,可见这首唐诗果然在句号处提前换行。


采取HTML标签不仅仅是为了换行,更是为了个性化定制丰富的样式风格。原本setFont方法只能给当前文本设置统一的字体及其大小,现在利用HTML标签可以对局部文本分别设置不同的样式,例如<font></font>这对标记支持设置文本的颜色与大小,标记对<b></b>支持将文本设置为粗体,标记对<i></i>支持将文本设置为斜体。接下来通过HTML标签分别包裹《静夜思》中的每句诗,包括红字、黄字、粗体、斜体等多种风格,具体的演示代码示例如下:

	// 设置按钮的文本(分段设置不同的文字颜色)
label.setText("<html><font color='red'>床前明月光,</font><b>疑是地上霜。</b><br><font color='yellow'>举头望明月,</font><i>低头思故乡。</i></html>");

运行上述的风格演示代码,弹出的程序窗口如下图所示,可见事先设定的文字样式纷纷呈现了出来。


更多Java技术文章参见《Java开发笔记(序)章节目录

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

  1. Java开发笔记(二十七)数值包装类型

    方法的出现缘起优化代码结构,但它的意义并不局限于此,正因为有了方法定义,编程语言才更像一门能解决实际问题的工具,而不仅仅是只能用于加减乘除的计算器.在数学的发展过程中,为了表示四则运算,人们创造了加减 ...

  2. Java开发笔记(六十七)清单:ArrayList和LinkedList

    前面介绍了集合与映射两类容器,它们的共同特点是每个元素都是唯一的,并且采用二叉树方式的类型还自带有序性.然而这两个特点也存在弊端:其一,为啥内部元素必须是唯一的呢?像手机店卖出了两部Mate20,虽然 ...

  3. Java开发笔记(七十七)使用Optional规避空指针异常

    前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...

  4. Java开发笔记(九十七)利用Runnable启动线程

    前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...

  5. Java开发笔记(八十七)随机访问文件的读写

    前面介绍了字符流读写文件的两种方式,包括文件字符流和缓存字符流,但是它们的写操作都存在一个问题:不管是write方法还是append方法,都只能从文件开头写入,而不能追加到文件末尾或者在文件中间某个位 ...

  6. Java开发笔记(二十三)数组工具Arrays

    数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较.数组复制.数组排序等等.为此Java专门设计了Arrays工具,该工具包含了几个常用方法,方便程序员对数组进行加工操作 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 悲伤的 C++ throw(…)

    当在C++语言中引入异常时,引入了相应的throw(…)动态异常说明符,注释了哪些异常可以由函数抛出.比如: // this function might throw an integer or a ...

  2. circus web console 依赖tornado>3.2 无法访问的bug

    circus web console 是一个很不错的web 监控circus 工具,但是对于高版本一直存在一个bug 信息如下 Traceback (most recent call last): F ...

  3. Html结构标准

    < ! doctype html> 声明文档类型 <html> 根标签 <head> 头标签 <title></title> 标题标签 &l ...

  4. 2-STM32+W5500+GPRS(2G)基础篇-(W5500-学习说明)

    https://www.cnblogs.com/yangfengwu/p/11220042.html 定版: 这一节先直接说明怎么把官方的源码应用在我做的这块开发板上 https://www.w550 ...

  5. [RN] React Native 下列表 FlatList 和 SectionList

    1.FlatList FlatList组件用于显示一个垂直的滚动列表,其中的元素之间结构近似而仅数据不同. FlatList更适于长列表数据,且元素个数可以增删.和ScrollView不同的是,Fla ...

  6. rust-vmm 学习(二)

    eventfd virtio中,guest和vhost通过evnetfd通知对方,见(Virtio ring and virtio-net). REF: Qemu-kvm的ioeventfd创建与触发 ...

  7. Dubbo+zookeeper实现单表的增删改查

    1.数据库准备 建表语句 CREATE TABLE `tb_brand` ( `id` ) NOT NULL AUTO_INCREMENT, `name` ) DEFAULT NULL COMMENT ...

  8. hdu1002 A + B Problem II[大数加法]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu1002 题干 代码和解释 由题意这是一个涉及到大数的加法问题.去看了一眼大数加法的方法感觉头很大,然后突然发现Java可以流氓解决大数问题,毅 ...

  9. python 图片格式转换png转jpg,如何利用python给图片添加半透明水印

    from PIL import Imageim = Image.open(r'd:\test2.png')r, g, b, a = im.split()im = Image.merge("R ...

  10. Netty 多客户端连接与通信

    实现场景: 聊天 服务端,客户端A,客户端B,客户端C.当客户端发送消息给服务端后,服务端在将这条消息广播个所有客户端户端A,客户端B,客户端C. 需求1: 客户端上线后,会通知所有客户端上线. 如客 ...