blob: 1c68e1c248e26cf373deafad5a02af6917d2073d [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>NetBeans IDE 6.0 中的 UI 设计</title>
<META NAME="keywords" CONTENT="netbeans, magazine, UI, Design, 6.0, NetBeans GUI Builder, Matisse, GUI, layout, visual, graphical user interface, 设计, 布局, 可视, 图形化用户界面">
<META NAME="description" CONTENT="NetBeans Magazine:用 NetBeans GUI Builder Matisse 在 NetBeans IDE 6.0 中进行 UI 设计">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
</head>
<body bgcolor="#FFFFFF" lang=PT-BR>
<style>
<!--
p.Noparagraphstyle, li.Noparagraphstyle, div.Noparagraphstyle
{line-height:120%;
text-autospace:none;
font-size:12.0pt;
font-family:Times;
color:black;}
p.NB-Corpo, li.NB-Corpo, div.NB-Corpo
{text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:.05pt;}
p.NB-Interttulo, li.NB-Interttulo, div.NB-Interttulo
{line-height:120%;
page-break-after:avoid;
text-autospace:none;
font-size:13.0pt;
font-family:"Verdana";
color:#A20018;
font-weight:bold;}
p.NB-Interttulo2, li.NB-Interttulo2, div.NB-Interttulo2
{line-height:12.0pt;
page-break-after:avoid;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:#D0780A;
font-weight:bold;}
p.NB-Notadica, li.NB-Notadica, div.NB-Notadica
{text-align:left;
line-height:13.0pt;
tab-stops:14.15pt;
text-autospace:none;
font-size:10.0pt;
font-family:"Verdana";
color:#D0780A;
letter-spacing:.05pt;}
p.NB-Legendaimagem, li.NB-Legendaimagem, div.NB-Legendaimagem
{line-height:12.0pt;
tab-stops:14.15pt;
text-autospace:none;
font-size:10.0pt;
font-family:"Verdana";
color:black;
letter-spacing:.05pt;}
span.NB-NegritoTcnico
{font-family:"Verdana";
color:black;
letter-spacing:.05pt;
font-weight:bold;
vertical-align:baseline;}
span.NB-Legendanegrito
{font-weight:bold;}
div.NB-Corpo1 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:.05pt;}
div.NB-Interttulo1 {line-height:120%;
page-break-after:avoid;
text-autospace:none;
font-size:13.0pt;
font-family:"Verdana";
color:#A20018;
font-weight:bold;}
div.NB-Interttulo21 {line-height:12.0pt;
page-break-after:avoid;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:#D0780A;
font-weight:bold;}
div.NB-Notadica1 {text-align:left;
line-height:13.0pt;
tab-stops:14.15pt;
text-autospace:none;
font-size:10.0pt;
font-family:"Verdana";
color:#D0780A;
letter-spacing:.05pt;}
div.Noparagraphstyle1 {line-height:120%;
text-autospace:none;
font-size:12.0pt;
font-family:Times;
color:black;}
li.NB-Corpo1 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:.05pt;}
li.NB-Interttulo1 {line-height:120%;
page-break-after:avoid;
text-autospace:none;
font-size:13.0pt;
font-family:"Verdana";
color:#A20018;
font-weight:bold;}
li.NB-Interttulo21 {line-height:12.0pt;
page-break-after:avoid;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:#D0780A;
font-weight:bold;}
li.NB-Notadica1 {text-align:left;
line-height:13.0pt;
tab-stops:14.15pt;
text-autospace:none;
font-size:10.0pt;
font-family:"Verdana";
color:#D0780A;
letter-spacing:.05pt;}
li.Noparagraphstyle1 {line-height:120%;
text-autospace:none;
font-size:12.0pt;
font-family:Times;
color:black;}
p.NB-Corpo1 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:.05pt;}
p.NB-Interttulo1 {line-height:120%;
page-break-after:avoid;
text-autospace:none;
font-size:13.0pt;
font-family:"Verdana";
color:#A20018;
font-weight:bold;}
p.NB-Interttulo21 {line-height:12.0pt;
page-break-after:avoid;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:#D0780A;
font-weight:bold;}
p.NB-Notadica1 {text-align:left;
line-height:13.0pt;
tab-stops:14.15pt;
text-autospace:none;
font-size:10.0pt;
font-family:"Verdana";
color:#D0780A;
letter-spacing:.05pt;}
p.Noparagraphstyle1 {line-height:120%;
text-autospace:none;
font-size:12.0pt;
font-family:Times;
color:black;}
span.NB-NegritoTcnico1 {font-family:"Verdana";
color:black;
letter-spacing:.05pt;
font-weight:bold;
vertical-align:baseline;}
p.NB-Corpo22 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo221 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo222 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo223 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo224 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo225 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo226 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo227 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo228 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo229 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo2251 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;
letter-spacing:-.05pt;}
p.NB-Corpo1111 {text-align:left;
text-indent:5.65pt;
line-height:16.0pt;
text-autospace:none;
font-size:9.0pt;
font-family:"Verdana";
color:black;}
.NB-Listagenstitulos {font-family: Verdana, Arial, Helvetica, sans-serif;
color: #FFFFFF;
font-size: 14px;}
.style4 {font-size: 11px; font-weight: bold; color: #BC001C;}
-->
</style>
<!-- Begin Content Area -->
<table width="770" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/top_matisse.jpg" alt="Title" width="770" height="200"></td>
</tr>
<tr>
<td height="82"><p class="NB-Corpo1"><strong>Beans Binding、Swing Application Framework 以及希望在 IDE 中实现的其它特性</strong></p></td>
</tr>
<tr>
<td><div class=Section1>
<p class=NB-Corpo1><span lang=EN-US>自NetBeans 5.0 以来,人们最常谈及的且具有创新性的特性是 Project Matisse 或 Form Editor。许多人都认为,在不同 IDE 产品和技术中, Matisse 是最好的用户界面设计器。因此,许多开发人员开始使用 NetBeans。 </span></p>
<p class=NB-Corpo1><span lang=EN-US>对于软件来说,革新和发展是永远没有尽头的。在本文中将看到,NetBeans 6.0 中许多新的 Matisse 特性有助于改进 Swing 应用程序的开发。</span><br>
</p>
<p class=NB-Interttulo1><span lang=EN-US>Beans Binding 和 Swing Application
Framework</span></p>
<p class=NB-Corpo1><span lang=EN-US>在基于最新的 JCP 规范 Beans Binding(JSR 295)和 Swing Application Framework(JSR 296)构建应用程序方面,NetBeans 6.0 为桌面开发人员提供了一些方便的特性;他们还会从更高效的开发中获益。一般的 Swing 应用程序开发人员会从 NetBeans 中的 Swing Application Framework 改进中获得比较大的收益,但是平台开发人员也不是一无所获。在 NetBeans Platform 中已经建立了一个基于 Swing 的应用程序框架,它提供的特性比 JSR 296 多得多。但是,Beans Binding 支持提供了更大的收益。</span><br>
</p>
<p class=NB-Interttulo21><span lang=EN-US>Beans Binding 支持</span></p>
<p class=NB-Corpo1><span lang=EN-US>Beans Binding 免去了在用户界面组件和数据类或 JavaBean 之间复制数据的繁琐工作。有了新的 Beans Binding 改进,就可以通过右击 UI 元素来访问 <i>Bind</i> 上下文菜单项。例如,选择某个</span><span
class=NB-NegritoTcnico1><span lang=EN-US style='font-size:10.0pt'>javax.swing.JTextField </span></span><span lang=EN-US> 的这个菜单项,就会显示首选的绑定属性 <i>text</i>(见<b>图&nbsp;1</b>)。可以通过属性检查器的 Binding 选项卡访问其它属性(<b>图&nbsp;2</b>)。</span></p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image001.png" width="343" height="177"></td>
</tr>
<tr>
<td><p class=NB-Corpo22><strong>图 1.</strong> Beans Binding 菜单项<br>
</p></td>
</tr>
</table>
<br>
<br>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image003.png" width="485" height="456"></td>
</tr>
<tr>
<td><p class=NB-Corpo221><strong>图 2.</strong> 为 JTextField 设置 Beans Binding 选项<br>
<br>
</p></td>
</tr>
</table>
<br>
<p class=NB-Corpo1><span lang=EN-US>选择了要绑定的属性之后,显示一个对话框,可以在这里选择目标 JavaBean。然后可以输入一个使用 Beans Binding Expression Language 的表达式。这种语言的语法与 JSP EL 非常相似。除了手工输入表达式之外,还可以使用一个选择器(它是以下拉列表或组合框访问的形式来访问的),通过展开属性和子属性快速构建表达式。</span></p>
<p class=NB-Corpo1><span lang=EN-US>在运行应用程序时,当选择的 UI 组件失去焦点或用户按回车时,它会更新它的绑定组件。重点是开发人员不再编写大量事件处理代码,来管理这个操作和其它操作。</span><br>
</p>
<p class=NB-Interttulo21><span lang=EN-US>Swing Application Framework 支持</span></p>
<p class=NB-Corpo1><span lang=EN-US>Swing Application Framework 提供了快速构建完整的桌面应用程序的机制。NetBeans 6 在 IDE 中集成了对这个框架的支持,同时提供一组标准图标,比如 Copy、Paste 和 Cut。这种方式比用 Swing 组件组装应用程序更方便,可以为启动或关闭应用程序、基本动作或事件、定制图标、资源管理器、会话存储等功能建立一个单独的解决方案,从而节省开发时间。 </span></p>
<p class=NB-Corpo1><span lang=EN-US>在 NetBeans 6 中创建 Swing Application Framework 项目的方法是选择 <i>File|New Project</i>,并在 General 类别下选择新的 Java Desktop Application 项目模板。到编写本文时,有两个应用程序模板:Basic 和 Database(见<b>图&nbsp;3</b>)。以后的版本会提供其它模板。例如,基于 Swing Application Framework 创建 web 客户机应用程序的模板。</span><br>
</p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image005.png" width="729" height="503"></td>
</tr>
<tr>
<td><p class=NB-Corpo222><strong>图 3.</strong> 选择桌面应用程序模板 <br>
</p></td>
</tr>
</table>
<p class=NB-Corpo1><span lang=EN-US>Basic 模板生成一个常规的 Swing 应用程序,包含 Cut、Copy、Paste、Save 和 New 等简单特性。用这个模板很容易创建 Notepad 或 KWrite 这样的简单应用程序(见<b>图&nbsp;4</b>)。 </span></p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image007.png" width="414" height="381"></td>
</tr>
<tr>
<td><p class=NB-Corpo223><strong>图 4.</strong> 用 Basic 模板生成的示例应用程序<br>
<br>
</p></td>
</tr>
</table>
<p class=NB-Corpo1><span lang=EN-US>Database 模板可以用来创建 CRUD 数据库应用程序。除了使用 Apache Derby/JavaDB 或 HSQLDB 之外,它也可以使用 Microsoft Access。 </span></p>
<p class=NB-Corpo1><span lang=EN-US style='letter-spacing:-.1pt'>对于我来说,Swing Application Framework 支持最适合开发比较简单的应用程序。以后采用 JSR 277(Java Module System)可能会更好些。但是,仅有模块系统并不能提供 NetBeans Platform 提供的所有组件和实用程序。对于比较复杂的应用程序,建议在 NetBeans Platform 上构建。从基于 Swing Application Framework 的应用程序迁移到基于 Platform 的应用程序的方法正在研究,但是到编写本文时还没有具体实现。 </span></p>
<p class=NB-Notadica1><span lang=EN-US><strong>注意:</strong>Swing Application Framework 和 NetBeans Platform 都是 Swing 框架。Swing Application Framework 提供应用程序生命周期管理、会话管理(例如,在应用程序重新启动时在相同的位置恢复窗口)、一个资源管理器、动作、存储、应用程序上下文以及同步和异步任务。除了提供所有这些特性之外,NetBeans Platform 还增加了许多其它特性,包括一个强大的模块/插件系统,允许模块在其它应用程序元素中安装自己的 UI 菜单、动作和服务。</span></p>
<p class=NB-Interttulo1><span lang=EN-US>其它新特性</span></p>
<p class=NB-Corpo1><span lang=EN-US>NetBeans 6 中增加的新特性包括一个新的可视菜单设计器、对 Protected Code Customizer 的改进、组件的居中以及对 Free Design 的首选间隙和复制粘贴支持的改进。 </span></p>
<p class=NB-Corpo1><span lang=EN-US>NetBeans 5.5 开发人员可以通过安装更新,使用 NetBeans 6 中的其它新增特性。这些特性包括自动的国际化、可视本地化、外观和感觉的预览支持、相对字体定义以及将组件从项目管理器拖动到 UI 的能力,还有上下文相关的帮助栏和 Pre/Post Declaration Code Editor。在以后的 IDE 版本中,将集成所有这些特性,无需安装或设置。</span></p>
<p class=NB-Interttulo21><span lang=EN-US>可视菜单设计器</span></p>
<p class=NB-Corpo1><span lang=EN-US>以前的 Matisse 版本只提供功能有限的应用程序菜单设计支持;必须使用 Inspector 窗口创建菜单项和子菜单。现在,可以在 UI 设计器中以可视方式选择并编辑菜单组件。这在两个方面对 Java 桌面应用程序开发有帮助:可以更明显地看到当前正在编辑哪个菜单和菜单项,而且不必预览视窗或运行应用程序,就能够看到菜单在运行时的外观。<b>图&nbsp;5</b> 显示可视菜单设计器。 </span></p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image009.png" width="280" height="254"></td>
</tr>
<tr>
<td><p class=NB-Corpo224><strong>图 5.</strong> 新的可视菜单设计器<br>
</p></td>
</tr>
</table>
<p class=NB-Interttulo21><span lang=EN-US>对 Protected Code Customizer 的改进</span></p>
<p class=NB-Corpo1><span lang=EN-US>NetBeans 使用受保护代码的概念。Matisse 使用这个概念确保生成的代码不被开发人员修改或破坏,从而使可视设计人员的工作不受干扰。但是有时候,这个限制有点儿过分严格,对受保护代码的限制是 NetBeans 邮件列表上常常受到质疑的问题。 </span></p>
<p class=NB-Corpo1><span lang=EN-US>在 NetBeans 6 中,这个方面已经改进了,可以以多种方式修改受保护代码部分。这有助于解决与同步动作和方法调用相关的问题,例如初始化和属性/bean 配置。 </span></p>
<p class=NB-Corpo1><span lang=EN-US>有几种修改受保护代码的方法,这些都要使用 Properties 窗口的 Code 选项卡(见<b>图&nbsp;6</b>):<b> </b></span></p>
<p class=NB-Corpo1><span lang=EN-US style='font-family:Wingdings;'>&sect; </span><i><span lang=EN-US>Post-Listener-Code</span></i><span
lang=EN-US> —— 在设置所有 bean 的全部属性并添加所有监听器之后,添加这些代码。 </span></p>
<p class=NB-Corpo1><span lang=EN-US style='font-family:Wingdings;'>&sect; </span><i><span lang=EN-US>Pre-Adding Code 和 Post-Adding Code</span></i><span
lang=EN-US> —— 在父容器(比如 </span><span class=NB-NegritoTcnico1><span lang=EN-US
style='font-size:10.0pt'>JPanel</span></span><span lang=EN-US></span><span
class=NB-NegritoTcnico1><span lang=EN-US style='font-size:10.0pt'>JFrame</span></span><span
lang=EN-US>)中添加组件之前和之后,添加这些代码。 </span></p>
<p class=NB-Corpo1><span lang=EN-US style='font-family:Wingdings;letter-spacing:0pt'>&sect; </span><i><span lang=EN-US style='letter-spacing:
0pt'>A</span><span lang=EN-US>fter-All-Set Code </span></i><span lang=EN-US> ——</span><span
lang=EN-US style='letter-spacing:0pt'> 在组件完全设置好之后,添加这些代码。 </span></p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image011.png" width="348" height="351"></td>
</tr>
<tr>
<td><p class=NB-Corpo2251><strong>图 6.</strong> 对 Protected Code Customizer 的改进 </p></td>
</tr>
</table>
<p class=NB-Corpo1><span lang=EN-US>新的 Pre/Post Declaration Code Editor 是一项必备特性,而不仅仅是开发改进。从 Java 5 开始,开发人员可以在 Java 源代码中给不同的目标加注释,为了支持需要注释的库或技术,Matisse 必须允许开发人员设置这些注释。可以通过 Properties 窗口的 Code 选项卡中的 Pre-Declaration Code 和 Post-Declaration Code 框添加注释。 </span></p>
<p class=NB-Corpo1><span lang=EN-US>NetBeans 6 附带一个新的代码定制器,可以更轻松地将源代码插入受保护代码中。访问它的方法是,在设计器中右击 UI 窗体并选择 <i>Customize Code</i>。这时会显示一个包含 Java 编辑器的对话框,见<b>图&nbsp;7</b></span></p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image013.png" width="680" height="617"></td>
</tr>
<tr>
<td><p class=NB-Corpo225><strong>图 7.</strong> Code Customizer 对话框<br>
<br>
</p></td>
</tr>
</table>
<p class=NB-Interttulo21><span lang=EN-US><br>
组件的居中</span></p>
<p class=NB-Corpo1><span lang=EN-US>现在可以更轻松地沿中心线对齐组件。Matisse 现在允许选择一组组件,让它们对齐第一个组件的中心线。可以进行水平居中和垂直居中。当前,必须选择多个组件;然后让所有组件居中。另一个选项可以让组件在父容器中水平居中和垂直居中。</span><br>
</p>
<p class=NB-Interttulo21><span lang=EN-US>更多的间隙 </span></p>
<p class=NB-Corpo1><span lang=EN-US>在 NetBeans 6 之前,Free Design 布局管理器在布置组件时只支持一个首选间隙。在 6.0 中,支持三个首选间隙。首选间隙是组件之间的间距,它应用于组件的所有边上,见<b>图&nbsp;8</b>。有三个首选间隙可供选择,这让开发人员可以更好地控制组件的间距。</span><br>
</p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image015.png" width="350" height="83"></td>
</tr>
<tr>
<td><p class=NB-Corpo226><strong>图 8.</strong> Free Design 支持三个首选间隙<br>
<br>
</p></td>
</tr>
</table>
<p class=NB-Interttulo21><span lang=EN-US>更好的复制/粘贴支持</span></p>
<p class=NB-Corpo1><span lang=EN-US>在 6.0 之前,使用 Free Design 布局时,复制和粘贴会产生糟糕的结果。无论选择了多少个组件,它都会把复制的所有组件放在 UI 窗体的 [0,0] 位置上。这个问题现在已经解决了。复制和粘贴不会再弄乱布局,粘贴的位置现在与原来的组件拉开一定的距离。复制之后,组件还会保持它们的布局(见<b>图&nbsp;9</b>)。</span><br>
</p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image015.png" width="350" height="83"></td>
</tr>
<tr>
<td><p class=NB-Corpo227><strong>图 9.</strong> Free Design 中改进的复制/粘贴支持(多次粘贴组件)<br>
<br>
</p></td>
</tr>
</table>
<p class=NB-Interttulo21><span lang=EN-US>自动的国际化和可视本地化</span></p>
<p class=NB-Corpo1><span lang=EN-US>在以前的 NetBeans 版本中,UI 的国际化和本地化需要执行几个额外的步骤。现在,这个过程已经简化了。在以前的版本中,必须分别设置每个 UI 组件,让它们从正确的资源束获取值。然后,为了建立本地化的资源束,需要手工创建资源束文件或本地化的条目,输入适合本地区的文本,并相应地设置文件格式(例如,使用不同的编码)。</span></p>
<p class=NB-Corpo1><span lang=EN-US>在 NetBeans 6.0 中,在 UI 设计期间可以让 Matisse 自动实现应用程序的国际化。这意味着,对于原来需要手工国际化的每个资源,Matisse 会自动地将 UI 设计器中提供的值添加到一个资源束中。对于所有 UI 元素,都会这么做。</span></p>
<p class=NB-Corpo1><span lang=EN-US>可视本地化特性与自动国际化特性配合工作。可以在 Inspector 窗口的树中右击最上面的窗体节点,找到 Properties 窗口中的 Design Locale 组合框,然后选择一个地区或添加新的地区。 </span></p>
<p class=NB-Corpo1><span lang=EN-US>选择 Design Locale 之后,只需按照一般方式编辑 UI 中的文本。系统会用 UI 中输入的值自动实现这个 Design Locale 的本地化。可以修改地区,然后为新选择的地区重新设置值。所以,用 NetBeans 6 创建完全国际化的 UI 是非常容易的(见<b>图&nbsp;10</b>)。</span><br>
<br>
</p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image019.png" width="353" height="278"></td>
</tr>
<tr>
<td><p class=NB-Corpo228><strong>图 10.</strong> 通过 Automatic Resource Management 组合框将资源管理风格设置为 Internationalization,通过 Design Locale 组合框设置编辑 UI 时使用的地区。修改地区并重新编辑 UI,就可以实现用户界面的本地化 <br>
</p></td>
</tr>
</table>
<br>
<br>
<p class=NB-Interttulo21><span lang=EN-US>外观和感觉的预览支持</span></p>
<p class=NB-Corpo1><span lang=EN-US>在 NetBeans 6.0 之前,无法在设计器中为常规 Swing 应用程序设置外观和感觉。开发人员需要添加适当的代码来设置应用程序的外观和感觉。</span></p>
<p class=NB-Corpo1><span lang=EN-US>通过源代码设置常规 Swing 应用程序的外观和感觉是非常简单的。但是,由于 Form Editor 不允许设置外观和感觉,所以开发人员无法看到,在采用不同外观和感觉的情况下应用程序在运行时的样子。这个问题已经解决了。</span></p>
<p class=NB-Corpo1><span lang=EN-US>在 NetBeans 6.0 中,可以用任何可用的外观和感觉预览窗体。在 Inspector 窗口中,开发人员可以右击窗体容器节点,或者右击 Other Components 节点下面的同级节点(它的同胞节点),这些节点具有 </span><span class=NB-NegritoTcnico1><span
lang=EN-US style='font-size:10.0pt'>JFrame</span></span><span lang=EN-US></span><span
class=NB-NegritoTcnico1><span lang=EN-US style='font-size:10.0pt'>JDialog</span></span><span
lang=EN-US></span><span class=NB-NegritoTcnico1><span lang=EN-US
style='font-size:10.0pt'>JPanel</span></span><span lang=EN-US> 等窗体扩展类名。然后展开 Preview Design 子菜单并选择外观和感觉。这样就可以用所选的外观和感觉预览窗体。 </span></p>
<p class=NB-Notadica1><span lang=EN-US>也可以通过在 UI 设计器中右击窗体来访问 Preview Design 子菜单。</span><br>
</p>
<p class=NB-Interttulo21><span lang=EN-US>相对字体定义</span></p>
<p class=NB-Corpo1><span lang=EN-US>您是否希望相对于系统或应用程序的一般字体定义稍大或稍小的 UI 字体?这样就不必为每个组件设置绝对的字体。相反,特定组件的字体可以设置为不同的相对大小,或者具有与应用程序或系统主字体不同的样式。</span></p>
<p class=NB-Corpo1><span lang=EN-US>在 Matisse 的最新版本中,字体的定义已经大大简化了。在窗体上选择一个 UI 组件,然后在 Properties 窗口中单击 </span><span
class=NB-NegritoTcnico1><span lang=EN-US style='font-size:10.0pt'>font</span></span><span
lang=EN-US> 属性右边的按钮。这时会显示字体编辑器。可以在这里选择 “Derive the font from the default font” 复选框并选择字体样式。字体的大小可以相对于默认字体;大小也可以设置为绝对数值。无论采用哪种大小,字体都不是硬编码的,会在运行时决定。这个特性使用了 </span><span class=NB-NegritoTcnico1><span
lang=EN-US style='font-size:10.0pt'>Font.deriveFont()</span></span><span
lang=EN-US> 方法。</span><br>
</p>
<p class=NB-Interttulo21><span lang=EN-US>将组件从 Project Explorer 拖动到 UI</span></p>
<p class=NB-Corpo1><span lang=EN-US>在以前的 NetBeans 版本中,开发人员必须将 UI 组件从正在开发的项目安装到 Form Editor 的面板中,然后才能在 UI 窗体上使用它们。这会使对组件的修改出现问题,而且在项目 UI 中使用来自子项目的组件也比较复杂。但是,这种情况已经改变了。</span></p>
<p class=NB-Corpo1><span lang=EN-US>现在可以建立一个库作为子项目或依赖项。在父项目中创建一个新窗体,然后可以将子项目的 UI 控件/类从项目层次结构中拖出来,直接拖到窗体上,而不需要将它们添加到面板或全局<span lang=EN-US> IDE</span> 中。组件实际上是项目级的元素:一个更好更明确的解决方案。</span><br>
</p>
<p class=NB-Interttulo21><span lang=EN-US>上下文相关的帮助栏</span></p>
<p class=NB-Corpo1><span lang=EN-US>新的上下文相关的帮助栏(见<b>图&nbsp;11</b>)对新手和有经验的开发人员都有帮助。它对新用户的帮助可能更大,因为它可以帮助他们快速了解 Matisse 特性。新的帮助栏会提供与上下文相关的提示,说明用当前选择的组件或特性可以做什么。有经验的用户也可能会发现他们所不了解的快捷方法或特性。</span><br>
<br>
</p>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><img src="/images_www/magazine/matisse/image/image021.png" width="549" height="218"></td>
</tr>
<tr>
<td><p class=NB-Corpo229><strong>图 11.</strong> 上下文相关的帮助栏<br>
</p></td>
</tr>
</table>
<p class=NB-Interttulo1><span lang=EN-US>结束语</span></p>
<p class=NB-Corpo1><span lang=EN-US>Matisse 是促使 NetBeans 社区迅速扩大的原因之一,而且它在每个版本中都会得到改进。6.0 版也不例外,而且最新的特性大大提高了 Swing 应用程序的开发效率。每个人都应该试试它。</span></p>
<p class=NB-Corpo1><span lang=EN-US>NetBeans 6.0 Matisse 特性和其它特性还在发展之中。在最终版本中,生成的 UI 代码应该会得到改进,还会有许多其它新特性和改进。 </span> <span
style='letter-spacing:.15pt;'>&nbsp;</span><br>
</p>
<table class="full-width" border="1" cellpadding="0" cellspacing="0" bordercolor="#BC001C">
<tr>
<td height="24" valign="middle" bgcolor="#BC001C"><p class="NB-Listagenstitulos"><strong>链接</strong></p></td>
</tr>
<tr>
<td><br>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="40">&nbsp;</td>
<td><a href="https://netbeans.org/projects/guibuilder/"><span class="style4"><font face="Verdana">form.netbeans.org</font></span></a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><font size=1 color=black face="Verdana"><span style="font-size:9.0pt;letter-spacing:0pt">Matisse/Form Editor 项目主页。</span></font></td>
</tr>
</table>
<br>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="40">&nbsp;</td>
<td><a href="http://wiki.netbeans.org/wiki/view/NetBeansDreamTeam"><span class="style4"><font face="Verdana">wiki.netbeans.org/wiki/view/NetBeansDreamTeam </font></span></a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><font size=1 color=black face="Verdana"><span style="font-size:9.0pt;letter-spacing:0pt">NetBeans Dream Team Wiki/主页。</span></font></td>
</tr>
</table>
<br>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>&nbsp;</td>
<td><a href="http://blogs.sun.com/roumen/entry/swing_application_framework_swing_databinding"><span class="style4"><font face="Verdana"> blogs.sun.com/roumen/entry/swing_application_framework_databinding </font></span></a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><font size=1 color=black face="Verdana"><span style="font-size:9.0pt;letter-spacing:0pt">Roman Strobl 提供的 Swing Application Framework 和 Beans Binding 演示程序。</span></font><font color=black face="Verdana"><span style="font-size:9.0pt;letter-spacing:0pt"></span></font></td>
</tr>
</table>
<br>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="40">&nbsp;</td>
<td><a href="http://wadechandler.blogspot.com/"><span class="style4"><font face="Verdana">http://wadechandler.blogspot.com/</font></span></a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><font size=1 color=black face="Verdana"><span style="font-size:9.0pt;letter-spacing:0pt">Wade Chandler 的主页。</span></font><font color=black face="Verdana"><span style="font-size:9.0pt;letter-spacing:0pt"></span></font></td>
</tr>
</table>
<br>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="40">&nbsp;</td>
<td><a href="http://appframework.dev.java.net/"><span class="style4"><font face="Verdana">appframework.dev.java.net </font></span></a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><font color=black face="Verdana"><span style="font-size:9.0pt;letter-spacing:0pt">一个 JSR 296 Swing Application Framework 实现。 </span></font></td>
</tr>
</table>
<br>
<table class="full-width" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="40">&nbsp;</td>
<td><a href="https://netbeans.org/projects/guibuilder/updates/update55.html"><span class="style4"><font face="Verdana">form.netbeans.org/updates/update55.html </font></span></a></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><font color=black face="Verdana"><span style="font-size:9.0pt;letter-spacing:0pt">NetBeans 5.5 Matisse 特性更新页面。 </span></font></td>
</tr>
</table></td>
</tr>
</table>
<table width="770" border="1" cellpadding="0" cellspacing="0" bordercolor="#BC001C">
<tr>
<td><table class="full-width" border="0" cellpadding="0" cellspacing="1" bordercolor="#BC001C">
<tr>
<td width="93"><div align="center"><img src="/images_www/magazine/autores/Wade.jpg" alt="Autor" width="77" height="94"></div></td>
<td width="677" valign="middle"><p class=NB-Corpo1111> <strong>Wade Chandler</strong> <br>
<script language="JavaScript" type="text/javascript"><!--
var user = "&#104;&#119;&#97;&#100;&#101;&#99;&#104;&#97;&#110;&#100;&#108;&#101;&#114;&#45;&#110;&#98;";
var domain = "&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;";
var at = "&#x40;";
document.write(user + at + domain);
//--></script><noscript>
&#104;&#119;&#97;&#100;&#101;&#99;&#104;&#97;&#110;&#100;&#108;&#101;&#114;&#45;&#110;&#98;
&#x40;
&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;
</noscript></em>)是 Decision Dynamics, Inc. 的软件工程师和独立软件开发人员。他从 1997 年开始从事软件开发,在 NetBeans 还被称为 Forte for Java 时就加入了 NetBeans 社区,并从 JDK 1.0 开始从事 Java 编程。Wade 积极参与 NetBeans 项目,而且是 NetBeans Dream Team 的成员。</p></td>
</tr>
</table></td>
</tr>
</table>
</div></td>
</tr>
</table>
<!-- End Content Area -->
</body>
</html>