blob: 5728fb146edfc4b4e34344bbf2d8a30c1c76634c [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>Tutorial do m&oacute;dulo de assistente do NetBeans para a plataforma 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>Tutorial do m&oacute;dulo de assistente do NetBeans</h1>
<p>Neste tutorial, voc&ecirc; aprender&aacute; como usar os recursos principais fornecidos pelas classes de assistente da <a href="http://bits.netbeans.org/dev/javadoc/org-openide-dialogs/org/openide/package-summary.html">API de di&aacute;logos do NetBeans</a>.</p>
<p><b>Conte&uacute;do</b></p>
<img src="../images/articles/68/netbeans-stamp-65-67-68.gif" class="stamp" width="114" height="114" alt="O conte&uacute;do desta p&aacute;gina se aplica ao NetBeans IDE 6.5, 6.7, 6.8" title="O conte&uacute;do desta p&aacute;gina se aplica ao NetBeans IDE 6.5, 6.7, 6.8"> </p>
<ul class="toc">
<li><a href="#set">Criando o projeto do m&oacute;dulo </a>
<li><a href="#wiz">Criando a infra-estrutura do assistente</a>
<li><a href="#action">Registrando a classe de a&ccedil;&atilde;o do assistente</a>
<li><a href="#design">Criando o conte&uacute;do do assistente</a>
<li><a href="#process">Processando os dados do usu&aacute;rio</a>
<li><a href="#validate">Validando os dados do usu&aacute;rio</a>
<li><a href="#persist">Persistindo dados nas reinicializa&ccedil;&otilde;es</a>
<li><a href="#brand">Marcando o assistente</a>
<li><a href="#further">Leituras adicionais</a>
</ul>
<p class="tips"> Nos aplicativos da plataforma NetBeans &eacute; poss&iacute;vel criar diferentes tipos de assistentes. Se deseja criar um assistente que apare&ccedil;a na caixa de di&aacute;logo Novo projeto, consulte o <a href="https://platform.netbeans.org/tutorials/nbm-projectsamples.html">Tutorial do m&oacute;dulo de amostra do projeto</a>. Se deseja criar um assistente que apare&ccedil;a na caixa de di&aacute;logo Novo arquivo, consulte o <a href="http://platform.netbeans.org/tutorials/nbm-filetemplates.html">Tutorial do m&oacute;dulo de arquivo de modelo</a>. Neste tutorial, voc&ecirc; cria um assistente geral que aparece ao clicar em um bot&atilde;o na barra de ferramentas.
<p><b>Para seguir este tutorial, voc&ecirc; precisa dos softwares e recursos listados na tabela seguinte.</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software ou recurso</th>
<th class="tblheader" scope="col">Vers&atilde;o necess&aacute;ria</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">vers&atilde;o 6.5 ou superior</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
<td class="tbltd1">Vers&atilde;o 6 ou<br/>vers&atilde;o 5</td>
</tr>
</tbody>
</table>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="set"></a>Criando o projeto do m&oacute;dulo </h2>
<p>Come&ccedil;amos trabalhando atrav&eacute;s do assistente para novo projeto de m&oacute;dulo. No final, teremos uma estrutura de c&oacute;digo-fonte b&aacute;sica, com alguns arquivos padr&atilde;o, que todos os m&oacute;dulos NetBeans exigem.
<ol>
<li>Escolha Arquivo &gt; Novo projeto (Ctrl-Shift-N). Em Categorias, selecione M&oacute;dulos do NetBeans. Em Projetos, selecione M&oacute;dulo . Clique em Pr&oacute;ximo.</li>
<li>No painel Nome e localiza&ccedil;&atilde;o, digite <tt>DemoWizard</tt> no campo Nome do projeto. Altere Local do projeto para qualquer diret&oacute;rio no computador. Deixe marcadas a op&ccedil;&atilde;o M&oacute;dulo independente e a caixa de verifica&ccedil;&atilde;o Definir como projeto principal. Clique em Pr&oacute;ximo.</li>
<li>No painel Configura&ccedil;&atilde;o b&aacute;sica de m&oacute;dulos, digite <tt>org.demo.wizard</tt> no Nome de base de c&oacute;digo.</li>
<li>Selecione &quot;Gerar camada XML&quot;. Deixe as localiza&ccedil;&otilde;es do pacote de localiza&ccedil;&otilde;es e a camada XML, de modo que sejam armazenados em um pacote com o nome <tt>org/demo/wizard</tt>. Clique em Terminar.</li>
</ol>
<p> O IDE cria o projeto <tt>DemoWizard</tt>. O projeto cont&eacute;m todos os metadados de projeto e fontes, como o script de constru&ccedil;&atilde;o Ant do projeto. O projeto se abre no IDE. Voc&ecirc; pode ver a estrutura l&oacute;gica na janela Projetos (Ctrl-1) e a estrutura de arquivos na janela Arquivos (Ctrl+2).</p>
<br />
<!-- ===================================================================================== -->
<p><h2><a name="wiz"></a>Criando a infra-estrutura do assistente</h2>
<p>Nesta se&ccedil;&atilde;o, usamos o assistente Wizard para adicionar stubs de um assistente ao nosso m&oacute;dulo.
<ol>
<li><p>Na janela Projetos, clique com o bot&atilde;o direito do mouse no n&oacute; do projeto DemoWizard e selecione Desenvolvimento do m&oacute;dulo | Assistente: </p>
<p><img border="1" src="../images/tutorials/wizard/wizard-wizard.png"/>
<p>Clique em Avan&ccedil;ar.</p>
</li>
<li><p>No painel Tipo de assistente, digite 2 no campo &quot;N&uacute;mero de pain&eacute;is do assistente&quot; e deixe os outros valores inalterados:</p>
<p><img border="1" src="../images/tutorials/wizard/wizard-wizard-3.png"/>
<p>Os campos no painel acima s&atilde;o os seguintes:
<ul>
<li><b>Tipo de registro.</b> Determina onde o usu&aacute;rio acessar&aacute; o assistente. Se selecionar &quot;Personalizado&quot;, o assistente Wizard criar&aacute; uma nova classe de a&ccedil;&atilde;o que voc&ecirc; pode usar para abrir e inicializar seu assistente. Se selecionar &quot;Novo arquivo&quot;, o assistente Wizard registrar&aacute; seu assistente no arquivo <tt>layer.xml</tt> do m&oacute;dulo.
<li><b>Seq&uuml;&ecirc;ncia de etapas do assistente.</b> Determina se o assistente ser&aacute; linear ou se o usu&aacute;rio do assistente poder&aacute; saltar etapas dependendo das escolhas feitas anteriormente. Os assistentes lineares s&atilde;o 'est&aacute;ticos', que &eacute; o padr&atilde;o, enquanto que os assistentes com etapas que podem ser saltadas requerem uma classe de repetidor personalizada, que &eacute; criada se voc&ecirc; seleciona 'din&acirc;mico'.
<li><b>N&uacute;mero de pain&eacute;is do assistente.</b> Determina o n&uacute;mero de pain&eacute;is que ser&atilde;o criados. Para cada etapa do assistente, ser&atilde;o criados dois arquivos Java &mdash; uma visualiza&ccedil;&atilde;o e um controlador.
</ul>
<p>Clique em Avan&ccedil;ar.</p>
</li>
<li><p>No painel Nome e localiza&ccedil;&atilde;o, digite <tt>Demo</tt> no Prefixo do nome da classe e selecione o pacote principal na lista suspensa Pacote:</p>
<p><img border="1" src="../images/tutorials/wizard/wizard-wizard-4.png"/>
<p>Clique em Terminar.</p>
</li>
</ol>
<p>Na janela Projetos, agora deveria aparecer o seguinte:
<p><img border="1" src="../images/tutorials/wizard/projects-window.png"/>
<p><h2><a name="action"></a>Registrando a classe de a&ccedil;&atilde;o do assistente</h2>
<p>Nesta se&ccedil;&atilde;o, modificamos a classe Action e a registramos no arquivo <tt>layer.xml</tt>.
<ol>
<li>Abra o arquivo <tt>DemoWizardAction.java</tt> e substitua todos os c&oacute;digos pelo seguinte:
<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} will be replaced by WizardDesriptor.Panel.getComponent().getName()
wizardDescriptor.setTitleFormat(new MessageFormat(&quot;{0}&quot;));
wizardDescriptor.setTitle(&quot;Your wizard dialog title here&quot;);
Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
dialog.setVisible(true);
dialog.toFront();
boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
if (!cancelled) {
// do something
}
}
/**
* Initialize panels representing individual wizard's steps and sets
* various properties for them influencing wizard appearance.
*/
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();
// Default step name to component name of panel. Mainly useful
// for getting the name of the target chooser to appear in the
// list of steps.
steps[i] = c.getName();
if (c instanceof JComponent) { // assume Swing components
JComponent jc = (JComponent) c;
// Sets step number of a component
// TODO if using org.openide.dialogs &gt;= 7.8, can use WizardDescriptor.PROP_*:
jc.putClientProperty(&quot;WizardPanel_contentSelectedIndex&quot;, new Integer(i));
// Sets steps names for a panel
jc.putClientProperty(&quot;WizardPanel_contentData&quot;, steps);
// Turn on subtitle creation on each step
jc.putClientProperty(&quot;WizardPanel_autoWizardStyle&quot;, Boolean.TRUE);
// Show steps on the left side with the image on the background
jc.putClientProperty(&quot;WizardPanel_contentDisplayed&quot;, Boolean.TRUE);
// Turn on numbering of all steps
jc.putClientProperty(&quot;WizardPanel_contentNumbered&quot;, Boolean.TRUE);
}
}
}
return panels;
}
public String getName() {
return &quot;Start Sample Wizard&quot;;
}
}
</pre>
</li>
<p class="tips"> Estamos usando o mesmo c&oacute;dido que foi gerado, exceto que implementamos o <tt>ActionListener</tt> em vez do <tt>CallableSystemAction</tt>. Fazemos isso porque <tt>ActionListener</tt> &eacute; uma classe JDK padr&atilde;o, enquanto que <tt>CallableSystemAction</tt> n&atilde;o. A partir da plataforma NetBeans 6.5, &eacute; poss&iacute;vel usar a classe JDK padr&atilde;o, que &eacute; mais apropriada e exige menos c&oacute;digo.
<li>Registre a classe de a&ccedil;&atilde;o no arquivo <tt>layer.xml</tt> da seguinte forma:
<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"> O elemento &quot;iconBase&quot; aponta para uma imagem denominada &quot;icon.png&quot; do pacote principal. Use sua pr&oacute;pria imagem com tal nome, certificando-se de que o tamanho seja de 16x16 pixels ou use a imagem seguinte: <img border="1" src="../images/tutorials/wizard/icon.png"/>
<li>Execute o m&oacute;dulo. O aplicativo se inicia e o bot&atilde;o deveria ser visto na barra de ferramentas que voc&ecirc; especificou no arquivo <tt>layer.xml</tt>:
<p><img border="1" src="../images/tutorials/wizard/result-1.png"/>
<p>Clique no bot&atilde;o e o assistente &eacute; exibido:
<p><img border="1" src="../images/tutorials/wizard/result-2.png"/>
<p>Clique em Pr&oacute;ximo e observe que no painel final o bot&atilde;o Terminar est&aacute; habilitado:
<p><img border="1" src="../images/tutorials/wizard/result-3.png"/>
</li>
</ol>
<p>Agora que a infra-estrutura do assistente est&aacute; funcionando, vamos adicionar algum tipo de conte&uacute;do.
<p><h2><a name="design"></a>Criando o conte&uacute;do do assistente</h2>
<p>Nesta se&ccedil;&atilde;o, adicionamos o conte&uacute;do ao assistente e personalizamos os recursos b&aacute;sicos.
<ol>
<li><p>Abra o arquivo <tt>DemoWizardAction.java</tt> e observe que &eacute; poss&iacute;vel definir v&aacute;rias propriedades de personaliza&ccedil;&atilde;o para o assistente:</p>
<p><img border="1" src="../images/tutorials/wizard/wizard-tweaking.png"/></p>
<p>Leia mais sobre estas propriedades <a href="http://ui.netbeans.org/docs/ui_apis/wide/index.html">aqui</a>.
</li>
<li><p>Em <tt>DemoWizardAction.java</tt>, altere <tt>wizardDescriptor.setTitle</tt> pelo seguinte:
<pre class=examplecode>
wizardDescriptor.setTitle(&quot;Music Selection&quot;);
</pre>
<li><p>Abra os arquivos <tt>DemoVisualPanel1.java</tt> e <tt>DemoVisualPanel2.java</tt> e use o construtor de GUI &quot;Matisse&quot; para adicionar alguns componentes Swing, como os seguintes:</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>Acima, voc&ecirc; v&ecirc; os arquivos <tt>DemoVisualPanel1.java</tt> e <tt>DemoVisualPanel2.java</tt> com alguns componentes Swing.
</li>
<li>Abra os dois pain&eacute;is na visualiza&ccedil;&atilde;o C&oacute;digo-fonte e altere seus m&eacute;todos <tt>getName()</tt> por &quot;Name and Address&quot; e &quot;Musician Details&quot;, respectivamente.
<li><p>Execute o m&oacute;dulo novamente. Quando o assistente for aberto, voc&ecirc; deveria ver algo semelhante ao exibido abaixo, dependendo dos componentes Swing adicionados e das personaliza&ccedil;&otilde;es feitas:</p>
<p><img border="1" src="../images/tutorials/wizard/result-4.png"/></p>
<p class="tips"> A imagem na barra lateral esquerda do assistente acima &eacute; definida no arquivo <tt>DemoWizardAction.java</tt>, da seguinte forma:
<pre class=examplecode>
wizardDescriptor.putProperty(&quot;WizardPanel_image&quot;, ImageUtilities.loadImage(&quot;org/demo/wizard/banner.png&quot;, true));
</pre>
</ol>
<p>Agora que voc&ecirc; criou o conte&uacute;do do assistente, vamos adicionar c&oacute;digo para o processamento dos dados que o usu&aacute;rio ir&aacute; introduzir.
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="process"></a>Processando os dados do usu&aacute;rio</h2>
<p>Nesta se&ccedil;&atilde;o, voc&ecirc; aprende como passar os dados do usu&aacute;rio de um painel a outro e como exibir os resultados para o usu&aacute;rio quando ele clicar em Terminar.
<ol>
<li><p>Nas classes de <tt>WizardPanel</tt>, use o m&eacute;todo <tt>storeSettings</tt> para recuperar os dados definidos no painel visual. Por exemplo, crie getters no arquivo <tt>DemoVisualPanel1.java</tt> e, em seguida, acesse-os da seguinte forma a partir do arquivo <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>Depois, use o arquivo <tt>DemoWizardAction.java</tt> para recuperar as propriedades que voc&ecirc; definiu e adote o seguinte procedimento com tais propriedades:</p>
<pre class=examplecode>
public void actionPerformed(ActionEvent e) {
WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
// {0} will be replaced by 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"> O <tt>NotifyDescriptor</tt> pode ser usado tamb&eacute;m de outras formas, conforme indicado pela caixa de auto-completar c&oacute;digo:
<p><img border="1" src="../images/tutorials/wizard/notifydescriptor.png"/></p>
</ol>
<p>Agora voc&ecirc; j&aacute; sabe como processar os dados introduzidos pelo usu&aacute;rio.
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="validate"></a>Validando os dados do usu&aacute;rio</h2>
<p>Nesta se&ccedil;&atilde;o, voc&ecirc; aprende como validar a entrada do usu&aacute;rio quando o bot&atilde;o &quot;Next&quot; for clicado no assistente.
<ol>
<li><p>Em <tt>DemoWizardPanel1</tt>, altere a assinatura de classe, implementando <tt>WizardDescriptor.ValidatingPanel</tt> em vez de <tt>WizardDescriptor.Panel</tt>:</p>
<pre class=examplecode>
public class DemoWizardPanel1 implements WizardDescriptor.ValidatingPanel
</pre>
<li>Na parte superior da classe, altere a declara&ccedil;&atilde;o <tt>JComponent</tt> por uma declara&ccedil;&atilde;o digitada:
<pre class=examplecode>
private DemoVisualPanel1 component;
</pre>
<li>Implemente o m&eacute;todo abstrato necess&aacute;rio da seguinte forma:
<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>Execute o m&oacute;dulo. Clique em &quot;Next&quot;, sem introduzir nada no campo &quot;Name&quot; e voc&ecirc; deveria ver o resultado abaixo. Observe tamb&eacute;m que n&atilde;o &eacute; poss&iacute;vel mover para o painel seguinte, como conseq&uuml;&ecirc;ncia da falha na valida&ccedil;&atilde;o:</p>
<p><img border="1" src="../images/tutorials/wizard/validation1.png"/></p>
<li>Como op&ccedil;&atilde;o, desabilite o bot&atilde;o &quot;Next&quot; se o campo do nome estiver vazio. Comece declarando um booleano na parte superior da classe:
<pre class=examplecode>
private boolean isValid = true;
</pre>
<p>A seguir, substitua <tt>isValid()</tt> da seguinte forma:
<pre class=examplecode>
@Override
public boolean isValid() {
return isValid;
}
</pre>
<p>E, quando <tt>validate()</tt> for chamado, o que ocorre quando o bot&atilde;o &quot;Next&quot; &eacute; clicado, retorne falso:
<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;Invalid Name&quot;, null);
}
}
</pre>
<p>Como alternativa, defina o booleano inicialmente como falso. A seguir, implemente <tt>DocumentListener</tt>, adicione um listener no campo e, quando o usu&aacute;rio digitar algo no campo, defina o booleano como verdadeiro e chame <tt>isValid()</tt>.
</ol>
<p>Agora voc&ecirc; j&aacute; sabe como validar os dados introduzidos pelo usu&aacute;rio.
<p class="tips"> Para obter mais informa&ccedil;&otilde;es sobre valida&ccedil;&atilde;o da entrada do usu&aacute;rio, consulte a amostra de Tom Wheeler ao final deste tutorial.
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="persist"></a>Persistindo dados nas reinicializa&ccedil;&otilde;es</h2>
<p>Nesta se&ccedil;&atilde;o, voc&ecirc; aprende como armazenar os dados quando o aplicativo se fecha e como recuper&aacute;-los quando o assistente se abre ap&oacute;s ser iniciado novamente.
<ol>
<li><p>Em <tt>DemoWizardPanel1.java</tt>, substitua os m&eacute;todos <tt>readSettings</tt> e <tt>storeSettings</tt> da seguinte forma:</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>Execute o m&oacute;dulo novamente e digite um nome e endere&ccedil;o no primeiro painel do assistente:</p>
<p><img border="1" src="../images/tutorials/wizard/nbpref1.png"/></p>
</li>
<li><p>Feche o aplicativo, abra a janela Arquivos e analise o arquivo de propriedades dentro da pasta <tt>build</tt> do aplicativo. Voc&ecirc; deveria encontrar agora as seguintes configura&ccedil;&otilde;es:</p>
<p><img border="1" src="../images/tutorials/wizard/nbpref2.png"/></p>
</li>
<li><p>Execute o aplicativo novamente e, da pr&oacute;xima vez que o assistente for aberto, as configura&ccedil;&otilde;es especificadas acima ser&atilde;o automaticamente usadas para definir os valores nos campos do assistente.</p>
</li>
</ol>
<p>Agora voc&ecirc; j&aacute; sabe como fazer os dados do assistente persistirem depois das reinicializa&ccedil;&otilde;es.
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="brand"></a>Marcando o assistente</h2>
<p>Nesta se&ccedil;&atilde;o, voc&ecirc; marca a string do bot&atilde;o &quot;Next&quot; (Pr&oacute;ximo), fornecido pela infra-estrutura, como &quot;Advance&quot; (Avan&ccedil;ar).
<p class="tips"> O termo &quot;marca&ccedil;&atilde;o&quot; significa personaliza&ccedil;&atilde;o, ou seja, trata-se normalmente de pequenas modifica&ccedil;&otilde;es dentro do mesmo idioma, enquanto que &quot;internacionaliza&ccedil;&atilde;o&quot; ou &quot;localiza&ccedil;&atilde;o&quot; significam a tradu&ccedil;&atilde;o para outro idioma. Para obter mais informa&ccedil;&otilde;es sobre a localiza&ccedil;&atilde;o dos m&oacute;dulos NetBeans, <a href="http://translatedfiles.netbeans.org/index-l10n.html">consulte aqui</a>.
<ol>
<li><p>Na janela Arquivos, expanda a pasta <tt>branding</tt> do aplicativo e crie a estrutura de pasta/arquivo real&ccedil;ada abaixo:</p>
<p><img border="1" src="../images/tutorials/wizard/branding-1.png"/></p>
</li>
<li>Defina o conte&uacute;do do arquivo da seguinte forma:
<pre class=examplecode>
CTL_NEXT=&amp;Advance &gt;
</pre>
<p>Outras strings que poderiam ser marcadas s&atilde;o:
<pre class=examplecode>
CTL_CANCEL
CTL_PREVIOUS
CTL_FINISH
CTL_ContentName
</pre>
<p class="tips"> A tecla &quot;CTL_ContentName&quot; est&aacute; definida como &quot;Steps&quot; por padr&atilde;o, que &eacute; usada no painel esquerdo do assistente, caso a propriedade &quot;WizardPanel_autoWizardStyle&quot; n&atilde;o tenha sido definida como &quot;FALSE&quot;.
</li>
<li><p>Execute o aplicativo e o bot&atilde;o &quot;Next&quot; estar&aacute; marcado como &quot;Advance&quot;:</p>
<p><img border="1" src="../images/tutorials/wizard/branding-2.png"/></p>
<p class="tips"> Como op&ccedil;&atilde;o, use o arquivo <tt>DemoWizardAction.java</tt>, conforme descrito anteriormente, para remover todo o lado esquerdo do painel do assistente da seguinte forma:
</p><pre class="examplecode"> wizardDescriptor.putProperty(&quot;WizardPanel_autoWizardStyle&quot;, Boolean.FALSE);
</pre>
<p>As configura&ccedil;&otilde;es acima t&ecirc;m como resultado um assistente com a seguinte apar&ecirc;ncia:</p>
<p><img border="1" src="../images/tutorials/wizard/branding-3.png"/></p>
</ol>
<p>Agora voc&ecirc; j&aacute; sabe como marcar as strings definidas na infra-estrutura do assistente com suas pr&oacute;prias vers&otilde;es marcadas.
<br />
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="further"></a>Leituras adicionais</h2>
<p>V&aacute;rios artigos sobre informa&ccedil;&otilde;es relacionadas est&atilde;o dispon&iacute;veis on-line:
<ul>
<li><p>O site sobre NetBeans de Tom Wheeler (clique na imagem abaixo):</p>
<p><a href="http://www.tomwheeler.com/netbeans/"><img border="1" src="../images/tutorials/wizard/tom.png"/></a></p>
<p class="tips"> Embora esteja escrito para o NetBeans 5.5, a amostra acima foi testada com &ecirc;xito no NetBeans IDE 6.5.1 em Ubuntu Linux com JDK 1.6.
<p>A amostra &eacute; especialmente &uacute;til para mostrar como validar os dados do usu&aacute;rio.
<li>Blog do Geertjan:
<ul>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work">Como funcionam os assistentes: Parte 1&mdash;Introdu&ccedil;&atilde;o</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work_part_2">Como funcionam os assistentes: Parte 2&mdash;Tipos diferentes</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work_part_3">Como funcionam os assistentes: Parte 3&mdash;Seu primeiro assistente</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work_part_4">Como funcionam os assistentes: Parte 4&mdash;Seu pr&oacute;prio repetidor</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/how_wizards_work_part_5">Como funcionam os assistentes: Parte 5&mdash;Reutilizando e incorporando pain&eacute;is existentes</a>
<li><a href="http://blogs.oracle.com/geertjan/entry/creating_a_better_java_class">Criando um melhor assistente para classe Java</a>
</ul>
</ul>
<br />
<h2><a name="version"></a>Versionamento </h2>
<p>
<table width="76%" border="1">
<tbody>
<tr>
<td>
<div align="left"><b>Vers&atilde;o</b></div>
</td>
<td>
<div align="left"><b>Data</b></div>
</td>
<td>
<div align="left"><b>Altera&ccedil;&otilde;es</b></div>
</td>
</tr>
<tr>
<td>
1
</td>
<td>
31 de mar&ccedil;o de 2009
</td>
<td>
Vers&atilde;o inicial. A fazer:
<p><ul>
<li><strike>Adicionar uma se&ccedil;&atilde;o sobre valida&ccedil;&atilde;o da entrada do usu&aacute;rio.</strike>
<li><strike>Adicionar uma se&ccedil;&atilde;o sobre armazenamento/recupera&ccedil;&atilde;o de dados para/do assistente.</strike>
<li>Adicionar uma tabela que lista todas as propriedades do WizardDescriptor.
<li>Adicionar uma tabela que lista e explica todas as classes API do assistente.
<li>Adicionar links ao Javadoc.
</ul>
</td>
</tr>
<tr>
<td>
2
</td>
<td>
1 de abril de 2009
</td>
<td>
Adicionada uma se&ccedil;&atilde;o de valida&ccedil;&atilde;o, com o c&oacute;digo para a desabilita&ccedil;&atilde;o do bot&atilde;o &quot;Next&quot; (Pr&oacute;ximo). Adicionada tamb&eacute;m uma se&ccedil;&atilde;o sobre persist&ecirc;ncia.
</td>
</tr>
<tr>
<td>
3
</td>
<td>
10 de abril de 2009
</td>
<td>
Coment&aacute;rios integrados por Tom Wheeler, reescrevendo a se&ccedil;&atilde;o sobre marca&ccedil;&atilde;o para que seja realmente sobre marca&ccedil;&atilde;o, com uma refer&ecirc;ncia sobre onde as informa&ccedil;&otilde;es sobre localiza&ccedil;&atilde;o podem ser encontradas.
</td>
</tr>
</tbody>
</table>
</body>
</html>