blob: 259edc0447be2aa333fa2282058afd1269332706 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<title>国际化 GUI 窗体 - NetBeans IDE 教程</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<meta name="KEYWORDS" content="NETBEANS, TUTORIAL, GUIDE, USER, DOCUMENTATION">
<meta name="description" content="Tutorial - Internationalization of GUI Form in NetBeans IDE">
<link rel="stylesheet" href="../../../netbeans.css">
<meta name="author" content="Jana Maleckova, Marek Grummich">
<meta name="description" content="This tutorial shows you how to set up internationalization for a single form and for a whole project." >
</head>
<body>
<h1>国际化 GUI 窗体</h1>
<p>本教程将指导您完成在 NetBeans IDE 中进行国际化的一些基本步骤。我们将对一个窗体设置国际化,并在稍后设计该窗体。接下来,我们会国际化整个项目,该项目在几个不同的包中包含若干窗体。您可以通过指定自动国际化或使用专门的向导来国际化应用程序。</p>
<p class="align-center"><b>预计时间:30 分钟</b></p>
<p><strong>目录</strong></p>
<img alt="此页上的内容适用于 NetBeans IDE 6.9 或更高版本" class="stamp" src="../../../images_www/articles/69/netbeans-stamp-69-70-71.png" title="此页上的内容适用于 NetBeans IDE 6.9 或更高版本">
<ul class="toc">
<li><a href="#about">国际化的原理</a></li>
<li><a href="#Exercise_1">如何在设计时设置自动国际化</a></li>
<li><a href="#Exercise_2">国际化整个项目</a></li>
<li><a href="#Exercise_3">国际化单个窗体</a></li>
<li><a href="#nextsteps">另请参见</a></li>
</ul>
<p><b>要学完本教程,您需要具备以下软件和资源。</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">软件或资源</th>
<th class="tblheader" scope="col">要求的版本</th>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.netbeans.org/downloads/index.html" target="_blank">NetBeans IDE</a></td>
<td class="tbltd1">版本 6.9 或更高版本 </td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">Java 开发工具包 (JDK)</a></td>
<td class="tbltd1">版本 6 或 7 </td>
</tr>
</tbody>
</table>
<h2 class="tutorial"><a name="about"></a>国际化的原理</h2>
<p class="tutorial">通过进行国际化,可以根据不同的语言和地区来改编应用程序,而无需进行工程更改或重新编译。国际化程序允许将文本性元素(如状态消息和 GUI 组件标签)存储在源代码外部并对其进行动态检索,而不是在程序中对其进行固定编码。</p>
<p class="tutorial">通常将国际化字符串以键/值对的形式存储在属性文件中。键是程序用于检索文本的标识符,而值是实际文本。对于转换程序所用的每种语言环境(或语言),都将创建一个属性文件。键在每种语言环境中都相同,只是字符串不同。 </p>
<p class="tutorial">IDE 提供了用于执行下列各项操作的工具:</p>
<ul>
<li>在创建 GUI 窗体或 Java 程序时插入国际化字符串</li>
<li>将单个文件或文件组中的所有固定编码字符串替换为国际化字符串</li>
</ul>
<h2><a name="Exercise_1"></a>在设计时国际化 GUI 窗体 </h2>
<p>在此练习中,我们将打开 Java 应用程序演示项目,其中包含使用 GUI 构建器创建的常用查找对话框。接下来,我们将对窗体 FindDialog.java 启用自动国际化。为了测试已国际化的 GUI 窗体,我们将在属性文件中添加一种新的语言环境,然后在非默认语言环境下运行该窗体。 </p>
<div class="indent">
<h3 class="tutorial">打开示例项目</h3>
<ol>
<li> 下载 <a href="http://www.netbeans.org/files/documents/4/770/InternationalizeDemo.zip" target="_blank">InternationalizeDemo.zip</a> 项目并将其解压缩到您计算机上的任何位置。 </li>
<li>选择 "File"(文件)> "Open Project"(打开项目)(Ctrl-Shift-O 组合键),导航至您在上一步中解压缩的 <tt>InternationalizeDemo</tt> 项目,然后单击 "Open"(打开)。项目文件夹可能包含在同样名为 <tt>InternationalizeDemo</tt> 的文件夹中。</li>
<li>展开 "Source Packages"(源包)> "Demo"(演示),然后双击 <tt>FindDialog.java</tt>。将在 GUI 构建器中打开样例窗体。
<p class="align-center"> <img alt=""Find"(查找)对话框" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/finddialog_ai18n.png">
</p>
<p>要查看如何创建此 GUI 窗体的演示,请单击<a href="http://www.netbeans.org/files/documents/4/1322/addingcomponents.swf" onClick="demoWin=open(this.href,this.target,"resizable=yes,menubar=yes,status=yes,toolbar=no,height=710,width=910,scrollbars=yes");demoWin.focus();return false" target="demoWin">查看演示</a></p>
</li>
</ol>
<h3 class="tutorial">启用自动国际化</h3>
<ol>
<li>在 "Inspector"(检查器)窗口中选择根节点(名为 "Form FindDialog"(窗体 FindDialog))。
<p class="align-center"><img src="../../../images_www/articles/72/java/gui-automatic-i18n/inspector.png" border="1"></p></li>
<li>在 "Properties"(属性)窗口中,选中 "Automatic Internationalization"(自动国际化)属性中的复选框。
<p class="align-center"><img src="../../../images_www/articles/72/java/gui-automatic-i18n/properties.png" border="1"></p></li>
<li> 在 "GUI Form Format Upgrade"(GUI 窗体格式升级)对话框中,单击 "Upgrade"(升级)。
<p>如果选中该复选框,则 IDE 将按照 <tt>Properties Bundle File</tt>(属性包文件)属性中的设置在 <tt>demo</tt> 包中创建 <tt>Bundle.properties</tt> 文件。如果您需要在其他位置创建此文件,则可以单击省略号 (...) 按钮,然后选择一个位置,或者直接在该属性的文本字段中键入路径。</p>
<p class="align-center"><img src="../../../images_www/articles/72/java/gui-automatic-i18n/bundle_new.png"></p>
</li>
<li>在 "Projects"(项目)窗口中,双击 <tt>Bundle.properties</tt> 节点,或者右键单击该节点,然后选择 "Edit"(编辑)。
<p>将在源代码编辑器中打开该属性文件。正如您所看到的,将为窗体 <tt>FindDialog.java</tt> 生成所有相应的键和值。(每个键的名称是从窗体文件名和组件变量名派生的。例如,键 <tt>FindDialog.jLabel1.text</tt> 是为窗体文件 <tt>FindDialog</tt> 中包含的变量名为 <tt>jLabel1</tt> 的组件生成的。在此示例中,值 <tt>jLabel1</tt> 表示组件的 "text" 属性。</p>
</li>
<li>关闭 <tt>Bundle.properties</tt> 文件。 </li></ol>
<h3 class="tutorial">国际化各个 GUI 组件</h3>
<p>现在,我们将使用 GUI 构建器为窗体中的 JLabel 和 JButton 输入国际化字符串。 </p>
<ol>
<li>在设计区域中选择相应的 GUI 组件(例如 <tt>jLabel1</tt>)。</li>
<li>在 "Properties"(属性)窗口中,单击 "text" 属性的省略号 (...) 按钮。
<p class="note"><b>注:</b>您还可以对具有字符串值的其他属性进行国际化,例如助记符、可访问的名称、可访问的描述符和工具提示。</p></li>
<li>属性编辑器将切换至资源包模式。检查 "Bundle Name"(包名)字段是否设置为 <tt>demo.Bundle</tt>,以及 "Key"(键)字段是否包含字符串 <tt>FindDialog.jLabel1.text</tt></li>
<li>在 "Value"(值)字段中键入 <tt>Find What:</tt></li>
<li>单击 "OK"(确定)。</li>
</ol>
<p>对所有组件重复执行以上步骤,使该窗体如下图所示:</p>
<p class="align-center"> <img alt="国际化窗体" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/finddialog_new.png"></p>
<p class="note"><b>注:</b>可使用更便捷的方法来完成步骤 1 至 5 的操作:只需在 "Design"(设计)视图中双击 <tt>jLabel1</tt>,将其文本从 <tt>jLabel1</tt> 更改为 <tt>Find What:</tt>,然后按 Enter 键即可。其结果与以上提供的步骤所得到的结果相同。</p>
<p>要查看国际化 <tt>jLabel1</tt> 的演示,请单击<a href="https://netbeans.org/project_downloads/www/flashdemo/gui-i18n-swfs/i18ncomponent.swf" onClick="demoWin=open(this.href,this.target,"resizable=yes,menubar=yes,status=yes,toolbar=no,height=800,width=910,scrollbars=yes");demoWin.focus();return false" target="demoWin">查看演示</a></p>
<p>要使组件的宽度相同,请完成以下步骤:</p>
<ol>
<li>按住 Ctrl 键单击窗体中的所有八个 jCheckBox 将它们选中。</li>
<li>在选中了这些 jCheckBox 的情况下,右键单击其中任何一个,然后从弹出式菜单中选择 "Set Same Size"(设置相同大小)> "Same Width"(相同宽度)。</li>
<li>对三个 jButton 执行步骤 1 至 2 的操作。</li>
</ol>
<a name="newlocale"></a>
<h3 class="tutorial">添加新语言环境</h3>
<ol>
<li>在 "Inspector"(检查器)窗口中选择根节点("Form FindDialog"(窗体 FindDialog)节点)。</li>
<li>在 "Properties"(属性)窗口中,单击 "Design Locale"(设计语言环境)属性的省略号 (...) 按钮。</li>
<li><tt>预定义的语言环境:</tt>组合框中选择 <tt>es_ES</tt></li>
<li>单击 "OK"(确定)。
<p><tt>Bundle.properties</tt> 节点下将显示新语言环境,如下所示:</p>
<p class="align-center"><img alt="带有多个区域设置的属性文件" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/addlocale_new.png"></p> </li>
<li>在 "Projects"(项目)窗口中,右键单击 <tt>Bundle.properties</tt>,然后选择 "Open"(打开)。</li>
<li>将相应表列中的各条消息转换为新语言(如西班牙语),如下所示:
<p class="align-center"><img alt="带有多个区域设置的属性编辑器" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/bundles_new.png"></p>
</li>
<li>按 Ctrl-S 组合键保存所做的编辑。</li>
<li>选择 <tt>FindDialog.java</tt> 标签,以显示要国际化的窗体。</li>
<li>在 "Inspector"(检查器)窗口中右键单击根节点,然后选择 "Reload Form"(重新加载窗体)(或按 Ctrl-R 组合键)。</li>
<li>在显示的 "Question"(问题)对话框中单击 "Save"(保存)。<br>将重新打开该窗体,并在设计区域中加载西班牙语语言环境,如下所示:
<p class="align-center"><img alt="显示西班牙语消息的设计区域" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/finddialog_es_new.png"></p>
<a name="testlocale"></a></li>
</ol>
<h3 class="tutorial">测试非默认语言环境</h3>
<ol>
<li>在 "Projects"(项目)窗口中,右键单击 InternationalizeDemo 项目,然后选择 "Properties"(属性)。</li>
<li>在 "Categories"(类别)窗格中,选择 "Run"(运行)节点。</li>
<li>在 "VM Options"(VM 选项)字段中输入 <tt>-Duser.language=es -Duser.country=ES</tt>
<p class="align-center"><img alt="属性对话框" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/prjproperties_new.png"></p>
</li>
<li>单击 "OK"(确定)。</li>
<li>右键单击 "InternationalizeDemo" 项目,然后选择 "Run"(运行)。
<p>IDE 将在西班牙语语言环境中运行 <tt>FindDialog</tt> 对话框,如下所示。</p>
<p class="align-center"><img alt="使用西班牙语语言环境的对话框" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/run.png"></p>
</li>
</ol>
</div>
<h2><a name="Exercise_2"></a>国际化整个项目</h2>
<p>通常,我们在默认语言环境中拥有几个文件,并且系统要求我们改编这些文件,以便将其转换为其他语言。国际化向导是用于执行此任务的最佳工具,因为它可以一次国际化多个文件。我们将在 GUI 窗体示例项目中演示此功能,该项目包含在<a href="quickstart-gui.html">设计 Swing GUI</a> 教程中创建的窗体。 </p>
<div class="indent">
<h3 class="tutorial"> 创建样例项目 </h3>
<ol>
<li>选择 "File"(文件)> "New Project"(新建项目),或者单击 IDE 工具栏中的 "New Project"(新建项目)图标。 </li>
<li>在 "Categories"(类别)窗格中,选择 "Samples"(样例)> "Java" 节点。在 "Projects"(项目)窗格中,选择 "GUI Form Examples"(GUI 窗体示例)。单击 "Next"(下一步)。</li>
<li>在 "Project Name"(项目名称)字段中输入 <tt>GUIFormExamples</tt>,然后指定项目位置(例如 <tt>/space/projects</tt>)。</li>
<li>确保 "Set as Main Project"(设置为主项目)复选框处于选中状态。 </li>
<li>单击 "Finish"(完成)。</li>
</ol>
<p class="align-center"><img alt="样例窗体项目" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/formexamples_new.png"></p>
<h3 class="tutorial"> 准备属性文件 </h3>
<ol>
<li>选择 "File"(文件)> "New File"(新建文件),或者单击 IDE 工具栏中的 "New File"(新建文件)图标。</li>
<li>在 "Categories"(类别)窗格中,选择 "Other"(其他)节点;在 "File Types"(文件类型)窗格中,选择 "Properties File"(属性文件)。单击 "Next"(下一步)。</li>
<li> 在 "File Name"(文件名)字段中输入 <tt>ContactEditor</tt></li>
<li>单击 "Browse"(浏览),然后在 "Browse Folders"(浏览文件夹)对话框中,将 <tt>GUIFormExamples/src/examples</tt> 文件夹指定为文件位置。</li>
<li>单击 "Select Folder"(选择文件夹)。</li>
<li>单击 "Finish"(完成)。
<p>IDE 将创建 <tt>ContactEditor.properties</tt> 文件并在源代码编辑器中将其打开。 </p>
<p>重复上述步骤以创建另一个 <tt>Antenna.properties</tt> 文件。 </p>
</li>
</ol>
<p class="align-center"> <img alt="带有属性文件的项目" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/ceprjprops_new.png"> </p>
<h3 class="tutorial">调用国际化向导</h3>
<ol>
<li>在主菜单中,选择 "Tools"(工具)> "Internationalization"(国际化)> "Internationalization Wizard"(国际化向导)。 </li>
<li>在该向导的第一页上,单击 "Add Source(s)"(添加源)。</li>
<li>在 "Select Sources"(选择源)对话框中,展开 <tt>Source Packages</tt>(源包)> <tt>Examples</tt>(示例)节点,然后按住 Ctrl 键单击 <tt>Antenna.java</tt><tt>ContactEditor.java</tt><tt>Find.java</tt> 文件将其选中。</li>
<li>单击 "OK"(确定)。
<p>源文件将显示在该向导的第一页中,如下所示:</p>
<p class="align-center"><img alt="国际化向导" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/i18nwizardone.png"></p></li>
<li>为了便于演示,选择 <tt>examples.Find</tt>,然后单击 "Remove Source(s)"(删除源)按钮。</li>
<li>单击 "Next"(下一步)。 </li>
<li>检查国际化向导是否提供了正确的属性文件 <tt>examples.Antenna</tt><tt>examples.ContactEditor</tt>。如果未提供,请使用 "Select Resource"(选择资源)按钮来选择正确的属性文件。
<p class="align-center"><img alt="国际化向导的第 2 页" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/i18nwizardtwo_new.png"></p>
</li>
<li>单击 "Next"(下一步)。 </li>
<li>跳过该向导的第 3 页(因为您不打算创建任何字段并修改其他值),然后单击 "Next"(下一步)。</li>
<li>所有固定编码字符串都将显示在国际化向导的最后一步中,您可以在该步中确定将哪些字符串包含在属性文件中(使用复选框)。您也可以进一步定制各个键、值、注释和替换字符串的格式,方法是单击字符串的省略号 (...) 按钮。
<p class="align-center"><img alt="国际化向导的第 3 页" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/i18nwizardthree_new.png"></p>
</li>
<li>单击 "Finish"(完成)。
<p>现在,已完成源代码的国际化,接下来可以按照先前所述<a href="#newlocale">添加</a><a href="#testlocale">测试</a>其他语言环境。 </p>
</li>
</ol>
</div>
<h2><a name="Exercise_3"></a>国际化单个窗体</h2>
<p>使用自动国际化功能是国际化 GUI 窗体的最简便方法。但是,如果您没有安装更新包,或者还希望国际化不是由窗体编辑器生成的代码,则可以使用 "Internationalize"(国际化)窗口。(此功能可处理任何 <tt>.java</tt> 文件,而不仅仅是通过窗体编辑器创建的文件)。下面的示例使用了 "Internationalization"(国际化)窗口,该窗口是 NetBeans IDE 默认安装的一部分。</p>
<p>在此最后练习中,我们将重用 GUI 窗体示例项目并国际化 Find.java 窗体(在先前的练习中排除了该窗体)。我们将调用 "Internationalize"(国际化)对话框来替换此文件中的所有固定编码字符串。最后,我们将简要演示如何在编写程序时将国际化字符串插入源代码中。</p>
<div class="indent">
<h3 class="tutorial"> 使用 "Internationalize"(国际化)对话框</h3>
<ol>
<li>在 "Projects"(项目)窗口中,右键单击 <tt>Find.java</tt>,然后从主菜单中选择 "Tools"(工具)> "Internationalization"(国际化)> "Internationalize"(国际化)。
<p>IDE 将显示 "Internationalization"(国际化)对话框,并预先填写 <tt>Find.java</tt> 源代码中的第一个固定编码字符串。 </p>
</li>
<li>单击 "Select"(选择)以选择特定的属性文件,或者创建新文件。 </li>
<li>在 "File Name"(文件名)文本字段中,输入 <tt>Find.properties</tt>,然后依次单击 "Create New"(新建)和 "OK"(确定)。</li>
<li>您可以修改替换字符串的格式、键、值或注释(如有必要)。我们将仅保留默认值。</li>
<li>单击 "Replace"(替换)以确认更改,并将焦点移到下一个固定编码字符串上。
<p>如果不需要替换固定编码字符串,请单击 "Skip"(跳过)按钮。</p>
<p class="align-center"> <img alt=""Internationalize"(国际化)对话框" border="1" src="../../../images_www/articles/72/java/gui-automatic-i18n/i18ndialog_new.png"></p>
</li>
</ol>
<h3 class="tutorial"> 插入单个国际化字符串 </h3>
<ol>
<li>在 "Projects"(项目)窗口中,右键单击 <tt>Find.java</tt>,然后选择 "Edit"(编辑)。
<p>IDE 将在源代码编辑器中打开 <tt>Find.java</tt> 文件。 </p>
</li>
<li>滚动查看源代码并查找 main 方法。 </li>
<li>在 main 方法中插入以下用粗体显示的行:
<pre class="examplecode"> public static void main(String args[]) {
<b>System.out.println();</b>
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Find().setVisible(true);
}
});
}</pre>
</li>
<li>按 Ctrl-Shift-J 组合键调用 "Insert Internationalized String"(插入国际化字符串)对话框(也可以从主菜单中选择 "Tools"(工具)<br> > "Internationalization"(国际化)> "Insert Internationalized String"(插入国际化字符串))。</li>
<li>对于 "Bundle Name"(包名),单击 "Select"(选择)按钮,选择 <tt>"Source Packages"(源包)> "Examples"(样例)</tt>文件夹,然后在 "File Name"(文件名)文本字段中输入 <tt>Find</tt> 作为包名。然后,单击 "OK"(确定)。"Bundle Name"(包名)字段将显示 <tt>examples.Find</tt></li>
<li>在 "Key"(键)下拉框中键入 <tt>Start</tt>,并在 "Value"(值)字段中键入 <tt>Start Find Dialog</tt>。然后,单击 "OK"(确定)。
<p class="align-center"><img src="../../../images_www/articles/72/java/gui-automatic-i18n/insi18nstring_new.png"></p>
</li>
<li>IDE 将插入国际化字符串:
<pre class="examplecode"> public static void main(String args[]) {
<b> System.out.println(java.util.ResourceBundle.getBundle(&quot;examples/Find&quot;).getString(&quot;Start&quot;));</b>
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Find().setVisible(true);
}
});
}</pre>
</li>
</ol>
</div>
<h2><a name="nextsteps"></a>另请参见</h2>
<p>有关更多信息,请参见以下链接:</p>
<ul>
<li><a href="../../trails/matisse.html">Java GUI 应用程序学习资源</a>:完整地列出了使用 NetBeans GUI 构建器创建 Java 图形用户界面 (GUI) 的相关文章、指南和教程。</li>
<li><a href="quickstart-gui.html">设计 Swing GUI</a>:NetBeans GUI 构建器教程。</li>
<li><a href="http://wiki.netbeans.org/wiki/view/NetBeansUserFAQ" target="_blank">GUI 构建器常见问题解答</a>:汇集了使用 NetBeans GUI 构建器的有用提示和技巧。</li>
</ul>
<br>
<div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:Internationalizing%20a%20GUI%20Form%20in%20NetBeans%20IDE">请将您的反馈意见发送给我们</a></div>
<br style="clear:both;" >
</body>
</html>