blob: fb8bbfe157f00331a266b70f5bbb2ffa2b19fe6c [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- -*- xhtml -*- -->
<title>Курс по использованию модуля &quot;Мастер&quot; в NetBeans на платформе NetBeans 6.5</title>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="AUDIENCE" content="NBUSER">
<meta name="TYPE" content="ARTICLE">
<meta name="EXPIRES" content="N">
<meta name="developer" content="geertjan.wielenga@sun.com">
<meta name="indexed" content="y">
<meta name="description"
content="A walk-through of the
basic features of the Wizard API classes.">
</head>
<body>
<h1>Курс по использованию модуля &quot;Мастер&quot;</h1>
<p>В этом учебном курсе вы узнаете, как использовать основные функциональные возможности, предлагаемые классами &quot;Мастер&quot; <a href="http://bits.netbeans.org/dev/javadoc/org-openide-dialogs/org/openide/package-summary.html">интерфейса API NetBeans </a>.</p>
<p><b>Содержимое</b></p>
<img src="../images/articles/68/netbeans-stamp-65-67-68.gif" class="stamp" width="114" height="114" alt="Содержимое на этой странице относится к среде NetBeans IDE 6.5, 6.7, 6.8" title="Содержимое на этой странице относится к среде NetBeans IDE 6.5, 6.7, 6.8"> </p>
<ul class="toc">
<li><a href="#set">Создание модуля проекта</a>
<li><a href="#wiz">Создание инфраструктуры мастера</a>
<li><a href="#action">Регистрация класса действия мастера</a>
<li><a href="#design">Проектирование содержимого мастера</a>
<li><a href="#process">Обработка данных пользователя</a>
<li><a href="#validate">Проверка данных пользователя</a>
<li><a href="#persist">Сохранение данных при перезапуске</a>
<li><a href="#brand">Брэндинг мастера</a>
<li><a href="#further">Дополнительные сведения</a>
</ul>
<p class="tips"> В приложениях платформы NetBeans существует возможность создания различных мастеров. Если необходимо создать мастер, который отображается в диалоговом окне создания проекта, см. <a href="https://platform.netbeans.org/tutorials/nbm-projectsamples.html">Учебный курс по модулю добавления примера проекта</a>. Если необходимо создать мастер, который отображается в диалоговом окне создания файла, см. <a href="http://platform.netbeans.org/tutorials/nbm-filetemplates.html">Учебный курс по созданию модулей шаблонов файлов</a>. В этом учебном курсе будет рассмотрено создание общего мастера, который появляется при щелчке кнопки на панели инструментов.
<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="https://netbeans.org/downloads/index.html">Среда IDE NetBeans</a></td>
<td class="tbltd1">версия 6.5 или выше </td>
</tr>
<tr>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Комплект для разработчика на языке Java (JDK)</a></td>
<td class="tbltd1">версия 6 или<br/>версия 5</td>
</tr>
</tbody>
</table>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="set"></a>Создание модуля проекта</h2>
<p>Сначала используется мастер Новый модуль проекта. В конце его работы создается структура основных источников с некоторыми файлами по умолчанию, которые необходимы для любого модуля среды NetBeans.
<ol>
<li>Выберите &quot;Файл&quot; &gt; &quot;Новый проект&quot; (Ctrl+Shift+N). В разделе &quot;Категории&quot; выберите параметр &quot;Модули NetBeans&quot;. В области &quot;Проекты&quot; выберите &quot;Модуль&quot;. Нажмите кнопку &quot;Далее&quot;.</li>
<li>На панели &quot;Имя и расположение&quot; введите текст <tt>DemoWizard</tt> в поле &quot;Имя проекта&quot;. В поле &quot;Расположение проекта&quot; укажите любой каталог на компьютере. Оставьте выбор &quot;Отдельный модуль&quot; и не снимайте флажок &quot;Установить как главный проект&quot;. Нажмите кнопку &quot;Далее&quot;.</li>
<li>На панели &quot;Основные настройки модуля&quot; введите текст <tt>org.demo.wizard</tt> в поле &quot;Основа кодового имени&quot;.</li>
<li>Выберите &quot;Создать слой XML&quot;. Не меняйте места расположения пакета локализации и файла слоя XML. Таким образом они будут сохранены с именем <tt>org/demo/wizard</tt>. Нажмите кнопку &quot;Готово&quot;. </li>
</ol>
<p> В среде IDE будет создан проект <tt>DemoWizard</tt>. Проект содержит все источники и метаданные проекта, например, сценарий построения проекта Ant. Проект откроется в среде IDE. Логическую структуру проекта можно просмотреть в окне &quot;Проекты&quot; (Ctrl+1), а его файловую структуру &ndash; в окне &quot;Файлы&quot; (Ctrl+2).</p>
<br />
<!-- ===================================================================================== -->
<p><h2><a name="wiz"></a>Создание инфраструктуры мастера</h2>
<p>В этом разделе рассмотрено использование мастера &quot;Мастер&quot; для добавления к модулю заглушек мастера.
<ol>
<li><p>В окне &quot;Проекты&quot; щелкните правой кнопкой мыши узел проекта DemoWizard и выберите &quot;Создать | Прочее&quot;, а затем &quot;Разработка Модуля | Мастер&quot;:</p>
<p><img border="1" src="../images/tutorials/wizard/wizard-wizard.png"/>
<p>Нажмите кнопку &quot;Далее&quot;.</p>
</li>
<li><p>На панели &quot;Тип мастера&quot;, в поле &quot;Количество панелей мастера&quot; введите 2, а другие значения оставьте без изменений:</p>
<p><img border="1" src="../images/tutorials/wizard/wizard-wizard-3.png"/>
<p>На вышеописанной панели используются следующие поля:
<ul>
<li><b>Тип регистрации.</b> Определяет место, из которого осуществляется доступ к мастеру. При выборе &quot;Особый&quot;, с помощью мастера &quot;Мастер&quot; будет создан новый класс действия, который используется для открытия и инициализации данного мастера. При выборе &quot;Создать файл&quot; мастер &quot;Мастер&quot; зарегистрирует созданный мастер в файле <tt>layer.xml</tt> модуля.
<li><b>Последовательность этапов Мастера.</b> Определяет, будет ли мастер иметь линейный характер и будет ли у пользователя возможность пропустить какие-либо этапы мастера, в зависимости от выбранных на предыдущих этапах параметров. По умолчанию мастер линейный, &quot;Статический&quot;, в то время как мастер с этапами, которые могут быть пропущены, требует наличия специального класса итерации, который создается при выборе варианта &quot;Динамический&quot;.
<li><b>Количество панелей мастера.</b> Определяет количество панелей в создаваемом мастере. Для каждого этапа мастера будет создано два файла Java: представление и контроллер.
</ul>
<p>Нажмите кнопку &quot;Далее&quot;.</p>
</li>
<li><p>На панели &quot;Имя и расположение&quot; введите текст <tt>Demo</tt> в поле &quot;Префикс имени класса&quot; и выберите основной пакет из выпадающего меню &quot;Пакет&quot;.</p>
<p><img border="1" src="../images/tutorials/wizard/wizard-wizard-4.png"/>
<p>Нажмите кнопку &quot;Готово&quot;. </p>
</li>
</ol>
<p>В окне &quot;Проекты&quot; должно отображаться следующее:
<p><img border="1" src="../images/tutorials/wizard/projects-window.png"/>
<p><h2><a name="action"></a>Регистрация класса действия мастера</h2>
<p>В этом разделе описывается изменение класса действия и его регистрация в файле <tt>layer.xml</tt>.
<ol>
<li>Откройте файл <tt>DemoWizardAction.java</tt> и замените весь код следующим:
<pre class=examplecode>
package org.demo.wizard;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.MessageFormat;
import javax.swing.JComponent;
import org.openide.DialogDisplayer;
import org.openide.WizardDescriptor;
public final class DemoWizardAction implements ActionListener {
private WizardDescriptor.Panel[] panels;
public void actionPerformed(ActionEvent e) {
WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
// {0} заменяется на WizardDesriptor.Panel.getComponent().getName()
wizardDescriptor.setTitleFormat(new MessageFormat(&quot;{0}&quot;));
wizardDescriptor.setTitle(&quot;Заголовок диалогового окна мастера&quot;);
Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
dialog.setVisible(true);
dialog.toFront();
boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
if (!cancelled) {
// любые действия
}
}
/**
* Инициализация панелей, соответствующих отдельным этапам мастера
* и установка различных свойств, регулирующих внешний вид мастера.
*/
private WizardDescriptor.Panel[] getPanels() {
if (panels == null) {
panels = new WizardDescriptor.Panel[]{
new DemoWizardPanel1(),
new DemoWizardPanel2()
};
String[] steps = new String[panels.length];
for (int i = 0; i &lt; panels.length; i++) {
Component c = panels[i].getComponent();
// Название этапа по умолчанию для имени компонента панели. Обычно используется
// для получения имени выбора цели, которое появляется
// в перечне этапов.
steps[i] = c.getName();
if (c instanceof JComponent) { // assume Swing components
JComponent jc = (JComponent) c;
// Задает номер этапа для компонента
// TODO использует org.openide.dialogs &gt;= 7.8, может использовать WizardDescriptor.PROP_*:
jc.putClientProperty(&quot;WizardPanel_contentSelectedIndex&quot;, new Integer(i));
// Задание имени этапа для панели
jc.putClientProperty(&quot;WizardPanel_contentData&quot;, steps);
// Включение создания субтитров на каждом этапе
jc.putClientProperty(&quot;WizardPanel_autoWizardStyle&quot;, Boolean.TRUE);
// Отображает этапы на левой стороне с изображением на заднем фоне
jc.putClientProperty(&quot;WizardPanel_contentDisplayed&quot;, Boolean.TRUE);
// Включение нумерации для всех этапов
jc.putClientProperty(&quot;WizardPanel_contentNumbered&quot;, Boolean.TRUE);
}
}
}
return panels;
}
public String getName() {
return &quot;Start Sample Wizard&quot;;
}
}
</pre>
</li>
<p class="tips"> Используется тот же код, что и сгенерированный, за исключением реализации <tt>ActionListener</tt>вместо <tt>CallableSystemAction</tt>. Это сделано потому, что <tt>ActionListener</tt> является стандартным классом JDK, а <tt>CallableSystemAction</tt> - нет. Поскольку используется платформа NetBeans 6.5, можно использовать стандартный класс JDK, что более удобно и требует меньше кода.
<li>Регистрация класса действий в файле <tt>layer.xml</tt> осуществляется следующим образом:
<pre class=examplecode>
&lt;filesystem&gt;
&lt;folder name=&quot;Actions&quot;&gt;
&lt;folder name=&quot;File&quot;&gt;
&lt;file name=&quot;org-demo-wizard-DemoWizardAction.instance&quot;&gt;
&lt;attr name=&quot;delegate&quot; newvalue=&quot;org.demo.wizard.DemoWizardAction&quot;/&gt;
&lt;attr name=&quot;iconBase&quot; stringvalue=&quot;org/demo/wizard/icon.png&quot;/&gt;
&lt;attr name=&quot;instanceCreate&quot; methodvalue=&quot;org.openide.awt.Actions.alwaysEnabled&quot;/&gt;
&lt;attr name=&quot;noIconInMenu&quot; stringvalue=&quot;false&quot;/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;folder name=&quot;Toolbars&quot;&gt;
&lt;folder name=&quot;File&quot;&gt;
&lt;file name=&quot;org-demo-wizard-DemoWizardAction.shadow&quot;&gt;
&lt;attr name=&quot;originalFile&quot; stringvalue=&quot;Actions/File/org-demo-wizard-DemoWizardAction.instance&quot;/&gt;
&lt;attr name=&quot;position&quot; intvalue=&quot;0&quot;/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/filesystem&gt;
</pre>
<p class="tips"> Элемент &quot;iconBase&quot; указывает на изображение с именем &quot;icon.png&quot; в основном пакете. Если используется собственное изображение, оно должно быть размером 16x16 пикселей, или же необходимо сделать следующее: <img border="1" src="../images/tutorials/wizard/icon.png"/>
<li>Запустите модуль. Запустится приложение, и на панели инструментов, в месте, которое задано в файле <tt>layer.xml</tt>, будут отображены кнопки:
<p><img border="1" src="../images/tutorials/wizard/result-1.png"/>
<p>Нажмите кнопку для открытия мастера:
<p><img border="1" src="../images/tutorials/wizard/result-2.png"/>
<p>Нажмите кнопку &quot;Далее&quot; и обратите внимание на то, что на последней панели кнопка &quot;Готово&quot; станет активной.
<p><img border="1" src="../images/tutorials/wizard/result-3.png"/>
</li>
</ol>
<p>Теперь, когда структура мастера работает, добавим дополнительное содержимое.
<p><h2><a name="design"></a>Проектирование содержимого мастера</h2>
<p>В этом разделе описывается добавление содержимого к мастеру и настройка основных функций.
<ol>
<li><p>Откройте файл <tt>DemoWizardAction.java</tt>. Обратите внимание, существует возможность настройки различных свойств мастера:</p>
<p><img border="1" src="../images/tutorials/wizard/wizard-tweaking.png"/></p>
<p>Описание этих свойств приведено <a href="http://ui.netbeans.org/docs/ui_apis/wide/index.html">здесь</a>.
</li>
<li><p>В <tt>DemoWizardAction.java</tt> измените текст <tt>wizardDescriptor.setTitle</tt> на следующий:
<pre class=examplecode>
wizardDescriptor.setTitle(&quot;Выбор музыки&quot;);
</pre>
<li><p>Откройте файл<tt>DemoVisualPanel1.java</tt> и файл<tt>DemoVisualPanel2.java</tt> и используйте конструктор графического интерфейса пользователя &quot;Matisse&quot; для добавления компонентов Swing например, следующих:</p>
<p><img border="1" src="../images/tutorials/wizard/panel-1-design.png"/></p>
<p><img border="1" src="../images/tutorials/wizard/panel-2-design.png"/></p>
<p>Выше показаны файлы <tt>DemoVisualPanel1.java</tt> и <tt>DemoVisualPanel2.java</tt>, с компонентами Swing.
</li>
<li>Откройте две панели в представлении Источник и измените их методы <tt>getName()</tt> на &quot;Имя и адрес&quot; и &quot;Информация о музыканте&quot;, соответственно.
<li><p>Запустите модуль еще раз. При открытии мастера, в зависимости от добавленных компонентов Swing и использованных настроек, внешний вид мастера будет аналогичен следующему:</p>
<p><img border="1" src="../images/tutorials/wizard/result-4.png"/></p>
<p class="tips"> Вышеприведенное изображение на левой панели мастера устанавливается в файле<tt>DemoWizardAction.java</tt> следующим образом:
<pre class=examplecode>
wizardDescriptor.putProperty(&quot;WizardPanel_image&quot;, ImageUtilities.loadImage(&quot;org/demo/wizard/banner.png&quot;, true));
</pre>
</ol>
<p>После того, как создано содержимое мастера, необходимо добавить программный код для обработки данных, которые вводятся пользователем.
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="process"></a>Обработка данных пользователя</h2>
<p>В этом разделе описана процедура передачи данных пользователя от одной панели к другой, а также как отображение результатов для пользователя после нажатия клавиши &quot;Готово&quot;.
<ol>
<li><p>В классе <tt>WizardPanel</tt> для получения набора данных из визуальных средств поддержки используется метод <tt>storeSettings</tt>. Например, создадим модуль получения данных в файле <tt>DemoVisualPanel1.java</tt>, а затем получим к нему доступ из файла <tt>DemoWizardPanel1.java</tt>:</p>
<pre class=examplecode>
public void storeSettings(Object settings) {
((WizardDescriptor) settings).putProperty(&quot;name&quot;, ((DemoVisualPanel1)getComponent()).getNameField());
((WizardDescriptor) settings).putProperty(&quot;address&quot;, ((DemoVisualPanel1)getComponent()).getAddressField());
}
</pre>
</li>
<li><p>Затем, с помощью файла <tt>DemoWizardAction.java</tt> получим введенные параметры и обработаем их:</p>
<pre class=examplecode>
public void actionPerformed(ActionEvent e) {
WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
// {0} будет заменен на WizardDesriptor.Panel.getComponent().getName()
wizardDescriptor.setTitleFormat(new MessageFormat(&quot;{0}&quot;));
wizardDescriptor.setTitle(&quot;Music Selection&quot;);
Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
dialog.setVisible(true);
dialog.toFront();
boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
if (!cancelled) {
<b>String name = (String) wizardDescriptor.getProperty(&quot;name&quot;);
String address = (String) wizardDescriptor.getProperty(&quot;address&quot;);
DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(name + &quot; &quot; + address));</b>
}
}
</pre>
<p class="tips"> <tt>NotifyDescriptor</tt> также можно использовать другими способами, например в окне завершения кода:
<p><img border="1" src="../images/tutorials/wizard/notifydescriptor.png"/></p>
</ol>
<p>Итак, была рассмотрена обработка данных, вводимых пользователем.
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="validate"></a>Проверка данных пользователя</h2>
<p>В этом разделе описана процедура проверки данных, введенных пользователем, при нажатии клавиши &quot;Далее&quot;.
<ol>
<li><p>В <tt>DemoWizardPanel1</tt> измените сигнатуру класса, реализовав <tt>WizardDescriptor.ValidatingPanel</tt> вместо <tt>WizardDescriptor.Panel</tt>:</p>
<pre class=examplecode>
public class DemoWizardPanel1 implements WizardDescriptor.ValidatingPanel
</pre>
<li>В начале класса следует изменить объявление <tt>JComponent</tt> на объявление
<pre class=examplecode>
private DemoVisualPanel1 component;
</pre>
<li>При реализации необходимо использовать абстрактный метод, например:
<pre class=examplecode>
@Override
public void validate() throws WizardValidationException {
String name = component.getNameTextField().getText();
if (name.equals(&quot;&quot;)){
throw new WizardValidationException(null, &quot;Invalid Name&quot;, null);
}
}
</pre>
<li><p>Запустите модуль. Нажмите кнопку &quot;Далее&quot;, не вводя ничего в поле &quot;Name&quot;. Должен появится нижеприведенный результат. Обратите внимание, что если данные не прошли проверку, то переход к следующей панели невозможен:</p>
<p><img border="1" src="../images/tutorials/wizard/validation1.png"/></p>
<li>Также, если поле было оставлено пустым, можно сделать кнопку &quot;Далее&quot; неактивной. Сначала необходимо объявить вверху класса логические переменные:
<pre class=examplecode>
private boolean isValid = true;
</pre>
<p>Затем переопределить <tt>isValid()</tt> следующим образом:
<pre class=examplecode>
@Override
public boolean isValid() {
return isValid;
}
</pre>
<p>Тогда, при вызове <tt>validate()</tt>, который происходит при нажатии кнопки &quot;Далее&quot;, возвращается значение &quot;false&quot;:
<pre class=examplecode>
@Override
public void validate() throws WizardValidationException {
String name = component.getNameTextField().getText();
if (name.equals(&quot;&quot;)) {
<b>isValid = false;</b>
throw new WizardValidationException(null, &quot;Недопустимое имя&quot;, null);
}
}
</pre>
<p>Другой вариант заключается в первоначальном задании значения логической переменной &quot;false&quot;. Затем реализуется <tt>DocumentListener</tt>, который добавляет слушатель для поля и, при вводе пользователем в этом поле текста, изменяет значения логической переменной на &quot;true&quot; и вызывает метод <tt>isValid()</tt>.
</ol>
<p>Итак, была рассмотрена проверка данных, вводимых пользователем.
<p class="tips"> Для получения дополнительных сведений о проверке данных, введенных пользователем, см. пример Тома Вилера в конце данного учебного курса.
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="persist"></a>Сохранение данных при перезапуске</h2>
<p>В этом разделе описана процедура сохранения данных при закрытии приложения, и их дальнейшее получение мастером при повторном запуске.
<ol>
<li><p>В <tt>DemoWizardPanel1.java</tt> переопределите методы <tt>readSettings</tt> и <tt>storeSettings</tt> следующим образом:</p>
<pre class=examplecode>
<b>JTextField nameField = ((DemoVisualPanel1) getComponent()).getNameTextField();
JTextField addressField = ((DemoVisualPanel1) getComponent()).getAddressTextField();</b>
@Override
public void readSettings(Object settings) {
<b>nameField.setText(NbPreferences.forModule(DemoWizardPanel1.class).get(&quot;namePreference&quot;, &quot;&quot;));
addressField.setText(NbPreferences.forModule(DemoWizardPanel1.class).get(&quot;addressPreference&quot;, &quot;&quot;));</b>
}
@Override
public void storeSettings(Object settings) {
((WizardDescriptor) settings).putProperty(&quot;name&quot;, nameField.getText());
((WizardDescriptor) settings).putProperty(&quot;address&quot;, addressField.getText());
<b>NbPreferences.forModule(DemoWizardPanel1.class).put(&quot;namePreference&quot;, nameField.getText());
NbPreferences.forModule(DemoWizardPanel1.class).put(&quot;addressPreference&quot;, addressField.getText());</b>
}
</pre>
</li>
<li><p>Запустите модуль еще раз и введите имя и адрес в первой панели мастера:</p>
<p><img border="1" src="../images/tutorials/wizard/nbpref1.png"/></p>
</li>
<li><p>Закройте приложение, откройте меню &quot;Файлы&quot; и просмотрите свойства файла в папке <tt>build</tt>приложения. На экране должны появиться следующие настройки:</p>
<p><img border="1" src="../images/tutorials/wizard/nbpref2.png"/></p>
</li>
<li><p>Еще раз запустите приложение. При следующем открытии мастера для задания значений в полях мастера будут автоматически использованы ранее заданные настройки.</p>
</li>
</ol>
<p>Итак, было рассмотрено сохранение данных при перезапуске.
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="brand"></a>Брэндинг мастера</h2>
<p>В этом разделе описана процедура изменения наименования кнопки &quot;Далее&quot; в инфраструктуре мастера на надпись &quot;Дополнительно&quot;.
<p class="tips"> Под термином &quot;брэндинг&quot; подразумевается настройка, которая обычно заключается в незначительных изменениях с сохранением языка интерфейса, в то время как под понятием &quot;интернационализация&quot; или &quot;локализация&quot; подразумевается перевод на другие языки. Сведения относительно локализации модулей NetBeans приведены <a href="http://translatedfiles.netbeans.org/index-l10n.html">здесь</a>.
<ol>
<li><p>В окне &quot;Файлы&quot; разверните папку <tt>branding</tt> и создайте нижеприведенную структуру файлов и папок:</p>
<p><img border="1" src="../images/tutorials/wizard/branding-1.png"/></p>
</li>
<li>Содержимое файла задайте следующим образом:
<pre class=examplecode>
CTL_NEXT=&amp;Дополнительно &gt;
</pre>
<p>Для остальных строк можно выполнить следующий брэндинг:
<pre class=examplecode>
CTL_CANCEL
CTL_PREVIOUS
CTL_FINISH
CTL_ContentName
</pre>
<p class="tips"> Клавиша &quot;CTL_ContentName&quot;по умолчанию настроена как &quot;Шаги&quot; и используется в левой панели мастера, если свойство &quot;WizardPanel_autoWizardStyle&quot; не было установлено как &quot;FALSE&quot;.
</li>
<li><p>Запустите приложение. Кнопка &quot;Далее&quot; будет подписана &quot;Дополнительно&quot;:</p>
<p><img border="1" src="../images/tutorials/wizard/branding-2.png"/></p>
<p class="tips"> Опционально, для удаления левой панели мастера можно использовать файл <tt>DemoWizardAction.java</tt>, как было описано ранее:
</p><pre class="examplecode"> wizardDescriptor.putProperty(&quot;WizardPanel_autoWizardStyle&quot;, Boolean.FALSE);
</pre>
<p>В результате вышеописанных настроек вид мастера будет следующим:</p>
<p><img border="1" src="../images/tutorials/wizard/branding-3.png"/></p>
</ol>
<p>Был рассмотрен брэндинг строк, определенных в инфраструктуре мастера и создание собственной брендированной версии.
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="further"></a>Дополнительные сведения</h2>
<p>Некоторые дополнительные сведения доступны в сети:
<ul>
<li><p>Сайт о NetBeans Тома Вилера (щелкните на изображении внизу):</p>
<p><a href="http://www.tomwheeler.com/netbeans/"><img border="1" src="../images/tutorials/wizard/tom.png"/></a></p>
<p class="tips"> Вышеприведенные примеры, хотя и были написаны для среды NetBeans 5.5, были успешно опробованы в среде IDE NetBeans 6.5.1 в операционной системе Ubuntu Linux с JDK 1.6.
<p>Особенно полезны данные примеры для демонстрации проверки пользовательских данных.
<li>Блог Джирджена (Geertjan)
<ul>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work">Как работает мастер: Часть 1&mdash;Введение</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work_part_2">Как работает мастер: Часть 2 &mdash; Различные типы</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work_part_3">Как работает мастер: Часть 3 &mdash; Ваш первый мастер</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work_part_4">Как работает мастер: Часть 4 &mdash; Ваш собственный итератор</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work_part_5">Как работает мастер: Часть 5 &mdash; Использование и внедрение существующих панелей</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/creating_a_better_java_class">Создание мастера Better Java Class</a>
</ul>
</ul>
<br />
<h2><a name="version"></a>Управление версиями </h2>
<p>
<table width="76%" border="1">
<tbody>
<tr>
<td>
<div align="left"><b>Версия</b></div>
</td>
<td>
<div align="left"><b>Дата</b></div>
</td>
<td>
<div align="left"><b>Изменения</b></div>
</td>
</tr>
<tr>
<td>
1
</td>
<td>
31 марта 2009
</td>
<td>
Первоначальная версия. Выполнить:
<p><ul>
<li><strike>Добавить раздел о проверке данных, введенных пользователем.</strike>
<li><strike>Добавить раздел о сохранении данных мастером и загрузке данных из мастера.</strike>
<li>Добавить таблицу с перечислением всех свойств WizardDescriptor.
<li>Добавить таблицу с перечислением и объяснением всех классов Wizard API.
<li>Добавить ссылки на Javadoc.
</ul>
</td>
</tr>
<tr>
<td>
2
</td>
<td>
1 апреля 2009 г.
</td>
<td>
Добавлен раздел о проверке данных с примером программного кода, который делает кнопку &quot;Далее&quot; неактивной. Также добавлен раздел о сохранении состояния.
</td>
</tr>
<tr>
<td>
3
</td>
<td>
10 апреля 2009 г.
</td>
<td>
Приведены комментарии Тома Вилера, переписан раздел о брэндинге, так чтобы было больше информации о самом брэндинге, добавлены ссылки на сведения о локализации.
</td>
</tr>
</tbody>
</table>
</body>
</html>