<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GWT Brasil &#187; java</title>
	<atom:link href="http://www.gwt.com.br/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gwt.com.br</link>
	<description>Grupo de usuários do GWT no Brasil</description>
	<lastBuildDate>Sat, 10 Oct 2009 03:37:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Novidades do GWT 2.0</title>
		<link>http://www.gwt.com.br/2009/07/01/novidades-do-gwt-20/</link>
		<comments>http://www.gwt.com.br/2009/07/01/novidades-do-gwt-20/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 14:58:04 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[curtas]]></category>
		<category><![CDATA[google-io]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oophm]]></category>
		<category><![CDATA[runasync]]></category>
		<category><![CDATA[webtoolkit]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/?p=94</guid>
		<description><![CDATA[Olá pessoas, após um longo perí­odo sem atualizações estou aqui novamente escrevendo sobre GWT 
Hoje vou falar um pouco sobre uma palestra do Bruce Johnson no Google-IO que vi a alguns dias atrás&#8230; sobre o que está por vir na nova versão do framework. Confesso que fiquei bastante empolgado, funcionalidades a muito esperadas estarão presentes [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoas, após um longo perí­odo sem atualizações estou aqui novamente escrevendo sobre GWT <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Hoje vou falar um pouco sobre uma palestra do Bruce Johnson no Google-IO que vi a alguns dias atrás&#8230; sobre o que está por vir na nova versão do framework. Confesso que fiquei bastante empolgado, funcionalidades a muito esperadas estarão presentes e outras que pelo menos eu, não esperava, me surpreenderam bastante. Vamos aos principais pontos:</p>
<ul>
<li><strong>OOPHM</strong>: Out Of Proccess Hosted Mode </li>
<li><strong>RunAsync</strong>: Quebre o tamanho do arquivo javascript gerado</li>
<li><strong>SOYC</strong>:Story Of Yout Compile</li>
<li><strong>Novos Paineis</strong> <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> aineis mais rápidos</li>
<li><strong>ClientBundle</strong>:Já pensou num <a href="http://www.gwt.com.br/2008/09/08/utilizando-um-imagebundle/">ImageBundle</a> melhorado? pois é&#8230; conseguiram.. <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Em breve pretendo escrever posts sobre cada uma das funcionalidades acima.</p>
<p>Você encontra o link para o download da apresentação do Bruce Johnson <a href="http://dl.google.com/io/2009/pres/W_1115_GWTCanDoWhat.pdf">aqui</a> e o video da apresentação logo após o break <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-94"></span></p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/e9A4FqholOY&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/e9A4FqholOY&#038;rel=0&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2009/07/01/novidades-do-gwt-20/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comunicação Cliente-Servidor utilizando o RPC</title>
		<link>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/</link>
		<comments>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 11:57:34 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Básico]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rpc]]></category>
		<category><![CDATA[service]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/?p=69</guid>
		<description><![CDATA[Este post descreve como funciona o mecanismo de comunicaÃ§Ã£o rpc do gwt.]]></description>
			<content:encoded><![CDATA[<p>É comum para alguém que esteja começando a programar com o GWT ter um pouco de dificuldade com a comunicação entre cliente e servidor através do mecanismo padrão do GWT, o RPC. Após receber alguns emails sobre como fazer isso resolvi escrever este post mostrando de uma forma simplificada e rápida os passos necessários para a execução dessa tarefa simples e extremamente comum em aplicações ajax.<br />
<span id="more-69"></span><br />
Para começar é interessante saber como funciona esse mecanismo. De forma resumida o que acontece é o seguinte: Ao receber o seu objeto java, o compilador gwt vai transformá-lo em uma String então a serializa e em seguida envia ao servidor por meio de uma conexão HTTP normal. Ao receber esse objeto serializado o servidor(Servlet gwt) então deserializa o objeto executando o caminho inverso, transformando a String em um objeto java e então este segue o seu ciclo de vida normal. Da mesma maneira, o inverso também é verdade. Assim, a comunicação pode ser efetuada em ambos os sentidos. Para conseguir executar toda essa tarefa é necessário que o objeto a ser enviado obedeça a algumas regras, a seguir:</p>
<ol>
<li>Ser de um tipo básico/primitivo (String, Integer/int, Double/double, Long/long, Boolean/boolean ).</li>
<li>Implementar a interface Serializable ou IsSerializable(gwt < 1.4). </li>
</li>
<li>Todos os campos do objeto devem obedecer à(s) regra(s) 1 e/ou 2.</li>
</ol>
<p>O uso de coleções e mapas é permitido desde que se use generics e os tipos que elas encapsulem obedeçam às regras citadas anteriormente. Assim é possí­vel se ter por exemplo uma List&lt;String&gt; trafegando entre o cliente e o servidor.</p>
<p>Abaixo você encontra o diagrama de implementação de um serviço rpc do gwt.<br />
<div class="wp-caption aligncenter" style="width: 510px"><img alt="Diagrama de Implementação de um Serviço RPC" src="http://google-web-toolkit-doc-1-5.googlecode.com/svn/wiki/AnatomyOfServices.gif" title="Diagrama de Implementação de um Serviço RPC" width="500" height="433" /><p class="wp-caption-text">Diagrama de Implementação de um Serviço RPC</p></div></p>
<p>O que essa coisa toda realmente significa é bastante simples:</p>
<ul>
<li>2 interfaces</li>
<li>1 servlet</li>
</ul>
<p>As duas interfaces servem para a definir o que o serviço irá realizar, por exemplo: Verificar se um usuário possui acesso a um determinado recurso, efetuar login no sistema&#8230; etc. Uma dessas interfaces é chamada de síncrona e a outra de assí­ncrona. O servlet define o como esse serviço será implementado e por isso ele deve implementar a interface sí­ncrona do serviço. </p>
<p>Utilizando a versão 1.5 do gwt temos o seguinte:</p>
<p>Interface Sí­ncrona:<br />
[java]<br />
package br.com.gwt.rpc.client.servico;</p>
<p>@RemoteServiceRelativePath(&#8221;/servico&#8221;)<br />
public interface Servico extends Service{<br />
      public Boolean autoriza(String loginToken, String recurso);<br />
      public String login(String login, String senha) throws Exception;<br />
      public void logout(String loginToken);<br />
}<br />
[/java]</p>
<p>Interface Assí­ncrona:</p>
<p>[java]<br />
package br.com.gwt.rpc.client.servico;</p>
<p>public interface ServicoAsync {<br />
    public void autoriza(String loginToken, String recurso, AsyncCallback&gt;Boolean&lt; callback);<br />
    public void login(String login, String senha, AsyncCallback&gt;String&lt; callback);<br />
    public void logout(String loginToken, AsyncCallback&gt;Void&lt; callback);<br />
}<br />
[/java]</p>
<p>Reparem que na interface Assí­ncrona os métodos não retornam objetos e os parâmetros dos métodos são os mesmos da interface sí­ncrona com o acréscimo de um AsyncCallback. Entrarei em detalhes logo abaixo.</p>
<p>Agora, restam somente dois passos para a criação do serviço. Implementar o servlet e registrá-lo no arquivo do módulo. </p>
<p>[java]<br />
package br.com.gwt.rpc.server.servico;<br />
public class ServicoImpl extends RemoteServiceServlet implements Servico {<br />
      public Boolean autoriza(String loginToken, String recurso) {<br />
            &#8230;<br />
            /*implementação da autorização;*/<br />
            &#8230;<br />
      }<br />
      public String login(String login, String senha) throws Exception {<br />
            &#8230;<br />
            /*implementação do login*/<br />
            &#8230;<br />
      }<br />
      public void logout(String loginToken) {<br />
            &#8230;<br />
            /*implementação do logout*/<br />
            &#8230;<br />
      }<br />
}<br />
[/java]</p>
<p>Abaixo o arquivo de configuração do módulo gwt.</p>
<p>[xml]<br />
<module><br />
        &#8230;<br />
	<servlet path="/servico" class="br.com.gwt.rpc.client.servico.ServicoImpl"/><br />
        &#8230;<br />
</module><br />
[/xml]</p>
<p>A partir daí­ o serviço está pronto para ser usado. Repare que o path no módulo de configuração é o mesmo definido logo no iní­cio da interface sí­ncrona. Feito isso enquanto estiver utilizando em hosted mode, não é necessário nenhuma outra configuração adicional. Para a utilização em web mode é necessária uma última configuração. Registrar o servlet no web.xml. Esta última tarefa não será coberta neste post por se tratar de uma atividade comum em uma aplicação JEE. </p>
<p>Para fazer uma chamada ao serviço o compilador do gwt deve ser invocado através da seguinte chamada:</p>
<p>[java]<br />
    ServicoAsync servico = GWT.create(Servico.class);<br />
[/java]</p>
<p>As chamadas são sempre assí­ncronas, isso significa que é criada uma conexção HTTP com o servidor, essa chamada é executada e em algum momento ela irá retornar e então executará o código que faz parte do AsyncCallback que criamos. A seguir um exemplo de chamada ao método de login:</p>
<p>[java]<br />
   &#8230;<br />
   servico.login(&#8221;login&#8221;, &#8220;1234&#8243;, new AsyncCallback<string> callback{<br />
     public void onSuccess(String result) {<br />
           loginToken = result;<br />
           Window.alert(&#8221;Login efetuado com sucesso!&#8221;);<br />
     }</p>
<p>     public void onFailure(Throwable cause){<br />
           Window.alert(&#8221;Ocorreu uma falha no processo de login. Causa: \n&#8221;+cause.getMessage());<br />
     }<br />
   });<br />
[/java]</p>
<p>Abraços e até o próximo post <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </string></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/11/04/comunicacao-cliente-servidor-utilizando-o-rpc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Evento: Aniversário do CEJUG</title>
		<link>http://www.gwt.com.br/2008/09/09/evento-aniversario-do-cejug/</link>
		<comments>http://www.gwt.com.br/2008/09/09/evento-aniversario-do-cejug/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 23:02:25 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Notícias]]></category>
		<category><![CDATA[curtas]]></category>
		<category><![CDATA[cejug]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[sun]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/2008/09/09/evento-aniversario-do-cejug/</guid>
		<description><![CDATA[O Ceará Java User Group está completando 6 anos no dia 16 de setembro e para comemorar vai trazer a Fortaleza, com o apoio da Sun Microsystems e do SouJava, Kohsuke Kawaguchi e Maurí­cio Leal. Para completar essa grande festa, o CEJUG trará Bruno Pereira, da Concrete Solutions e Globo.com!
Aos que puderem participar será um [...]]]></description>
			<content:encoded><![CDATA[<p>O Ceará Java User Group está completando 6 anos no dia 16 de setembro e para comemorar vai trazer a Fortaleza, com o apoio da Sun Microsystems e do SouJava, Kohsuke Kawaguchi e Maurí­cio Leal. Para completar essa grande festa, o CEJUG trará Bruno Pereira, da Concrete Solutions e Globo.com!<br />
Aos que puderem participar será um evento bastante interessante. Compareçam! Estarei lá também participando. </p>
<p><a href="http://www.cejug.org/pages/viewpage.action?pageId=30900360"><br />
<img src="http://silveiraneto.net/wp-content/uploads/2008/09/aniversario_cejug_banner1.gif"/><br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/09/09/evento-aniversario-do-cejug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando o Gwt Window Manager</title>
		<link>http://www.gwt.com.br/2008/03/05/utilizando-o-gwt-window-manager/</link>
		<comments>http://www.gwt.com.br/2008/03/05/utilizando-o-gwt-window-manager/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 15:07:32 +0000</pubDate>
		<dc:creator>Marcelo Emanoel</dc:creator>
				<category><![CDATA[Básico]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[gwm]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/2008/03/05/utilizando-o-gwt-window-manager/</guid>
		<description><![CDATA[  Para quem nÃ£o conhece existe um projeto do qual participei na elaboraÃ§Ã£o e acho bastante Ãºtil pra todo mundo. Ã‰ o GWT Window Manager o projeto consiste basicamente em usar um gerenciador de janelas para a sua aplicaÃ§Ã£o aumentando ainda mais a sensaÃ§Ã£o de se estar usando um desktop em vez do browser. [...]]]></description>
			<content:encoded><![CDATA[<p>  Para quem nÃ£o conhece existe um projeto do qual participei na elaboraÃ§Ã£o e acho bastante Ãºtil pra todo mundo. Ã‰ o <a href="http://www.gwtwindowmanager.org">GWT Window Manager</a> o projeto consiste basicamente em usar um gerenciador de janelas para a sua aplicaÃ§Ã£o aumentando ainda mais a sensaÃ§Ã£o de se estar usando um desktop em vez do browser. Nesse post vou explicar o bÃ¡sico de como se usar o GWM como Ã© conhecido no seu projeto.</p>
<p>Primeiramente crie um projeto usando o Project Creator e o Application Creator como explicado em posts anteriores. Em seguida acrescente o gwm.jar ao seu classpath e copie o diretÃ³rio themes para a pasta public do seu projeto, Ã© nela que se encontram todos os arquivos css e de imagem do gwm. Feito isso, o prÃ³ximo passo Ã© efetuar a ligaÃ§Ã£o entre a pÃ¡gina e esses arquivos. Acrescente as seguintes linhas no head do html da pÃ¡gina:<br />
<span id="more-52"></span><br />
[html]</p>
<link href="themes/alphacube.css" rel="stylesheet" />
<link />
<link href="themes/alphacube-off.css" rel="stylesheet" />
<link />
<link href="themes/citrus.css" rel="stylesheet" />
<link />
<link href="themes/citrus-off.css" rel="stylesheet" />
<link />
<link href="themes/cloudy.css" rel="stylesheet" />
<link />
<link href="themes/cloudy-off.css" rel="stylesheet" />
<link />
<link href="themes/darkX.css" rel="stylesheet" />
<link />
<link href="themes/darkX-off.css" rel="stylesheet" />
<link />
<link href="themes/mac.css" rel="stylesheet" />
<link />
<link href="themes/mac-off.css" rel="stylesheet" />
<link />
<link href="themes/sky.css" rel="stylesheet" />
<link />
<link href="themes/sky-off.css" rel="stylesheet" />
<link />
<link href="themes/spread.css" rel="stylesheet" />
<link />
<link href="themes/spread-off.css" rel="stylesheet" />
<link />
<link href="themes/theme1.css" rel="stylesheet" />
<link />
<link href="themes/theme1-off.css" rel="stylesheet" />
<link />[/html]Agora falta pouco para poder usar o framework <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> O seu arquivo de mÃ³dulo do projeto deve ficar parecido com este:[xml]<br />
<module><br />
<inherits name="com.google.gwt.user.User"></inherits><br />
<inherits name="org.gwm.GwtWindowManager"></inherits><br />
<entry class="&lt;br.com.gwt.client.GWM"></entry><br />
</module><br />
[/xml]</p>
<p>Modificando o cÃ³digo que foi gerado pelo application creator ficamos com o entry point da seguinte forma:</p>
<p>[java]<br />
package br.com.gwt.client;</p>
<p>import org.gwm.client.GDesktopPane;<br />
import org.gwm.client.GInternalFrame;<br />
import org.gwm.client.impl.DefaultGDesktopPane;</p>
<p>import com.google.gwt.core.client.EntryPoint;<br />
import com.google.gwt.user.client.ui.RootPanel;<br />
import com.google.gwt.user.client.ui.Widget;</p>
<p>/**<br />
* Entry point classes define <code>onModuleLoad()</code>.<br />
*/<br />
public class GWM implements EntryPoint {</p>
<p>private GDesktopPane	desktop;<br />
private static GWM		instance;<br />
/**<br />
* This is the entry point method.<br />
*/<br />
public void onModuleLoad() {<br />
instance = this;<br />
desktop = new DefaultGDesktopPane();</p>
<p>RootPanel.get().add((Widget) desktop);<br />
}</p>
<p>/**<br />
* Singleton<br />
* @return<br />
*/<br />
public static GWM getInstance() {<br />
return instance;<br />
}</p>
<p>/**<br />
* Adicione os seus GInternalFrames ao desktop <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
* @param iframe<br />
*/<br />
public void addWindow(GInternalFrame iframe) {<br />
desktop.addFrame(iframe);<br />
iframe.setVisible(true);<br />
}<br />
}</p>
<p>[/java]</p>
<p>Agora vejamos alguns detalhes do cÃ³digo:</p>
<p>Primeiramente declaramos que iria ser usado um Desktop, o desktop nada mais Ã© do que um objeto capaz de receber janelas e gerenciÃ¡-las. AlÃ©m disso, implementamos um dos mais usados e simples padrÃµes de projeto um singleton. O Singleton garante que  somente uma instancia de um determinado objeto serÃ¡ criado. Como o mÃ©todo onModuleLoad Ã© o primeiro a ser chamado pelo gwt, e somente Ã© executado uma Ãºnica vez, Ã© bastante adequado inicializar o singleton nesse ponto. No caso de se adicionar construtores ao entryPoint eles devem ser construtores padrÃ£o sem argumentos, podendo atÃ© mesmo ser privados caso contrÃ¡rio o compilador irÃ¡ reclamar. ApÃ³s a execuÃ§Ã£o do onModuleLoad a qualquer momento serÃ¡ possÃ­vel se obter uma instancia do entryPoint atravÃ©s do mÃ©todo <em>getInstance()</em>.</p>
<p>Observem que a inicializaÃ§Ã£o do desktop se dÃ¡ atravÃ©s da classe DefaultGDesktop o que indica que a classe GDesktop na verdade Ã© uma interface, isso configura um dos vÃ¡rios pontos de extensÃ£o do framework.  Caso seja necessÃ¡rio implementar um desktop com comportamentos diferentes do original tudo que se tem que fazer apÃ³s a implementaÃ§Ã£o Ã© alterar esta linha.</p>
<p>Por ultimo, no mÃ©todo onModuleLoad Ã© adicionado esse objeto desktop ao RootPanel, que como jÃ¡ explicado anteriormente, Ã© a pÃ¡gina html. Repare aqui que a referÃªncia ao desktop nÃ£o Ã© de um widget, embora a implementaÃ§Ã£o o seja, daÃ­ a necessidade do cast.</p>
<p>Agora analisemos o mÃ©todo <strong><em>addWindow(GInternalFrame iframe)</em></strong> ele faz duas coisas:</p>
<p>1. Adiciona o GInternalFrame ao desktop, porÃ©m isso nÃ£o a torna visÃ­vel;<br />
2. Mostra a janela finalmente. Uma chamada ao mÃ©todo <em>setVisible</em> sem que a janela esteja previamente adicionada a um desktop provocaria uma ExceÃ§Ã£o em tempo de execuÃ§Ã£o por isso ela sÃ³ Ã© feita nesse ponto.</p>
<p>AtÃ© agora temos uma aplicaÃ§Ã£o com um desktop. Nada alÃ©m disso, entretanto visualmente jÃ¡ pode-se observado o seguinte:</p>
<p style="text-align: center"><a href="http://www.gwt.com.br/wp-content/uploads/2008/03/desktop.JPG" rel="lightbox[pics52]" title="Desktop sem janelas"><img src="http://www.gwt.com.br/wp-content/uploads/2008/03/desktop.thumbnail.JPG" alt="Desktop sem janelas" class="imageframe imgaligncenter" width="200" height="150" /></a></p>
<p>Entretanto isso nÃ£o Ã© nem de longe o suficiente para uma aplicaÃ§Ã£o <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Vamos criar pelo menos uma janela e brincar um pouco com ela <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Para se criar uma janela que possa ser usada em conjunto com o GDesktop devemos criar uma classe que extenda de DefaultGInternalFrame ou entÃ£o uma que a implemente, embora eu nÃ£o recomende a implementaÃ§Ã£o do inÃ­cio por que a DefaultGInternalFrame jÃ¡ possui bastante funcionalidades e sem contar que vocÃª pode extendÃª-la facilmente.</p>
<p>Assim, vejamos, vamos criar uma janela que possa utilizar o mÃ©todo singleton que criamos anteriormente e que tenha alguma utilidade tambÃ©m <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ai vai o cÃ³digo:</p>
<p>[java]<br />
package br.com.gwt.client;</p>
<p>import org.gwm.client.impl.DefaultGInternalFrame;</p>
<p>import com.google.gwt.user.client.ui.ChangeListener;<br />
import com.google.gwt.user.client.ui.ListBox;<br />
import com.google.gwt.user.client.ui.Widget;</p>
<p>/**<br />
* Cria uma janela com um combo box com os temas disponÃ­veis. Ao selecionar um<br />
* tema diferente altera o desktop completo.<br />
* @author Marcelo Emanoel<br />
*<br />
*/<br />
public class ThemeChanger extends DefaultGInternalFrame {</p>
<p>private ListBox	combo;</p>
<p>public ThemeChanger() {<br />
init();<br />
initLayout();<br />
attachListeners();<br />
}</p>
<p>/**<br />
*Inicializa os componentes da janela<br />
*/<br />
private void init() {<br />
combo = new ListBox();<br />
combo.addItem(&#8221;default&#8221;);<br />
combo.addItem(&#8221;alphacube&#8221;);<br />
combo.addItem(&#8221;citrus&#8221;);<br />
combo.addItem(&#8221;cloudy&#8221;);<br />
combo.addItem(&#8221;darkX&#8221;);<br />
combo.addItem(&#8221;mac&#8221;);<br />
combo.addItem(&#8221;sky&#8221;);<br />
combo.addItem(&#8221;spread&#8221;);<br />
combo.addItem(&#8221;theme1&#8243;);<br />
}<br />
/**<br />
*Inicializa o layout da Janela<br />
*/<br />
private void initLayout() {<br />
setCaption(&#8221;Seletor de temas&#8221;);<br />
setContent(combo);<br />
}<br />
/**<br />
*Adiciona algum possÃ­vel listener da janela<br />
*/<br />
private void attachListeners() {<br />
combo.addChangeListener(new ChangeListener() {<br />
public void onChange(Widget sender) {<br />
int selecao = combo.getSelectedIndex();<br />
String tema = combo.getValue(selecao);<br />
GWM.getInstance().changeTheme(tema);<br />
}<br />
});<br />
}<br />
}<br />
[/java]</p>
<p>Repare que a janela Ã© a mais simples possÃ­vel, contÃ©m apenas um combobox com o nome dos estilos css que foram adicionados no inÃ­cio. No mÃ©todo attachListeners acrescentei um ChangeListener ao combobox de maneira que sempre que ouvesse a mudanÃ§a de valor fosse possÃ­vel interceptar essa mudanÃ§a e reagir de alguma maneira, no caso chamei o mÃ©todo <em>getInstance()</em> que retorna a instancia do singleton de GWM e em seguida o mÃ©todo changeTheme passando o valor do combobox. abaixo segue o cÃ³digo que realiza a mudanÃ§a de tema:</p>
<p>[java]<br />
public void changeTheme(String newTheme){<br />
desktop.setTheme(newTheme);<br />
}<br />
[/java]</p>
<p>Simples e direto. No mÃ©todo <em>initLayout()</em> foi alterada a propriedade Caption que nada mais Ã© senÃ£o o TÃ­tulo da janela e em seguida o conteudo da janela foi setado para ser o combo box. O mÃ©todo utilizado para isso, <em>setContent()</em> foi sobrecarregado de 3 maneiras:</p>
<p>1. Receber um widget, a que provavelmente serÃ¡ a mais usada nas suas aplicaÃ§Ãµes.<br />
2. Receber uma String, supondo que seja de interesse do usuÃ¡rio adicionar somente texto Ã  janela.<br />
3. Receber uma url, tambÃ©m bastante usada para carregar uma pÃ¡gina html dentro da janela em si.</p>
<p>Existem tambÃ©m outros mÃ©todos que facilitam bastante a vida, como por exemplo, o bloqueio ou nÃ£o de propriedades como Maximizable, Minimizable, Draggable, Closable. Permitindo ou bloqueando respectivamente, maximizar, minimizar, arrastar e fechar a janela. AlÃ©m disso, Ã© possÃ­vel acrescentar ouvintes Ã  janela de maneira a interceptar os eventos anteriores alÃ©m de outros permitindo uma reaÃ§Ã£o a cada um deles.</p>
<p>Vamos revisitar agora a classe GWM jÃ¡ que vamos adicionar uma janela ao desktop. O cÃ³digo segue abaixo:</p>
<p>[java]<br />
package br.com.gwt.client;</p>
<p>import org.gwm.client.GDesktopPane;<br />
import org.gwm.client.GInternalFrame;<br />
import org.gwm.client.impl.DefaultGDesktopPane;</p>
<p>import com.google.gwt.core.client.EntryPoint;<br />
import com.google.gwt.user.client.ui.RootPanel;<br />
import com.google.gwt.user.client.ui.Widget;</p>
<p>/**<br />
* Entry point classes define <code>onModuleLoad()</code>.<br />
*/<br />
public class GWM implements EntryPoint {</p>
<p>private GDesktopPane	desktop;<br />
private ThemeChanger	themeChanger;<br />
private static GWM		instance;</p>
<p>/**<br />
* This is the entry point method.<br />
*/<br />
public void onModuleLoad() {</p>
<p>instance = this;<br />
desktop = new DefaultGDesktopPane();</p>
<p>themeChanger = new ThemeChanger();</p>
<p>changeTheme(&#8221;default&#8221;);<br />
addWindow(themeChanger);</p>
<p>RootPanel.get().add((Widget) desktop);<br />
}</p>
<p>/**<br />
* Singleton<br />
* @return<br />
*/<br />
public static GWM getInstance() {<br />
return instance;<br />
}</p>
<p>/**<br />
* Adicione os seus GInternalFrames ao desktop <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
* @param iframe<br />
*/<br />
public void addWindow(GInternalFrame iframe) {<br />
desktop.addFrame(iframe);<br />
iframe.setVisible(true);<br />
}</p>
<p>public void changeTheme(String newTheme){<br />
desktop.setTheme(newTheme);<br />
}<br />
}</p>
<p>[/java]</p>
<p>Veja que criamos uma instancia da janela ThemeChanger e a adicionamos ao desktop. Feito isso Ã© sÃ³ atualizar a pÃ¡gina do projeto e finalmente ver a janela em aÃ§Ã£o.</p>
<p style="text-align: center"><a href="http://www.gwt.com.br/wp-content/uploads/2008/03/desktopcomjanela.JPG" rel="lightbox[pics52]" title="desktopcomjanela.JPG"><img src="http://www.gwt.com.br/wp-content/uploads/2008/03/desktopcomjanela.thumbnail.JPG" alt="desktopcomjanela.JPG" class="imageframe imgaligncenter" width="200" height="149" /></a></p>
<p>A janela por default pode ser maximizada, minimizada, fechada e ser arrastada. Aproveitem e brinquem um pouco. <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Segue o cÃ³digo implementado no post. Aguardo comentÃ¡rios! <img src='http://www.gwt.com.br/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><a href="http://www.gwt.com.br/wp-content/uploads/2008/03/gwm.zip" title="Projeto GWM">Projeto GWM</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/03/05/utilizando-o-gwt-window-manager/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>JSNI &#8211; Java Script Native Interface</title>
		<link>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/</link>
		<comments>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 21:09:42 +0000</pubDate>
		<dc:creator>bruno.catao</dc:creator>
				<category><![CDATA[Avançado]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jni]]></category>
		<category><![CDATA[jnsi]]></category>
		<category><![CDATA[native]]></category>

		<guid isPermaLink="false">http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/</guid>
		<description><![CDATA[Eu acredito que boa parte de vocÃªs jÃ¡ viu os demos do GWT na sua pÃ¡gina oficial, ficou encantado, baixou o GWT, rodou os samples, criou um projeto simples, fez passo-a-passo algum tutorial &#8220;Hello World&#8221; e ficou mais encantado ainda.
PorÃ©m &#8220;o mundo Ã© cruel&#8221;, e quando nÃ³s caÃ­mos no mundo real e tentamos desenvolver uma [...]]]></description>
			<content:encoded><![CDATA[<p>Eu acredito que boa parte de vocÃªs jÃ¡ viu os demos do GWT na sua pÃ¡gina oficial, ficou encantado, baixou o GWT, rodou os samples, criou um projeto simples, fez passo-a-passo algum tutorial &#8220;Hello World&#8221; e ficou mais encantado ainda.</p>
<p>PorÃ©m &#8220;o mundo Ã© cruel&#8221;, e quando nÃ³s caÃ­mos no mundo real e tentamos desenvolver uma aplicaÃ§Ã£o mais robusta do que um Hello World nos deparamos com alguns problemas um pouco mais complicados.</p>
<p>Vou tentar escrever alguns posts falando de algumas experiÃªncias que eu tive com GWT, os problemas que surgiram e como eu resolvi estes problemas.</p>
<p>O primeiro problema que eu tive foi quando tentei utilizar uma biblioteca javascript prÃ©-existente, ou quando eu tentei utilizar alguma funcionalidade que hÃ¡ nos objetos providos pelos browser via javascript (window, document, etc) mas estÃ¡ implementada nos mesmos objetos no nÃ­vel GWT.</p>
<p>A forma que encontrei para resolver este (e mais um monte de problemas) foi utilizar JSNI &#8211; Java Script Native Interface. JSNI estÃ¡ para GWT assim como JNI (Java Native Interface) estÃ¡ para Java. Com JSNI Ã© possÃ­vel implementar o corpo de mÃ©todos GWT utilizando Java Script.</p>
<p>Vejamos um exemplo. Vamos supor que, por alguma razÃ£o esquisita, eu queira escrever um mÃ©todo que faÃ§a o mesmo que o <strong>Window.alert</strong>. Vamos chamar este mÃ©todo de meuAlert:</p>
<p>[java]<br />
public native void meuAlert(String mensagem) /*-{<br />
alert(mensagem);<br />
}-*/;<br />
[/java]<br />
<span id="more-43"></span><br />
Apesar de este nÃ£o ser um exemplo muito funcional (na realidade ele nÃ£o Ã© funcional de jeito nenhum) dÃ¡ pra entender a &#8220;mecÃ¢nica da coisa&#8221;. Todo mÃ©todo JSNI deve ser declarado como native (assim como mÃ©todos cuja implementaÃ§Ã£o serÃ¡ feita em JNI, utilizando Java convencional). A implementaÃ§Ã£o do mÃ©todo deve vir em um bloco comentado localizado entre o fim da lista de parÃ¢metros do mÃ©todo e o seu ponto-e-vÃ­rgula. O bloco de cÃ³digo JSNI Ã© delimitado por &#8220;-{&#8221; e &#8220;}-&#8221;, desta forma o tradutor Java/Java Script do GWT irÃ¡ saber que este bloco de comentÃ¡rios trata-se na realidade de instruÃ§Ãµes Java Script.</p>
<p>Vimos como fazer chamadas do lado Java para Java Script, vamos ver agora como fazer o caminho contrÃ¡rio, chamar mÃ©todos Java de dentro de cÃ³digo JSNI.</p>
<p>Para isto, basta chamar o mÃ©todo de qualquer classe seguindo a convenÃ§Ã£o:</p>
<p><code>[instÃ¢ncia.]@nomeDaClasseCompleto::nomeDoMetodo(assinaturaDosParametros)(argumentos)</code></p>
<p>Onde:</p>
<ul>
<li>instÃ¢ncia (atributo opcional) &#8211; Referente a instÃ¢ncia da qual o mÃ©todo serÃ¡ chamado, caso nÃ£o seja informada uma instÃ¢ncia, serÃ¡ assumido que a chamada serÃ¡ feita de forma estÃ¡tica;</li>
<li>nomeDaClasseCompleto &#8211; &#8220;full qualified class name&#8221;, ou seja, o nome da classe completo (toda a Ã¡rvore de pacotes seguido do nome da classe);</li>
<li>nomeDoMetodo &#8211; Nome do mÃ©todo que serÃ¡ chamado;</li>
<li>assinaturaDosParametros &#8211; Assinatura dos parÃ¢metros no formato <a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/types.html#wp16432" target="_blank" title="Assinatura dos ParÃ¢metros JNI">JNI</a>;</li>
<li>argumentos &#8211; Lista de valores passados como parÃ¢metros para o mÃ©todo.</li>
</ul>
<p>Vamos fazer outro exemplo simples:</p>
<p>[java]<br />
package br.com.gwt.client;</p>
<p>public class TesteJSNI  {<br />
public void exibeMensagem(String nome, int idade)  {<br />
Window.alert(&#8221;nome: &#8221; + nome + &#8221; &#8211; idade: &#8221; + idade);<br />
}</p>
<p>public native void callJavaMethod(TesteJSNI teste, String nome, int idade) /*- {<br />
teste@br.com.gwt.client.TesteJSNI::exibeMensagem(Ljava/lang/String;I)(nome, idade);<br />
}-*/;<br />
}<br />
[/java]</p>
<p>Por fim, JSNI define dois objetos implÃ­citos $wnd e $doc, que nos permitem, respectivamente acessar os contextos da janela e do documento principais. Estes objetos sÃ£o importantes pois, como o cÃ³digo GWT Ã© executado em um iframe oculto, se vocÃª tentar utilizar window e document diretamente, vocÃª nÃ£o irÃ¡ acessar a janela e o documento principais, mas sim do iframe oculto do GWT. Outro motivo, Ã© que estes objetos devem ser utilizados quando se quiser criar funÃ§Ãµes nomeadas que o programador queira chamar posteriormente em um outro ponto do cÃ³digo. A razÃ£o para isto Ã© que o cÃ³digo gerado pelo GWT Ã© ofuscado, entÃ£o, qualquer nome de funÃ§Ã£o atribuÃ­do diretamente via JSNI serÃ¡ ofuscado, tornando impossÃ­vel de &#8220;adivinhar&#8221; qual serÃ¡ esse nome em tempo de compilaÃ§Ã£o.</p>
<p>Vamos a alguns exemplos:</p>
<p><strong>DefiniÃ§Ã£o de uma funÃ§Ã£o:</strong></p>
<p>[java]<br />
public native void criaFuncao() /*{-<br />
$wnd[meuAlert] = function() {<br />
$wnd.alert(&#8217;Teste&#8217;);<br />
}-}*/;</p>
<p>public native void chamaFuncao() /*-{<br />
$wnd[meuAlert]();<br />
}-*/;<br />
[/java]</p>
<p><strong>Adicionando um listener ao documento:</strong></p>
<p>[java]<br />
public void trackMousePosition() /*-{<br />
$doc.addMouseMoveListener(function(evt) {<br />
$wnd.title = &#8216;x: &#8216; + evt.x + &#8216; &#8211; y: &#8216; + evt.y;<br />
});<br />
}-*/;<br />
[/java]</p>
<p>Por enquanto Ã© sÃ³. No prÃ³ximo post eu vou mostrar como se faz uma invocaÃ§Ã£o JSONP utilizando os conceitos mostrados aqui.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gwt.com.br/2008/02/25/jsni-java-script-native-interface/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
