《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.3.3 实用示例

简介: 本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第3章 ,第3.3.3节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3.3 实用示例

在本节中,我们将要介绍一个实用的示例程序,用来说明在实际环境中XML的用法。请回忆一下卷Ⅰ第12章,GridBagLayout是Swing构件中最有用的布局管理器。然而,人们都很畏惧它,这不仅是因为它的复杂性,还因为其编码冗长乏味。把布局描述放到一个文本文件中来替代大量重复代码将会带来很大便利。在本节中,你将看到怎样用XML来描述网格组(grid bag)布局和怎样解析布局文件。
网格组是由行和列构成的,它和HTML表格非常相似。与HTML表格相似的是,我们把它描述成一个行的序列,每个行都包含若干单元格:
image

有些单元格可以跨多行多列。在网格组布局中,这是通过将gridwidth和gridheight设置为大于1的值来实现的。我们将使用相同的名字作为属性名:
image

同样,我们将属性应用于网格组的其他约束:f?ill、anchor、gridx、gridy、weightx、weighty、ipadx和ipady。(我们不处理insets约束,因为它的值不是简单类型,但是要支持它也是很简单的。)例如:
image

对大多数属性,我们都提供了与为GridBagConstraints的无参构造器所提供的默认值相同的默认值:
image

gridx和gridy的值受到了特殊处理,因为如果手工设定会很冗长且易于出错。因此,提供它们的值是一项可选操作:
image

如果没有提供这些值,程序会通过如下的启发式方法来确定它们:在第0列,gridx的默认值是0;否则,它是前面的gridx加上前面的gridwidth;gridy的默认值总是与行数相同。这样,在大多数跨越多行的情况下,你都不必指定gridx和gridy的值。但是,如果一个构件跨越多列,那么每当要跨过这个构件时,就必须指定gridx。
注意:网格组专家可能会奇怪,我们为什么不使用RELATIVE和REMAINDER机制让网格组布局自动确定gridx和gridy的位置呢?我们试过这种方法,但是怎么也不能产生图3-4中那个字体对话框示例的布局。阅读了GridBagLayout的源代码后,我们发现,很明显,它的算法没有完成恢复绝对位置所必需的繁重任务。
image

这个程序对属性进行解析,并且设置了网格组的约束条件。例如,要读取网格宽度,程序只需包含下面这行语句:
image

程序不必担心属性的缺失,因为当文档中没有指定任何其他的值时,解析器会自动提供其默认值。
如果要测试是否指定了gridx或gridy属性,我们可以调用getAttribute方法来检查它是否返回空串:
image

我们发现允许单元格包含任意对象会显得很方便,这使我们能够指定如边界那样的非构件类型。我们只要求这些对象属于这样的类:它具有一个默认构造器,而对每个属性都提供了相应的获取器(getter)/ 设置器(setter)对。(例如被称为JavaBean的类。)
bean是由一个类名和0或多个属性定义的:
image

属性包含一个名字和一个值。
image

把字符串用标签围起来似乎有点麻烦。为什么不只用#PCDATA表示字符串而只留下用于其他类型的标签呢?因为那样我们就需要使用混合式内容,并且会把value元素的规则弱化为:

这样的规则允许由任意文本和标签构成的混合内容。
程序可以使用BeanInfo类来设置属性,而BeanInfo可以枚举bean的属性描述符。我们用匹配名字的方式来查找属性,然后调用它的setter方法来设置其值。
当我们的程序读入一个用户界面描述时,它有足够的信息来构建和布局用户界面构件。但是,当然,这个界面是死的,因为它没有事件监听器。如果要添加事件监听器,我们必须先定位构件。因为这个缘故,我们为每个bean提供了ID类型的可选属性:
image

例如,下面是一个带有ID的组合框:
image

注意:在这个示例中,我们只使用了XML来描述构件布局,而把在Java代码中添加事件处理器的工作留给了程序员。你可以更进一步,将该代码添加到XML描述中去。最有前途的方式是用JavaScript这样的脚本语言来编码这种代码。如果你想添加这样的增强功能,请参考第8章描述的Nashorn JavaScript解释器。
程序清单3-2的程序显示了如何使用GridBagPane类来完成设定网格组布局时所有的无聊工作,这个布局是在程序清单3-4中定义的。图3-4显示了运行结果。该程序只初始化了组合框(这项工作对于GridBagPane支持的bean属性设定机制来说过于复杂了)和添加事件监听器;程序清单3-3中的GridBagPane类用于解析XML文件,构造构件并放置它们;程序清单3-5显示的是DTD文件。
如果选择了包含字符串-Schema的文件,那么该程序除了DTD,还可以处理Schema。
程序清单3-6就包含了这样的Schema。
这个例子是XML的典型用法。XML格式十分健壮,足以表达复杂的关系。在此基础上,通过接管有效性检查和提供默认值等例行工作,XML解析器添加了新的价值。
程序清单3-2 read/GridBagTest.java
image
image
image

程序清单3-3 read/GridBagPane.java
image
image
image
image
image
image
image
image
image
image
image
image
image
image

相关文章
|
2月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
377 5
|
3月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
481 3
|
3月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
422 0
Java API 开发者
121 0
|
5月前
|
安全 Java 网络安全
Java 实现 SMTP 协议调用的详细示例及实战指南 SMTP Java 调用示例
本文介绍了如何使用Java调用SMTP协议发送邮件,涵盖SMTP基本概念、JavaMail API配置、代码实现及注意事项,适合Java开发者快速掌握邮件发送功能集成。
561 0
|
5月前
|
算法 搜索推荐 Java
Java中的Collections.shuffle()方法及示例
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,支持原地修改。可选传入自定义 `Random` 对象以实现结果可重复,适用于抽奖、游戏、随机抽样等场景。
229 0
|
6月前
|
存储 安全 Java
应届生面试高频 Java 基础问题及实操示例解析
本文总结了Java基础面试中的高频考点,包括数据类型分类、final修饰符的三种用途、static关键字特性、==与equals的区别、Java只有值传递的特性、String的不可变性、Error与Exception的差异、程序初始化顺序规则,以及IO流的字节流/字符流分类。每个问题都配有简明定义和典型示例,如用final修饰变量示例、static方法调用限制说明等,帮助应聘者快速掌握核心概念和实际应用场景。
135 0
|
6月前
|
Java 关系型数据库 MySQL
2025 年互联网公司校招 Java 面试题总结及答案实操示例解析
本项目基于Spring Boot 3与Java 17技术栈,围绕校园招聘常见面试题,提供核心知识点的实操示例。涵盖多线程、RESTful API设计、数据库操作(Spring Data JPA)、事务管理及异常处理等。通过完整代码实现与运行步骤,帮助理解用户管理、线程池配置等实际应用场景。资源包含项目结构、关键代码示例(如User实体类、UserService服务层、ThreadService多线程实现)及数据库迁移脚本,适合深入学习与实践。环境要求:JDK 17+、Maven 3.8+、MySQL 8.0+。
253 3
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
400 38