|
文章索引
开发用户图形界面 (GUI) 曾是 Java 技术编程中一个很棘手的方面。虽然 Java Foundation Classes/Swing (JFC/Swing) 技术已经推出一段时间,但是在设计专业级、跨平台的 GUI 方面仍然繁杂且容易出错。这一切都将随 NetBeans IDE 5.0 和 Project Matisse 的出现而改变。
Project Matisse 解决了 GUI 创建的核心问题,使可视化窗体的布局设计更加容易。该项目对 NetBeans IDE 4.1 Form Editor 进行了扩展,支持自由设计范例,自由设计范例的规则简单,易学易用。
NetBeans IDE 软件工程师 Roman Strobl 访问了 Project Matisse 的创建者 Scott Violet 和 Tomas Pavek。
你们在 Project Matisse 中扮演什么角色?你们参加这个项目有多长时间呢?
 Pavek:在 NetBeans,我是 GUI builder 的主要开发人员,现在主要负责 Project Matisse 的工作。这个新的布局设计支持项目是在一年前开始的。
Violet:我是 Swing 的架构师,一直负责该项目中使这个系统加入到 Java Development Kit (JDK) 的那部分工作。我从一开始就参与了 Matisse 项目。
Project Matisse 的起源和目标
Project Matisse 是怎样开始的?它的目标是什么?
 Violet:我们已经对几乎所有 Swing 计划会话的布局进程感到遗憾。特别是,大多数现有的 builder 要求您了解布局管理器。至少这是令人痛苦的的事情。开发人员不应被迫了解 GridBagLayout 的全部古怪用法或 LayoutManager 底层才能创建令人满意的可视化窗体。这就是 Matisse 所追求的目标。
Pavek:NetBeans GUI builder 包含一个 GridBag 定制器 -- 一个被广泛应用的用于配置 GridBagLayout 的工具。了解并熟悉 GridBagLayout 是非常有用的。我们经常收到增强要求以改善该定制器。这些要求寻求更丰富的设计时间支持、更易于可视化操作、更好的布局限制预设值等等。
我意识到开发人员实际上是需要设计大体的布局。他们希望 GUI builder 能够从 GridBagLayout 中提取出来。这时,我开始考虑不受任何特定布局管理器限制的自然布局支持。我必须说的是我曾认为这是个无法实现的疯狂想法。
同时,在一次国内的 GUI 讨论会上,我们演示了 NetBeans GUI builder,并且我们听到了相同的观点。GUI builder 是不错的,但是为什么你们必须处理所有的填充方法、插入、填充、权重及其他参数。我们不能拥有更高水平的、更加可视化、当然也是更易于使用的工具吗?我们抓住这个机会结识了 Swing 工作组的工程师。他们同样也对支持可视化布局设计的工具的状况表示失望。
简单讨论后,我们认为问题不在于布局管理器,而在于对他们过多的暴露。布局管理器很适合构建结果实现的用户界面 (UI),但不适于用作交互式可视化工具中的表现原则。
这正符合我最初的自然布局的想法。实现这个想法的方式不是寻找另一个布局管理器并为其创建一个新工具,而是确定开发人员需要从 GUI 布局设计工具获得什么。也就是说,可视化工具怎样才能用于操作组件、建立组件关系、排列组件及设置组件大小等?所有这些都必须是可视的、简单的且直观的。同时,这个可视化工具还需要比得上现有 Apple 或 Microsoft 工具。开发人员也没必要查看底层的细节,也不必知道布局是如何构建的。当然,布局管理器对于布局的适当工作是必要的,但是我们不需要以它作为开始。最重要的事情是用户的模型。
我们完成第一个模型后,每一个看到它的人都大吃一惊。我们开始相信我们的方法是正确的。
创建新的布局管理器
据我所知,新的布局管理器最初并不是这个项目的目标。为什么你们会决定创建一个新的布局管理器,而不是重新使用一个现有的布局管理器?
 Violet:将布局过程从布局管理器中提取出来的一大特点是,考虑了无限的可能性。不幸的是,我们无法找到适合我们需求的工具,因此我们创建了一个新的工具。这个布局管理器被命名为 GroupLayout,是一个开源项目。当然,使用 GroupLayout 对于 Matisse 是必需的,我们的期望是使用 Matisse 的开发人员永远不必与 GroupLayout 直接交互。至少这是我们的目标。
从某个角度说,我们也愿意将 GroupLayout 加入到 JDK 中。
Pavek:正如 Scott 所说的,您在使用 Matisse 的时候根本不会注意到布局管理器。但是,这个布局管理器对于手工编写代码是非常方便的,并且可以独立于 Matisse 使用。从 Scott 提到的 GroupLayout 网站,你可以下载整个支持文本基线对齐和基于特定于外观的准线首选间距的库。
我们最初的目标不是开发新的布局管理器或进行其他扩展。但是正是因为当前的 JDK 缺乏功能,我们也不希望极大地限制这个工具的功能。至少我们需要基线支持和首选间距。我们也需要能够使用这些新功能,并能处理 Matisse 产生的布局结构的布局管理器。GridBagLayout 的功能还不够强大,并且使用 SpringLayout 也是很痛苦的事情。
有人认为 Matisse 布局使用 -- GroupLayout -- 作为专用工具。例如,一个 Eclipse 开发人员说:“我们可以使 Visual Editor 就像 Matisse 一样进行工作,但是无需求助于专用的布局管理器。”GroupLayout 是专用的吗?
 Violet:GroupLayout 及其功能的专用程度与 GTK 一样。GroupLayout 已经开放源代码 (LGPL)。
如果需要将新的布局管理器与使用 Matisse 创建的应用程序绑定,则应用程序好像更难于部署。你们打算什么时候将其添加到标准 JDK 发布版本中?
 Violet:我们已经计划将其添加到 JDK,但是开发周期中 GroupLayout 太慢,不能加入 Java Platform、Standard Edition(Java SE,正式地称为 J2SE)版本 6。另外,我们不希望开发人员在可以使用 Matisse 之前一直等待版本 6 的发布。我们的目标是支持 J2SE 1.4.2!出于这种需求,需要一个外部库。如果一切顺利的话,我们将在 JDK 版本 7 中加入 GroupLayout。
Pavek:我们对附加库不感兴趣,但是希望这不是一个太大的问题。现在使用外部库是很普通的事情:任何大型项目仅以标准 JDK 类为基础是很难的。这个库相当小,是开放源代码的,随 NetBeans 自动获取。正如 Scott 所说,在 GroupLayout 能以适当的方式融入 JDK 中之前,这仅仅是个临时的解决方案。
我还想强调的是 Matisse 并没有替代以前的 NetBeans GUI builder -- 只是对 NetBeans GUI builder 进行了扩展。仍然可以原来的方法(通过使用标准布局管理器)开发窗体。
一些人说 Matisse 只是 Java 技术版的 Macintosh 操作系统 Interface Builder (IB)。你们从这个工具获得了多少启发?
 Violet:Matisse 与 Interface Builder 共享相似之处,这并不奇怪。IB 是目前开发出的最好的构建工具之一。它允许开发人员拖曳和放置组件,就像是在绘制程序。但是 IB 和 AppKit 与 Swing 还是有很大的区别。特别是,Swing 运行在多数操作系统上,并支持各种外观。因此,布局必须适应组件尺寸因外观、位置和操作系统的不同进行更改,无需每种外观、平台和位置都对应一个窗体。我们来想象一下,在一个应用程序中,每种位置、操作系统和外观的组合都需要一个新窗体,尝试编写这样的应用程序会是多么痛苦的事情!噢!
Matisse 解决了所有这些问题。所有在 Matisse 中设计的窗体将适应因位置、外观或操作系统变化而引起的组件尺寸变化。
Pavek:最主要的区别是使用 Matisse 你将能够完全跨平台的进行布局。这意味着,当你将组件放入设计框架内时,组件的位置和大小并没有以绝对数值确定下来,而是在目标环境中运行时进行动态计算。Matisse 将创建布局模型来记忆组件之间的关系,并且 GroupLayout 动态维护这些关系。这就是说,当你执行捕捉功能并加组件放置在某个地方后,组件不仅仅收到一个位置坐标,而且会记住为什么进行捕捉。例如,组件与另一个组件沿着左边缘对齐,那么即使两个组件的绝对位置变化了,他们仍然保持左边缘对齐。
关于双路编辑和保护模块
很多开发人员希望看到 NetBeans 中的双路编辑 -- 使用可视化设计器和编辑器。一些可视化设计器已经允许使用这种方法,但是 NetBeans IDE 使用保护块防止用户编辑代码。你们为什么选择这种保护方法?
 Pavek:NetBeans 已经有很久的历史了。很多年前就做出了这个决定,而且可能是由资源推动的。为 Java 技术 GUI 创建一个双路编辑工具也是有价值的。从理论上说,这个工具永远不能完美运行,尽管在实践中有一个足够好的工具是可行的。尽管如此,你还会面临精力不足的问题,这种情况下,工具无法理解代码部分且无法为可视化操作构建整个 UI。NetBeans GUI builder 中这方面是百分之百可靠的。
实际上保护代码并没有妨碍你做任何事情。NetBeans 提供了连接,这样你可以改变生成的代码,并插入你自己的代码。而且,你可以在保护块外的任何地方(即,在类构造方法中)自由添加附加修改。最初使用该方法你可能觉得不太适应,但是我觉得最终它会成为一个非常自然的习惯。
不过,双路编辑的确很流行,有着广泛的需求,因此我们不能忽略它。现在我不能表明我们是否开发双路编辑。但是可以肯定我们希望解决未涉及的主要使用用例,即从现有代码导入 UI。这是我们所收到的要求实现的功能之一。
Violet:这是一个热点话题,但是我认为代码生成是一种错误的方式。代码生成会鼓励开发人员胡乱修改代码。另外,生成代码会鼓励开发人员最终得到具有布局、组件创建、事件捆绑和功能的大型粗糙类。从长远角度出发,我希望 builder 开始使用 beans 持久或其他持久形式。这样,开发人员不会感觉有修改代码的需要,并且还有希望生成更具可读性的与 UI 相关的类。
Pavek:我同意。因为缺少适合的和标准的持久形式,上述情况还没有发生。现在的 bean 持久似乎功能还不够强大。从历史角度说,Swing UI 也是通过代码的最佳表示:每个人以这种方式认识它,并且如果出现错误,希望查看代码。这就是双路编辑如此流行的原因。如果 Swing 从一开始就包括声明持久就好了!但这又是另外一回事了。
Project Matisse 的实力和挑战
Matisse 有哪些能力?你认为该项目在哪些方面领先于其他可视化编辑器?
 Pavek:Matisse 综合了 Apple 或 Microsoft 的工具提供的轻松设计,同时生成了跨平台 UI,像使用布局管理器时。我想,这是独一无二的融合。
Violet:Matisse 的能力在于它使那些对 Java 技术陌生的开发人员可以生成窗体,该窗体遵循外观的可视化准线、沿着其基线对齐组件,且根据任何外观、位置和操作系统的组合适当调整大小。他们可以完成这一切操作而无需了解 LayoutManager 的细节。这是其他很多 builder 所不能实现的。
在 Matisse 工作中什么是最具挑战的问题?
 Pavek:一开始,我们努力寻找一个布局概念,可用于用户友好的设计交互,且有足够的能力以创建典型布局。首先,我们尝试任意相关组件边缘的类似于 SpringLayout 的概念,这个概念最终因为过于开放而结束;也尝试了组件网格的类似于表布局的概念,这个概念难于实现合适的跨平台布局。很快这两个概念就被放弃了。然后我们开发了介于两者之间的方法:一种融合了两者实力的嵌套组布局系统。
在交互方面,我们必须处理用户表达的含混性。用户放置一个组件时,通常有一种以上的方法来排列底层模型。但是我们无法读到用户的想法。工具可能会执行一些不同于用户所期望的事情,但是它应该始终以用户可以理解的方式进行操作,无需让用户感觉到屏幕后正在发生着奇怪的、复杂的事情 - 而实际上这些事情正在发生。
另一个具有挑战性的领域是布局结构可视化 -- 即,显示组件的关系、对齐方式和调整大小等。这个工具必须易于使用,因此我们不能完全展示内部结构的全部细节。但是,为了明白布局将执行什么及执行的原因,某种程度的信息是必需的。毕竟,跨平台布局并不是无价值的事情。
Violet:无疑,最大的挑战是如何将用户表达映射到作为结果的布局管理器。我的意思是说,当你在按钮前放置文本字段时、移动按钮时,LayoutManager 应怎么办。听起来是微不足道的,但是当你考虑需要维持组件间关系以便适应尺寸变化时,你将意识到这并不是件简单的事情!
关于前面的路
你们未来的计划是什么?你认为 IDE 5.0 已经带来了最令人感兴趣的功能,还是 5.0 版后还有更大的创新空间?
 Violet:我们永远不会完成。Matisse 本身将继续进行改进,近期会在可用性和稳定性方面进行改进。5.0 版后,你可能会看到一些有趣的东西正被添加到 Matisse 中。从长远角度说,我们也不缺乏想法。这里是我们已考虑的一些事情:
- 提供将模板用作窗体起点的功能。除了两三个领域外,很多窗体是非常相似的。如果有一种方法可以从相似窗体开始,并对此进行自定义,那将是令人高兴的事情。这就类似于在 StarOffice 或 PowerPoint 中选择不同模板。
- 更易于开发人员编写将组件绑定到数据所需的大量代码。在 SwingLabs 中正在进行这项工作。
- 提供编写标准持久文件的能力,而不是代码生成。
- 使编写和维护中大型应用程序更容易。我不能十分确定会带来什么窗体,但毫不疑问,这将带来 NetBeans 和 Swing 中的变化。
Pavek:补充说明几点:
- 根据我们收到的反馈,对 Matisse 进行调整和改进。在布局设计领域我们仍可添加大量有用的功能。只是我们不能在一个版本中加入所有东西。同样,一些东西需要时间来解决并找到他们的最佳形态。
- 修改 GUI builder 的其他部分,类似于我们对布局设计所作的操作 -- 即更加关注于设计 UI 而无需了解过多的 Swing 细节。
- 从源代码或受限双路编辑导入 UI。
- 为使用和开发自定义组件(在 JSR 273 中得到丰富的设计支持)、窗体的重用(可视化继承)和布局(模板和组件)提供更好的支持。
还有许多关于可用性和其他改进的计划。这些基本上是我们的想法。我还不知道这些想法怎样适合具体的计划和具体的版本。
有关更多信息
Project Matisse Matisse Demo NetBeans IDE 5.0 Beta 2 NetBeans 5.0 Beta 教程、指南和文章 JSR 273:Design-Time API for JavaBeans JBDT
关于作者
Roman Strobl,从事 NetBeans IDE 开发的软件工程师,本部在布拉格。他的博客定期突出显示在 blogs.sun.com 和 technorati.com 上。
|