<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Java Simples</title>
	<atom:link href="http://javasimples.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://javasimples.wordpress.com</link>
	<description>Porque Java não precisa ser dificil...</description>
	<lastBuildDate>Wed, 03 Aug 2011 22:35:59 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='javasimples.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Java Simples</title>
		<link>http://javasimples.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://javasimples.wordpress.com/osd.xml" title="Java Simples" />
	<atom:link rel='hub' href='http://javasimples.wordpress.com/?pushpress=hub'/>
		<item>
		<title>MUDANÇA!</title>
		<link>http://javasimples.wordpress.com/2010/05/18/mudanca/</link>
		<comments>http://javasimples.wordpress.com/2010/05/18/mudanca/#comments</comments>
		<pubDate>Tue, 18 May 2010 04:05:27 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/?p=42</guid>
		<description><![CDATA[O novo site é http://www.javasimples.com.br Este será desativado em breve, por favor visitem o novo site. O site contém todo o conteúdo deste site e algo mais. Obrigado pela compreensão, Saab.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=42&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>O novo site é <a href="http://www.javasimples.com.br">http://www.javasimples.com.br</a></p>
<p>Este será desativado em breve, por favor visitem o novo site.</p>
<p>O site contém todo o conteúdo deste site e algo mais.</p>
<p>Obrigado pela compreensão,<br />
Saab.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=42&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2010/05/18/mudanca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>
	</item>
		<item>
		<title>Trabalhando com Datas&#8230; chega de trauma!</title>
		<link>http://javasimples.wordpress.com/2010/02/18/trabalhando-com-datas-chega-de-trauma/</link>
		<comments>http://javasimples.wordpress.com/2010/02/18/trabalhando-com-datas-chega-de-trauma/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 01:44:50 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[converter]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[formatacao]]></category>
		<category><![CDATA[mascara]]></category>
		<category><![CDATA[representacao]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/2010/02/18/trabalhando-com-datas-chega-de-trauma/</guid>
		<description><![CDATA[Quem nunca teve que manipular datas em algum programa não é um programador poxa… O pior caso na minha opinião são aqueles bancos de dados desgraçados que não aceitam a data no formato padrão. Cá entre nós, é uma encheção de saco ficar invertendo a data. Vamos então a algumas dicas para não haver mais [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=37&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quem nunca teve que manipular datas em algum programa não é um programador poxa… O pior caso na minha opinião são aqueles bancos de dados <strike>desgraçados</strike> que não aceitam a data no formato padrão. Cá entre nós, é uma encheção de saco ficar invertendo a data. Vamos então a algumas dicas para não haver mais traumas quando o assunto em questão são as datas:</p>
<h5>&#160;</h5>
<h4>Componentes Swing para trabalhar com datas </h4>
<h5>
<hr /></h5>
<p><a href="http://javasimples.wordpress.com/2010/01/19/adicionando-jcalendar-e-jdatechooser-paleta-do-netbeans/" target="_blank">Nesse</a> outro post eu mostrei como adicionar ao Netbeans alguns ótimos componentes para quem precisa tratar datas de uma maneira elegante em uma interface bem bonita.     <br />Vale a pena dar uma conferida!</p>
<h5>&#160;</h5>
<h4>Strings de formatação de datas </h4>
<h5>
<hr /></h5>
<p>Algo que todo mundo deve saber é que em alguns componentes (como os demonstrados no post citado acima) e alguns objetos (que veremos mais adiante) conseguem formatar a data de acordo com uma string, ou seja, mostrar a data em diversos formatos, tais quais definidos por uma string. </p>
<p>Antes de mostrar alguns exemplos vou deixar especificado quais os caracteres que podem compor a string de formatação e o que eles representam.    <br />Segundo a <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html" target="_blank">documentação oficial</a>:</p>
<table border="0" cellspacing="3" summary="Chart shows pattern letters, date/time component, presentation, and examples." cellpadding="0" width="433">
<tbody>
<tr bgcolor="#ccccff">
<th align="left">Letter </th>
<th width="158" align="left">Date or Time Component </th>
<th width="121" align="left">Presentation </th>
<th width="94" align="left">Examples </th>
</tr>
<tr>
<td><code>G</code> </td>
<td width="158">Era designator </td>
<td width="121">Text</td>
<td width="94"><code>AD</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>y</code> </td>
<td width="158">Year </td>
<td width="121">Year </td>
<td width="94"><code>1996</code>; <code>96</code> </td>
</tr>
<tr>
<td><code>M</code> </td>
<td width="158">Month in year </td>
<td width="121">Month </td>
<td width="94"><code>July</code>; <code>Jul</code>; <code>07</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>w</code> </td>
<td width="158">Week in year </td>
<td width="121">Number </td>
<td width="94"><code>27</code> </td>
</tr>
<tr>
<td><code>W</code> </td>
<td width="158">Week in month </td>
<td width="121">Number </td>
<td width="94"><code>2</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>D</code> </td>
<td width="158">Day in year </td>
<td width="121">Number </td>
<td width="94"><code>189</code> </td>
</tr>
<tr>
<td><code>d</code> </td>
<td width="158">Day in month </td>
<td width="121">Number </td>
<td width="94"><code>10</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>F</code> </td>
<td width="158">Day of week in month </td>
<td width="121">Number </td>
<td width="94"><code>2</code> </td>
</tr>
<tr>
<td><code>E</code> </td>
<td width="158">Day in week </td>
<td width="121">Text </td>
<td width="94"><code>Tuesday</code>; <code>Tue</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>a</code> </td>
<td width="158">Am/pm marker </td>
<td width="121">Text </td>
<td width="94"><code>PM</code> </td>
</tr>
<tr>
<td><code>H</code> </td>
<td width="158">Hour in day (0-23) </td>
<td width="121">Number </td>
<td width="94"><code>0</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>k</code> </td>
<td width="158">Hour in day (1-24) </td>
<td width="121">Number </td>
<td width="94"><code>24</code> </td>
</tr>
<tr>
<td><code>K</code> </td>
<td width="158">Hour in am/pm (0-11) </td>
<td width="121">Number </td>
<td width="94"><code>0</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>h</code> </td>
<td width="158">Hour in am/pm (1-12) </td>
<td width="121">Number </td>
<td width="94"><code>12</code> </td>
</tr>
<tr>
<td><code>m</code> </td>
<td width="158">Minute in hour </td>
<td width="121">Number </td>
<td width="94"><code>30</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>s</code> </td>
<td width="158">Second in minute </td>
<td width="121">Number </td>
<td width="94"><code>55</code> </td>
</tr>
<tr>
<td><code>S</code> </td>
<td width="158">Millisecond </td>
<td width="121">Number </td>
<td width="94"><code>978</code> </td>
</tr>
<tr bgcolor="#eeeeff">
<td><code>z</code> </td>
<td width="158">Time zone </td>
<td width="121">General time zone </td>
<td width="94"><code>Pacific Standard Time</code>; <code>PST</code>; <code>GMT-08:00</code> </td>
</tr>
<tr>
<td><code>Z</code> </td>
<td width="158">Time zone </td>
<td width="121">RFC 822 time zone </td>
<td width="94"><code>-0800</code> </td>
</tr>
</tbody>
</table>
<p>Fique a vontade para brincar de combinar esses caracteres para formar a data.    <br />Exemplo:</p>
<table border="0" cellspacing="3" cellpadding="0" width="428">
<tbody>
<tr bgcolor="#ccccff">
<th width="136" align="left">String</th>
<th width="132" align="left">Data formatada</th>
<th width="146" align="left">Comentário</th>
</tr>
<tr>
<td width="136"><code>dd/MM/yyyy</code></td>
<td width="132">25/12/2010</td>
<td width="146">Padrão brasileiro</td>
</tr>
<tr bgcolor="#eeeeff">
<td width="136"><code>MM/dd/yyyy</code></td>
<td width="132">12/25/2010</td>
<td width="146">Padrão americano</td>
</tr>
<tr>
<td width="136"><code>yyyy-MM-dd</code></td>
<td width="132">2010-12-25</td>
<td width="146">Padrão de alguns bancos de dados</td>
</tr>
<tr bgcolor="#eeeeff">
<td width="136"><code>dd MMMMMMMM yyyy</code></td>
<td width="132">25 Dezembro 2010</td>
<td width="146">Quando tem mais de 2 caracteres ‘M’, o resultado é o nome do mês por extenso</td>
</tr>
<tr>
<td width="136">HH:mm:ss:SSSS</td>
<td width="132">15:22:54:1264</td>
<td width="146">Hora…</td>
</tr>
</tbody>
</table>
<h5>&#160;</h5>
<h4>O objeto SimpleDateFormat: convertendo datas facilmente </h4>
<h5>
<hr /></h5>
<p>A classe SimpleDateFormat do pacote java.lang.text é uma mão na roda tão grande!! Com um objeto dessa classe a gente pode facilmente converter um objeto java.util.Date para uma String no formato que a gente quiser (através da string de formatação).    <br />Exemplo:</p>
<blockquote></blockquote>
<blockquote><p>SimpleDateFormat sd = new SimpleDateFormat(“yyyy-MM-dd”);      <br />Date data = new Date(); //data atual       </p>
<p>System.out.println(sd.format(data));</p>
</blockquote>
<p>Do mesmo jeito que dá pra converter um objeto Date pra uma String, o inverso também é válido: o SimpleDateFormat também converte uma String para um Date:</p>
<blockquote><p>SimpleDateFormat sd = new SimpleDateFormat(“dd/MM/yyyy”);      <br />String meuNiver = “13/04/1989”;</p>
<p>Date data = sd.parse(meuNiver);</p>
</blockquote>
<p>Muito muito muito simples, útil e prático!</p>
<p>&#160;</p>
<h4>Comparando datas </h4>
<h5>
<hr /></h5>
<p>Não sei se todo mundo sabe… mas uma data representada pelo objeto Date nada mais é do que um long, um número bem grande que guarda o número de milisegundos que já se passaram desde 1º de Janeiro de 1970, 00:00:00 GMT até o momento atual.</p>
<p>O objeto Date possui alguns métodos para comparar datas, são eles:</p>
<blockquote><p>Date natal = new Date(110,11,25);&#160;&#160;&#160;&#160;&#160;&#160;&#160; //25/12/2010      <br />Date meuNiver = new Date(110,3,13);&#160; //13/04/1989</p>
<p>if (natal.after(meuNiver) || meuNiver.before(natal)){      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;Vou ficar mais velho antes do natal&#8230;&quot;);       <br />}else if (natal.equals(meuNiver)){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;Vou ganhar 2 presentes no mesmo dia! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> &quot;);       <br />}</p>
</blockquote>
<p>O código é totalmente auto-explicativo, exceto pelo construtor meio estranho do objeto Date. Seus parâmetros são: o ano – 1900 , o mês – 1, e o dia. </p>
<p>Os métodos “after(Date)”, “before(Date)” e “equals(Object)” nada mais fazem do que comparar aqueles números que eu comentei ali em cima. Quem não acreditar em mim é só ir no código fonte do método (no Netbeans: Ctrl + clique no método) e verificar que é exatamente isso que acontece:</p>
<blockquote><p>public boolean after(Date when) {      <br />&#160;&#160;&#160; return getMillisOf(this) &gt; getMillisOf(when);       <br />}</p>
</blockquote>
<p>Um probleminha que me ocorreu esses dias (e deu um trabalhinho) foi: como comparar datas sem envolver as horas, minutos, segundos e milisegundos? </p>
<p>Algumas vezes o horário pode atrapalhar a comparação das datas, uma vez que ela se baseia no número por trás da data. Só para ilustrar o problema segue um exemplinho:</p>
<blockquote><p>Date inicioNatal = new Date(1293242400000L); //25/12/2010 00:00:00      <br />Date fimNatal = new Date(1293328799999L);&#160;&#160; //25/12/2010 23:59:59       </p>
<p>if (inicioNatal.equals(fimNatal)){       <br />&#160;&#160;&#160; System.out.println(&quot;É natal!!&quot;);       <br />}</p>
</blockquote>
<p>No construtor dos Date foram passados os números que representam o primeiro e último segundo do natal. O “L” no final é apenas para indicar que aquele número é do tipo long.</p>
<p>Voltando ao problema, no código acima nunca será exibida a mensagem “É Natal!!” pois os números que representam as datas não são iguais.</p>
<p>A alternativa para solucionar esse problema que eu achei (confesso que parece uma gambiarra) foi a seguinte:</p>
<blockquote><p>SimpleDateFormat sd = new SimpleDateFormat(&quot;dd/MM/yyyy&quot;);      <br />Date inicioNatal = new Date(1293242400000L); //25/12/2010 00:00:00       <br />Date fimNatal = new Date(1293328799999L);&#160;&#160; //25/12/2010 23:59:59</p>
<p><strong>inicioNatal = sd.parse(sd.format(inicioNatal));        <br />fimNatal = sd.parse(sd.format(fimNatal));</strong>       </p>
<p>if (inicioNatal.equals(fimNatal)){       <br />&#160;&#160;&#160; System.out.println(&quot;É natal!!&quot;);       <br />}</p>
</blockquote>
<p>As linhas em negrito são responsáveis por “zerar” as horas, minutos, segundos e milisegundos da data.    <br />Como? Muito simples: como o objeto SimpleDateFormat foi criado com uma string de formatação que não contém horas, minutos ou outros, ele simplesmente ignora essas partes da data na hora de converter uma string para Date. Nós primeiro passamos de Date para string (somente dia/mes/ano) e passamos a string para Date em seguida (sem horas, minutos e etc).</p>
<p>&#160;</p>
<p>Existem muito mais coisas quando se trata de manipulação de datas, mas como esse post não tem a finalidade de deixar ensinar TUDO de avançado sobre datas, ficamos por aqui.</p>
<p>[] e até a próxima,    <br />Saab.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=37&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2010/02/18/trabalhando-com-datas-chega-de-trauma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>
	</item>
		<item>
		<title>Reflex&#227;o Computacional &#8211; Exemplo pr&#225;tico</title>
		<link>http://javasimples.wordpress.com/2010/02/08/reflexo-computacional-exemplo-prtico/</link>
		<comments>http://javasimples.wordpress.com/2010/02/08/reflexo-computacional-exemplo-prtico/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 00:09:54 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[computacional]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[pratico]]></category>
		<category><![CDATA[reflexao]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/2010/02/08/reflexo-computacional-exemplo-prtico/</guid>
		<description><![CDATA[E ae galera, Primeiro de tudo, obrigado pelas visitas… estava vendo as estatísticas do site e todo dia tem alguém dando uma olhada no blog. Obrigado mesmo. No último post eu mostrei uma técnica bem interessante da programação dinâmica: a reflexão, através da qual agente consegue perguntar pra um objeto qualquer quais são suas variáveis [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=34&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>E ae galera,<br />
Primeiro de tudo, obrigado pelas visitas… estava vendo as estatísticas do site e todo dia tem alguém dando uma olhada no blog. Obrigado mesmo. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><a href="http://javasimples.wordpress.com/2010/01/23/java-e-seus-espelhos-reflexo-computacional/">No último post</a> eu mostrei uma técnica bem interessante da programação dinâmica: a reflexão, através da qual agente consegue perguntar pra um objeto qualquer quais são suas variáveis de instância (inclusive os seus valores) e seus métodos.</p>
<p>Beleza, daí um monte de gente me perguntou: “Pra que diabos eu preciso saber disso?” ou então “Quando eu vou usar?” entre outras… Para exemplificar o uso da reflexão vamos criar uma pequena aplicação. Nada muito complicado… uma agenda de contatos. OK, só mais um detalhe: não vou explicar nada sobre a conexão com o banco de dados, ou tratamento de erros ou outras coisas que vou utilizar no tutorial, o foco vai ser a reflexão. Qualquer dúvida é só deixar um comentário que a gente resolve.</p>
<p>Então vamos ao que interessa! Primeiro vamos criar uma tabela no banco de dados para representar um contato:</p>
<blockquote><p>CREATE TABLE `contatos` (</p>
<p>`con_id` INT NOT NULL ,<br />
`con_nome` VARCHAR( 60 ) NOT NULL ,<br />
`con_endereco` VARCHAR( 100 ) NOT NULL ,<br />
`con_email` VARCHAR( 50 ) NOT NULL ,<br />
`con_telefone` VARCHAR( 20 ) NOT NULL ,<br />
PRIMARY KEY ( `con_id` )</p>
<p>) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_unicode_ci;</p></blockquote>
<p>Pronto, com o banco pronto vamos para a aplicação. Crie uma nova aplicação no NetBeans (aplicação para área de trabalho, porque ela já importa o .jar do swing), apague tudo que ele crie a seguinte estrutura:</p>
<p><a href="http://javasimples.files.wordpress.com/2010/02/image.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" src="http://javasimples.files.wordpress.com/2010/02/image_thumb.png?w=230&#038;h=203" border="0" alt="image" width="230" height="203" /></a></p>
<p>Vamos aplicar um pequeno padrão aqui, algo que lembra o MVC, que é utilizar uma estrutura de 3 camadas:</p>
<ol>
<li>Apresentação: mostra os dados para o usuário;</li>
<li>Negócios: cuida das regras de negócio da aplicação (nada muito complexo nessa nossa agenda);</li>
<li>Persistência: cuida do armazenamento físico dos dados.</li>
</ol>
<p>Não vou explicar muito a engenharia da coisa portanto vamos em frente. Vamos começar de baixo pra cima, ou seja, vamos ver primeiro a classe da camada de persistência:</p>
<blockquote><p>public class ConexaoMySQL {</p>
<p>private Connection connect;<br />
private String erro = &#8220;&#8221;;</p>
<p>public static ConexaoMySQL getConexao() throws Exception {<br />
ConexaoMySQL c = new ConexaoMySQL();<br />
Connection connect = null;<br />
try {<br />
Class.forName(&#8220;com.mysql.jdbc.Driver&#8221;);<br />
String url = &#8220;jdbc:mysql://localhost/agenda&#8221;;<br />
connect = DriverManager.getConnection(url, &#8220;root&#8221;, &#8220;123&#8243;);<br />
c.setConnection(connect);<br />
} catch (ClassNotFoundException cnfex) {<br />
throw new Exception(&#8220;Falha ao ler o driver JDBC&#8221; + cnfex.toString());<br />
} catch (SQLException sqlex) {<br />
throw new Exception(&#8220;Impossível conectar com a base de dados&#8221; + sqlex.toString());<br />
} catch (Exception ex) {<br />
throw new Exception(&#8220;Outro erro&#8221; + ex.toString());<br />
}<br />
return c;<br />
}</p>
<p>public void close() {<br />
try {<br />
this.connect.close();<br />
} catch (Exception ex) {<br />
System.out.println(ex.toString());<br />
}<br />
}</p>
<p>private void setErro(String erro) {<br />
this.erro = erro;<br />
}</p>
<p>private void setConnection(Connection connection) {<br />
this.connect = connection;<br />
}</p>
<p>public Connection getConnection() {<br />
return this.connect;<br />
}</p>
<p>public String getMensagemErro() {<br />
return erro;<br />
}</p>
<p>public boolean getEstadoConexao() {<br />
if (connect == null) {<br />
return false;<br />
} else {<br />
return true;<br />
}<br />
}</p>
<p>public boolean manipular(String sql) // inserir, alterar,excluir<br />
{<br />
try {<br />
Statement statement = connect.createStatement();<br />
int result = statement.executeUpdate(sql);<br />
statement.close();<br />
if (result &gt;= 1) {<br />
return true;<br />
}<br />
} catch (SQLException sqlex) {<br />
erro = &#8220;Erro: &#8221; + sqlex.toString();<br />
return false;<br />
}<br />
return false;<br />
}</p>
<p>public int getMaxPK(String tabela, String chave) {<br />
String sql = &#8220;select max(&#8221; + chave + &#8220;) as max from &#8221; + tabela;<br />
int max = 0;<br />
ResultSet rs = null;<br />
try {<br />
Statement statement = connect.createStatement(<br />
ResultSet.TYPE_SCROLL_INSENSITIVE,<br />
ResultSet.CONCUR_READ_ONLY);<br />
System.out.println(sql);<br />
rs = statement.executeQuery(sql);</p>
<p>if (rs.next()) {<br />
max = rs.getInt(&#8220;max&#8221;);<br />
}<br />
statement.close();<br />
} catch (SQLException sqlex) {<br />
erro = &#8220;Erro: &#8221; + sqlex.toString();<br />
return -1;<br />
}</p>
<p>return max;<br />
}</p>
<p>//aqui que a mágica da reflexão acontece<br />
public void Insere(String tabela, Object objeto) throws Exception {<br />
SimpleDateFormat sd = new SimpleDateFormat(&#8220;yyyy-MM-dd&#8221;);<br />
String sql = &#8220;INSERT INTO &#8221; + tabela.toUpperCase() + &#8220;(&#8220;;</p>
<p>//percorre os atributos vendo o nome dos campos<br />
Class&lt;?&gt; classe = objeto.getClass();<br />
for (Field f : classe.getDeclaredFields()) {<br />
f.setAccessible(true);<br />
sql += f.getName() + &#8220;,&#8221;;<br />
}</p>
<p>sql = sql.substring(0, sql.length() &#8211; 1); //retira a ultima virgula..<br />
sql += &#8220;) VALUES(&#8220;;</p>
<p>//percorre os atributos vendo o valor dos campos<br />
for (Field f : classe.getDeclaredFields()) {<br />
f.setAccessible(true);<br />
if (f.getType().getSimpleName().equals(&#8220;String&#8221;)) {<br />
sql += &#8220;&#8216;&#8221; + f.get(objeto) + &#8220;&#8216;,&#8221;;<br />
} else {<br />
sql += f.get(objeto) + &#8220;,&#8221;;<br />
}<br />
}</p>
<p>sql = sql.substring(0, sql.length() &#8211; 1); //retira a ultima virgula..<br />
sql += &#8220;)&#8221;;</p>
<p>//executa a query<br />
System.out.println(sql);<br />
if (!manipular(sql)) {<br />
throw new Exception(getMensagemErro());<br />
}<br />
}<br />
}</p></blockquote>
<p>O único método que merece explicações é o método <strong>Insere(String tabela, Object objeto)</strong> que utiliza da reflexão computacional para criar dinâmicamente o SQL referente à inserção do objeto “<strong>objeto</strong>” na tabela “<strong>tabela</strong>”.</p>
<p>O código é bem simples de entender:</p>
<ol>
<li>Inicializa a variável responsável por guardar o SQL;</li>
<li>Passa por todos os atributos do objeto adiciondo os nomes deles ao SQL;</li>
<li>Passa pelos atributos novamente, só que desta vez adicionando os valores dos atributos (caso seja uma variável da classe String, adiciona aspas simples antes e depois do valor).</li>
<li>Executa a query. Se algo deu errado, joga uma nova exceção com a mensagem de erro.</li>
</ol>
<p>Muito simples não?!?!?<br />
Vamos ver como funciona na prática então, vamos subir uma camada e ver como funciona a classe Contatos.java:</p>
<blockquote><p>public class Contatos {</p>
<p>private int con_id;<br />
private String con_nome;<br />
private String con_endereco;<br />
private String con_telefone;<br />
private String con_email;</p>
<p>public Contatos(String con_nome, String con_endereco, String con_telefone, String con_email) throws Exception {<br />
ConexaoMySQL c = ConexaoMySQL.getConexao();<br />
this.con_id = c.getMaxPK(&#8220;contatos&#8221;, &#8220;con_id&#8221;) + 1;<br />
c.close();<br />
this.con_nome = con_nome;<br />
this.con_endereco = con_endereco;<br />
this.con_telefone = con_telefone;<br />
this.con_email = con_email;<br />
}</p>
<p>public void Insere() throws Exception{</p>
<p>if (this.con_nome.equals(&#8220;&#8221;) || this.con_telefone.equals(&#8220;&#8221;)){<br />
throw new Exception(&#8220;Preencha pelo menos o nome e o telefone.&#8221;);<br />
}</p>
<p>ConexaoMySQL c = ConexaoMySQL.getConexao();<br />
c.Insere(&#8220;contatos&#8221;, this);<br />
c.close();<br />
}</p>
<p>//getters e setters<br />
}</p></blockquote>
<p>Uma classe extremamente simples que representa fielmente a tabela que criamos no banco de dados.</p>
<p>O construtor não exige o ID do contato, ao invés disso ele pega um novo para o contato (busca no banco o maior ID existente e soma 1).</p>
<p>O método <strong>Insere()</strong> não faz nada além de validar se pelo menos o nome e o telefone estão preenchidos e chamar o método <strong>Insere(..)</strong> da camada inferior passando uma String com o nome da tabela e passando ele mesmo (o objeto Contato) através da palavra reservada <strong>this</strong>. Caso ocorra algum erro na query, será retornada uma exceção do método <strong>Insere(…)</strong> da classe ConexaoMySQL.java para o método <strong>Insere()</strong> da classe Contato.java e este por sua vez irá retornar essa mesma exceção para quem o chamou.</p>
<p>Os nomes dos atributos devem ser iguais aos nomes das colunas da tabela, pois o método <strong>Insere(..)</strong> da classe ConexaoMySQL.java trata cada atributo como uma coluna da tabela para montar o SQL, como já vimos antes.</p>
<p>Agora vem a última (ou a primeira, depende do ponto de vista.. <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) camada: a responsável pela apresentação. A classe Principal.java é um JFrame que vai fornecer a interface visual para o usuário. Deve ficar mais ou menos assim:</p>
<p><a href="http://javasimples.files.wordpress.com/2010/02/image1.png"><img style="display:block;float:none;margin-left:auto;margin-right:auto;border-width:0;" title="image" src="http://javasimples.files.wordpress.com/2010/02/image_thumb1.png?w=356&#038;h=263" border="0" alt="image" width="356" height="263" /></a></p>
<p>Os campos de texto são JTextFields com os respectivos nomes: jTF_Nome, jTF_Endereco, jTF_Telefone e jTF_Email.</p>
<p>Creio que eu nem precise comentar sobre o que o botão Limpar faz não é?</p>
<p>O código do botão Inserir segue abaixo:</p>
<blockquote><p>public void Inserir() {<br />
try {<br />
Contatos c = new Contatos(jTF_Nome.getText(), jTF_Endereco.getText(), jTF_Telefone.getText(), jTF_Email.getText());<br />
c.Insere();<br />
JOptionPane.showMessageDialog(this, &#8220;Contato adicionado com sucesso&#8221;);<br />
} catch (Exception e) {<br />
JOptionPane.showMessageDialog(this, e.getMessage());<br />
}<br />
}</p></blockquote>
<p>Cria-se um objeto Contato a partir dos dados do formulário e chama o método Insere(), caso ocorra algum erro, o programa desviará para o bloco catch(…) e será mostrado o erro, mas se der tudo certo, será mostrada a mensagem de sucesso.</p>
<p>DICA: Debuge o projeto para ver como o SQL é montado dinâmicamente. É bem interessante.</p>
<p>É isso! Repare como o código fica simples e fácil de ler.<br />
Ao invés de ter uma classe só que cuida de mostrar os dados, validá-los, tratar a conexão com o banco e tratar o SQL (como eu mesmo já fiz e sei que muita gente faz), agora a gente tem uma estrutura muito bem projetada que facilita a manutenção e futuras mudanças, como por exemplo:</p>
<ol>
<li>Se você quiser guardar o twitter do contato também, basta criar uma nova coluna no banco, um novo atributo na classe Contatos.java e um novo campo de texto na classe de apresentação. Não precisa se preocupar com SQL pois a reflexão cuida disso pra nós.</li>
<li>Se precisar mudar o banco para o SQL Server, basta trocar a classe ConexaoMySQL por uma ConexaoSQLServer. Não há necessidade de alteração na lógica nem na apresentação do projeto.</li>
</ol>
<p>Minha intenção neste post era mostrar um exemplo somente sobre reflexão, mas eu acabei mostrando um pouco sobre o modelo de desenvolvimento em 3 camadas, algo realmente muito útil quando se trata do desenvolvimento de software.</p>
<p>Obrigado a você que teve paciência de ler até aqui.<br />
Quem quiser o projeto do NetBeans, basta pegar <a href="http://www.4shared.com/file/217967250/b8750a7c/ContatosReflexao.html">aqui</a>.<br />
Qualquer dúvida é só deixar um comentário.</p>
<p>[] e até a próxima,<br />
Saab.</p>
<p>PS: Só queria deixar uns créditos a outras pessoas:</p>
<p>Professor Silvio Carro (FIPP) que criou a base para a classe de conexão com o banco. A maior parte do código foi feito por ele.</p>
<p>Professor Emerson Silas Dória (FIPP) que mostrou esses conceitos de reflexão e camadas em aula, o que motivou a criação destes posts.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=34&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2010/02/08/reflexo-computacional-exemplo-prtico/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>

		<media:content url="http://javasimples.files.wordpress.com/2010/02/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://javasimples.files.wordpress.com/2010/02/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Java e seus espelhos: Reflex&#227;o Computacional</title>
		<link>http://javasimples.wordpress.com/2010/01/23/java-e-seus-espelhos-reflexo-computacional/</link>
		<comments>http://javasimples.wordpress.com/2010/01/23/java-e-seus-espelhos-reflexo-computacional/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 23:06:49 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[computacional]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[reflexao]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/2010/01/23/java-e-seus-espelhos-reflexo-computacional/</guid>
		<description><![CDATA[Hoje vou abordar um tema bem interessante: Reflexão Computacional e como o Java trata tal assunto. Quem se diz “programador” e nunca ouviu falar disso tem que rever seus conceitos. Existe toda uma filosofia por trás do conceito de Reflexão Computacional (ou apenas reflexão), mas eu não vou falar muito sobre isso (até porque eu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=26&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hoje vou abordar um tema bem interessante: Reflexão Computacional e como o Java trata tal assunto.</p>
<p>Quem se diz “programador” e nunca ouviu falar disso tem que rever seus conceitos. Existe toda uma filosofia por trás do conceito de Reflexão Computacional (ou apenas reflexão), mas eu não vou falar muito sobre isso (até porque eu não sei muita coisa sobre a teoria… <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), vamos mais a prática.</p>
<p>Bom, vamos viajar um pouquinho: imagine que vc tem a missão de construir um método que receba um objeto que você não sabe qual é, e tenha que aprender a usá-lo em tempo de execução, ou seja, descobrir quais métodos esse objeto possui, quais variáveis de instância e etc (CALMA! Eu sei que parece besteira e que vc deve estar pensando: “Onde diabos eu vou usar um troço desses?!?” mas CALMA, vou dar uns exemplos mais adiante e em outros posts).</p>
<p>Como Java é uma linguagem <span style="text-decoration:line-through;">quase</span> completamente orientada a objetos, presume-se que TUDO é um objeto: um método é representado por um objeto da classe java.lang.reflect.Method, toda variável de instância também é representada um objeto da classe java.lang.reflect.Field e uma classe (qualquer uma delas, seja String, Integer, Float, ou aquela que vc escreveu) é representado por um objeto genérico: o objeto Class&lt;?&gt;.</p>
<p>Chega de historinha, vamos escrever alguma coisa para demonstrar tudo isso. Vamos criar uma classe com algumas variáveis e alguns métodos bem inúteis, só para exemplificar.</p>
<blockquote><p><strong>public class Contato {<br />
private String nome;<br />
private int idade;<br />
private String email; </strong></p>
<p><strong> public Contato() {<br />
} </strong></p>
<p><strong> public Contato(String nome, int idade, String email) {<br />
this.nome = nome;<br />
this.idade = idade;<br />
this.email = email;<br />
} </strong></p>
<p><strong> public void emString() {<br />
System.out.println(nome + &#8221; &#8211; &#8221; + idade + &#8221; &#8211; &#8221; + email);<br />
} </strong></p>
<p><strong> public int idadeEmDias() {<br />
return idade * 365;<br />
} </strong></p>
<p><strong> public void enviarEmail(String assunto, String mensagem) {<br />
System.out.println(&#8220;Email&#8221;);<br />
System.out.println(&#8220;Para: &#8221; + email);<br />
System.out.println(&#8220;Assunto: &#8221; + assunto);<br />
System.out.println(&#8220;Mensagem: &#8221; + mensagem);<br />
System.out.print(&#8220;Enviando&#8230;&#8221;);<br />
System.out.println(&#8220;concluído&#8221;);<br />
}<br />
}</strong></p></blockquote>
<p>Como da pra ver… uma classe bem simples e que não faz absolutamente nada.<br />
Vamos ao código de reflexão que depois eu explico ele:</p>
<blockquote><p><strong>public class Reflexao{ </strong></p>
<p><strong> </strong><strong> public Reflexao(){<br />
Contato c = new Contato(&#8220;Felipe&#8221;, 20, &#8220;fesaab@gmail.com&#8221;);<br />
infoClasse(c.getClass());<br />
} </strong></p>
<p><strong> public void infoClasse(Class&lt;?&gt; classe){ </strong><strong><br />
//percorrendo as variáveis de instancia<br />
for (Field f : classe.getDeclaredFields()){<br />
System.out.println(f.getName());<br />
}</strong></p>
<p><strong> //percorrendo os métodos<br />
for (Method m : classe.getDeclaredMethods()){<br />
System.out.print(m.getReturnType().getName()+&#8221; &#8220;); </strong></p>
<p><strong> System.out.print(m.getName()+&#8221; &#8220;); </strong></p>
<p><strong> Class&lt;?&gt; c[] = m.getParameterTypes();<br />
if (c.length == 0){<br />
System.out.println(&#8220;()&#8221;);<br />
}else{<br />
System.out.print(&#8220;(&#8220;);<br />
for (Class&lt;?&gt; cl : c){<br />
System.out.print(cl.getName()+&#8221;,&#8221;);<br />
}<br />
System.out.println(&#8220;)&#8221;);<br />
}<br />
}<br />
}<br />
}</strong></p></blockquote>
<p>Muito bem, logo no construtor da classe Reflexao foi criado o objeto <strong>“c”</strong> da classe Contato e logo em seguida foi invocado o método <strong>“infoClasse(Class&lt;?&gt;)”</strong> passando como parâmetro um objeto da classe <strong>“Class&lt;?&gt;”</strong> que for retornado pelo método <strong>“getClass()”</strong> que QUALQUER objeto tem.</p>
<p>No método <strong>infoClasse(..)</strong>, a primeira instução <strong>for</strong> percorre todas as variáveis de instância da classe passada no parâmetro.<br />
A segunda instrução <strong>for</strong> percorre todos os métodos da classe. Eu dei uma “enfeitada” nesse segundo for, mais foi só para demonstrar alguns métodos da classe Method. A execução do código gera a seguinte saída:</p>
<blockquote><p>nome<br />
idade<br />
email<br />
void emString ()<br />
int idadeEmDias ()<br />
void enviarEmail (java.lang.String,java.lang.String,)</p></blockquote>
<p>Repare que apenas foram exibidas informações da CLASSE, nada do objeto foi revelado. Para tal propósito, devemos explorar alguns outros métodos, vamos ao código:</p>
<blockquote><p><strong> public void infoObjeto(Object o) throws Exception{<br />
Class&lt;?&gt; classe = o.getClass(); </strong></p>
<p><strong> for (Field f :classe.getDeclaredFields()){<br />
f.setAccessible(true);<br />
System.out.println(f.getName()+&#8221;: &#8220;+f.get(o));<br />
}<br />
}</strong></p></blockquote>
<p>Para descobrir o conteúdo das variável de instância, deve-se:</p>
<ol>
<li>Recuperar o objeto Field da respectiva variável</li>
<li>Se a variável não possuir visibilidade pública (como é o caso das nossas, são privadas), deve-se liberar o acesso para seu conteúdo através do método <strong>setAccessible(true)</strong>.</li>
<li>Recuperar o conteúdo da variável através do método <strong>get(Object)</strong> da classe <strong>Field</strong>. Lembrando que o método pertence ao objeto da classe Field, esse objeto não sabe o valor da variável de instância que agente quer, mas ele sabe <strong>como</strong> recuperar esse valor porque esse objeto <strong>representa</strong> a variável. Portanto agente simplesmente fala assim: “ô objeto da classe Field, recupera o valor da variável que você representa. A variável que eu quero está nesse objeto aqui”. Por isso agente passa o objeto como parâmetro para o método.</li>
</ol>
<p>A execução do método infoObjeto(…) gera a seguinte saída:</p>
<blockquote><p>nome: Felipe<br />
idade: 20<br />
email: fesaab@gmail.com</p></blockquote>
<p>Antes de finalizar essa pequena introdução, só mais uma coisa: eu mostrei como recuperar os objetos Field e Method que representam as variáveis de instância e os métodos de um objeto de uma classe qualquer, mostrei também como recuperar o conteúdo de qualquer variável de instância, só falta ver como agente executa um método. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>É extramente simples… uma vez que agente já sabe como recuperar os objetos Method que representam os métodos, basta chamar o método <strong>invoke(Object, Object[])</strong>.<br />
O primeiro parâmetro é o objeto que agente quer que execute o método, e o segundo é um vetor que contém os parâmetros que o método exige. Vamos a um exemplo:</p>
<blockquote><p><strong>public void executaMetodos(Object o) throws Exception {<br />
Class&lt;?&gt; classe = o.getClass(); </strong></p>
<p><strong> for (Method m : classe.getDeclaredMethods()) {<br />
if (m.getParameterTypes().length == 0) {<br />
System.out.println(&#8220;Invocando o método: &#8221; + m.getName());<br />
if (m.getReturnType().getName().equals(&#8220;void&#8221;)) {<br />
m.invoke(o, new Object[0]);<br />
} else {<br />
System.out.println(m.invoke(o, new Object[0]));<br />
}<br />
}<br />
}<br />
}</strong></p></blockquote>
<p>Só para simplificar eu restringi a invocar apenas os métodos que não tem parâmetro nenhum para passar, se tivesse, bastava descobrir através do método<strong> “getParameterTypes()”</strong> da classe Method e criar o array de Object com os parametros corretos.</p>
<p>No código eu também separei a chamada de métodos que não tem retorno dos que tem utilizando o método <strong>“getReturnType()”</strong>, quando tiver retorno eu simplesmente imprimo ele na tela. O resultado da execução do código é o seguinte:</p>
<blockquote><p><strong>Invocando o método: emString<br />
Felipe &#8211; 20 &#8211; fesaab@gmail.com<br />
Invocando o método: idadeEmDias<br />
7300</strong></p></blockquote>
<p>Bom galera, essa foi uma pequena introdução sobre reflexão computacional. Espero que ajude um pouco quem estava procurando sobre o assunto.<br />
Nos próximos posts eu vou utilizar esse conceito numa abordagem bem mais próxima da realidade (onde usar isso).</p>
<p>[] e até a próxima,<br />
Saab.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=26&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2010/01/23/java-e-seus-espelhos-reflexo-computacional/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>
	</item>
		<item>
		<title>Adicionando JCalendar e JDateChooser &#224; paleta do Netbeans</title>
		<link>http://javasimples.wordpress.com/2010/01/19/adicionando-jcalendar-e-jdatechooser-paleta-do-netbeans/</link>
		<comments>http://javasimples.wordpress.com/2010/01/19/adicionando-jcalendar-e-jdatechooser-paleta-do-netbeans/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 19:47:00 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jcalendar]]></category>
		<category><![CDATA[jdatechooser]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[paleta]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/2010/01/19/adicionando-jcalendar-e-jdatechooser-paleta-do-netbeans/</guid>
		<description><![CDATA[Se você não conhece esse componente, deveria conhecer! São componentos visuais que facilitam imensamente o usuário selecionar uma data. Segue uma pequena imagem dos componentes: O JCalendar é como o calendário do Windows, já o JDateChooser é como um combobox, que abre um mini-calendário quando o usuário clica no ícone do lado direito e o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=25&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Se você não conhece esse componente, deveria conhecer!</p>
<p>São componentos visuais que facilitam imensamente o usuário selecionar uma data. Segue uma pequena imagem dos componentes:</p>
<p><a href="http://javasimples.files.wordpress.com/2010/01/image.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://javasimples.files.wordpress.com/2010/01/image_thumb.png?w=277&#038;h=153" width="277" height="153" /></a></p>
<p>O JCalendar é como o calendário do Windows, já o JDateChooser é como um combobox, que abre um mini-calendário quando o usuário clica no ícone do lado direito e o fecha quando o usuário clica na data desejada.</p>
<p>Site do projeto &#8211; <a href="http://www.toedter.com/en/jcalendar/">http://www.toedter.com/en/jcalendar/</a></p>
<p>Para instalar esses componentes é necessário fazer o download no site do projeto e procurar dentro da pasta /lib o .jar desejado, mas como eu sou mto bonzinho, eu coloquei no meu 4shared o único arquivo necessário. Para baixar clique <a href="http://www.4shared.com/file/201496889/50989f8d/jcalendar-133.html">aqui</a>.</p>
<p>Antes de configurar, vale lembrar que o Netbeans vai fazer apenas uma referência ao arquivo, ou seja, ele vai usar o que está dentro do arquivo, então se deixar ele na área de trabalho, ou no diretório dos seus downloads, não vai ter como mudar de lugar depois, então vale a pena guardar em um local seguro (tipo: …/Java/jdk/lib).</p>
<p>Com o Netbeans aberto (estou usando o 6.7.1), clique em “Ferramentas &gt; Paleta &gt; Componentes Swing/AWT”. Voce deverá chegar na seguinte tela:</p>
<p><a href="http://javasimples.files.wordpress.com/2010/01/image1.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://javasimples.files.wordpress.com/2010/01/image_thumb1.png?w=301&#038;h=276" width="301" height="276" /></a>&#160;</p>
<p>Clique em “Nova Categoria” e de o nome desejado, algo como Calendário ou Data, sei lá… Se não quiser não precisa, só acho mais organizado deixar separado.</p>
<p>Com a nova categoria criada (ou não), clique em “Adicionar do JAR…” e navegue até o .jar que você acabou de baixar.</p>
<p>Selecione todos os componentes e clique em “Próximo”.</p>
<p><a href="http://javasimples.files.wordpress.com/2010/01/image2.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://javasimples.files.wordpress.com/2010/01/image_thumb2.png?w=303&#038;h=216" width="303" height="216" /></a> </p>
</p>
<p>Na última tela basta selecionar a pasta que vai conter os novos componentes e clicar em “Finalizar”.</p>
<p>Prontinho, agora você já tem a sua disposição o JCalendar, o JDateChooser e mais alguns componentes. Para usar é só clicar e arrastar pra tela. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><a href="http://javasimples.files.wordpress.com/2010/01/image3.png"><img style="border-bottom:0;border-left:0;display:block;float:none;margin-left:auto;border-top:0;margin-right:auto;border-right:0;" title="image" border="0" alt="image" src="http://javasimples.files.wordpress.com/2010/01/image_thumb3.png?w=273&#038;h=300" width="273" height="300" /></a> </p>
<p>Duas coisas que valem ser lembradas:</p>
<ol>
<li>A propriedade dateFormatString é responsável pela formatação da string exibida no componente. Ex:     <br />”dd/MM/yyyy” –&gt; 19/01/2010      <br />”MM/dd/yyyy” –&gt; 01/19/2010</li>
<li>Todos os componentes possuem o método getDate que retorna a data selecionada em um objeto java.util.Date</li>
</ol>
<p>É isso ai galera.   <br />Qualquer dúvida é só comentar…</p>
<p>Até a próxima,   <br />Saab.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=25&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2010/01/19/adicionando-jcalendar-e-jdatechooser-paleta-do-netbeans/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>

		<media:content url="http://javasimples.files.wordpress.com/2010/01/image_thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://javasimples.files.wordpress.com/2010/01/image_thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://javasimples.files.wordpress.com/2010/01/image_thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://javasimples.files.wordpress.com/2010/01/image_thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Erro insolucionável utilizando subreports no iReport + Firebird</title>
		<link>http://javasimples.wordpress.com/2009/09/02/erro-insolucionavel-utilizando-subreports-no-ireport-firebird/</link>
		<comments>http://javasimples.wordpress.com/2009/09/02/erro-insolucionavel-utilizando-subreports-no-ireport-firebird/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 02:38:00 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[erro]]></category>
		<category><![CDATA[firebird]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[subreports]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/2009/09/02/erro-insolucionavel-utilizando-subreports-no-ireport-firebird</guid>
		<description><![CDATA[De uns tempos para cá eu tive que relembrar como usar o iReport para poder terminar um trabalho.Até aí tudo bem, &#8211; pensei eu &#8211; só desenhar o relatório no iReport, usar duas linhas de código para chamar ele e boa&#8230; Nos relatórios mais simples (clientes, estoque, fornecedores&#8230;) foi só alegria! Mas chegou uma hora [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=8&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>De uns tempos para cá eu tive que relembrar como usar o iReport para poder terminar um trabalho.<br />Até aí tudo bem, &#8211; pensei eu &#8211; só desenhar o relatório no iReport, usar duas linhas de código para chamar ele e boa&#8230;</p>
<p>Nos relatórios mais simples (clientes, estoque, fornecedores&#8230;) foi só alegria! Mas chegou uma hora em que eu precisei fazer um relatório agrupado: Pedidos X Produtos. Começei a pesquisar como fazer um relatório com duas querys e/ou coisas relacionas até que eu descobri sobre o Subreport.</p>
<p>O componente Subreport do iReport permite incluir um relatório já existente (outro arquivo .jasper) dentro do relatório que eu estou editando.</p>
<p>Maravilha! Era só fazer um relatório para mostrar somente os produtos daquele pedido e depois chamá-lo dentro do relatório principal que continha os detalhes do pedido. Para isso eu ainda tive que apanhar mais um pouco e aprender como passar parâmetros de um relatório para outro, mas nesse ponto eu já tinha pesquisado bastante e isso não foi um grande empecilho.</p>
<p>Cheguei então ao resultado final: o relatório principal continha os dados do pedido e um subrelatório que mostrava todos os produtos que faziam parte do respectivo pedido, mas na hora de visualizar o relatório, adivinhe&#8230;. PAU!!! Não visualizava de jeito nenhum, e o único erro apresentado era:</p>
<div style="color:red;text-align:center;"><b>Unable to get next record</b></div>
<p>
<div style="text-align:left;">FDP!!!!!!!!!!! Não tinha conserto!! Nada fazia o relatório funcionar&#8230; Depois de muito chingar, alterar os relatórios, procurar erros, seguir tutoriais na internet, entre várias outras abordagens mal sucedidas, cheguei em um post de algum fórum sobre java, onde tinha uma pessoa com o mesmo problema que o meu. Li todas as respostas (umas 20 e poucas) e na <b>ÚLTIMA</b> tinha um anjo que escreveu o seguinte:</div>
<p>
<div style="text-align:center;"><b>Na conexão com o banco de dados tenta colocar isso aqui no final: ?defaultResultSetHoldable=True . </p>
<p>Ex: jdbc:firebirdsql://localhost/d:/BANCO.FDB?defaultResultSetHoldable=True<br />Esse é um erro interno da biblioteca jay-bird&#8230;</b></div>
<div style="text-align:left;">E adivinhem&#8230; FUNCIONOU!!!</div>
<p>
<div style="text-align:left;">Eu perdi no mínimo umas 6 horas em cima dakela maldita tela tentando tudo que vinha na cabeça e por fim tudo que eu precisava era setar uma variável interna do jay-bird !??!?!?!??!?!?!</div>
<div style="text-align:left;">FDP denovo!!!!!!!!!!!</p>
<p>Não sabia se eu estava feliz por ter funcionado, ou se eu estava puto por ser só isso e eu ter perdido tanto tempo&#8230;</p></div>
<div style="text-align:left;"></div>
<p>
<div style="text-align:left;">Mas o fato é que eu não quero mais ninguém sofrendo como eu sofri, então se você está modelando um relatório com subreport no qual os dados virão de um banco de dados Firebird com conexão  provida através da biblioteca jay-bird e está obtendo esse erro: &#8220;<b>Unable to get next record</b>&#8220;, é só colocar aquele parâmetro no final da string de conexão.</div>
<div style="text-align:left;"></div>
<p>
<div style="text-align:left;">Quando sobrar um tempo eu vou escrever um tutorial completo de como fazer um relatório utilizando subreports e como chamar ele de dentro da sua aplicação java.</div>
<p>
<div style="text-align:left;">Só espero que esse post ajude mais alguém com esse problema&#8230; =]</div>
<div style="text-align:left;"></div>
<div style="text-align:left;">[]s e até a próxima.</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=8&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2009/09/02/erro-insolucionavel-utilizando-subreports-no-ireport-firebird/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>
	</item>
		<item>
		<title>Abrindo um menu popup ao clicar em um botão</title>
		<link>http://javasimples.wordpress.com/2009/08/30/abrindo-um-menu-popup-ao-clicar-em-um-botao/</link>
		<comments>http://javasimples.wordpress.com/2009/08/30/abrindo-um-menu-popup-ao-clicar-em-um-botao/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 05:57:00 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[abrir]]></category>
		<category><![CDATA[botao]]></category>
		<category><![CDATA[clicar]]></category>
		<category><![CDATA[jbutton]]></category>
		<category><![CDATA[jpopupmenu]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[popup]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/2009/08/30/abrindo-um-menu-popup-ao-clicar-em-um-botao</guid>
		<description><![CDATA[1:33h da madrugada de um domingo e eu to começando a escreve esse post&#8230;.Fim de carreira neh&#8230; aiuhaiuhaiuahiahu Mas vamos ao que interessa: às vezes pode ser bem interessante abrir um menu popup ao clicar em um botão da sua aplicação, como por exemplo em uma tela de cadastro de contas a pagar. A conta [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=7&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>1:33h da madrugada de um domingo e eu to começando a escreve esse post&#8230;.<br />Fim de carreira neh&#8230; aiuhaiuhaiuahiahu</p>
<p>Mas vamos ao que interessa: às vezes pode ser bem interessante abrir um menu popup ao clicar em um botão da sua aplicação, como por exemplo em uma tela de cadastro de contas a pagar. A conta a pagar pode estar vinculada a um fornecedor, a um equipamento, a um veículo ou seja lá o que for que <strike>você</strike> o cliente queira.</p>
<p>Uma boa prática que eu gosto de usar é sempre deixar o usuário poder fazer uma busquinha rápida pelo fornecedor (equipamento, veículo, &#8230;) ao invés de ter que digitar o código dele lá.</p>
<p>Sendo assim, ao invés de fazer um botão para a busca de fornecedores, outro botão pra busca disso e outro pra busca daquilo, eu faço apenas um botão que quando clicado abre um menu com todas as opções e frescuras que eu quiser.</p>
<p>Muito mais simples neh&#8230; então mãos a obra: crie um novo projeto na sua IDE, adicione um JFrame e coloque um JTextField e um JButton nele (um iconezinho sempre eh legal neh&#8230; iauhiauaihu), fica +/- assim:</p>
<div class="separator" style="clear:both;text-align:center;"><a href="http://javasimples.files.wordpress.com/2009/08/img1.png" style="margin-left:1em;margin-right:1em;"><img border="0" src="http://javasimples.files.wordpress.com/2009/08/img1.png?w=300" /></a>&nbsp;</div>
<div class="separator" style="clear:both;text-align:center;"></div>
<div class="separator" style="clear:both;text-align:left;">O meu JTextField vai se chamar jTF_Texto e o JButton vai ser jB_Busca, fique a vontade para dar os nomes mais convenientes.</div>
<div class="separator" style="clear:both;text-align:left;">Para abrir o menu popup usa-se o JPopupMenu, que nada mais é do que um JMenu que aparece em tempo de execução e por cima dos outros componentes. Ou seja, os itens que vão estar dentro do menu popup são os mesmos do menu estático: JMenuItem, JCheckBoxMenuItem e etc.</div>
<p>Quando o usuário clicar no botão agente cria o JPopupMenu e os JMenuItems dinamicamente, portanto podemos escrever o código tanto no evento de ActionPerformed quanto em algum de mouse. Eu vou escrever no MouseClicked:</p>
<p><b>private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cria o primeiro item do menu e atribui uma ação pra ele<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMenuItem item1 = new JMenuItem(&#8220;Opção 1&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item1.addActionListener(new ActionListener() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void actionPerformed(ActionEvent e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jTF_Texto.setText(&#8220;Clicou na Opção 1&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cria o segundo item do menu e atribui uma ação pra ele<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMenuItem item2 = new JMenuItem(&#8220;Opção 2&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item2.addActionListener(new ActionListener() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void actionPerformed(ActionEvent e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jTF_Texto.setText(&#8220;Clicou na Opção 2&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cria o terceiro item do menu e atribui uma ação pra ele<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JMenuItem item3 = new JMenuItem(&#8220;Opção 3&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item3.addActionListener(new ActionListener() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void actionPerformed(ActionEvent e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jTF_Texto.setText(&#8220;Clicou na Opção 3&#8243;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cria o menu popup e adiciona os 3 itens<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JPopupMenu popup = new JPopupMenu();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popup.add(item1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popup.add(item2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popup.add(item3);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //mostra na tela<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popup.show(jB_Busca, 10, 10);<br />&nbsp;&nbsp;&nbsp; }</b></p>
<p>O código é totalmente auto-explicativo nao eh&#8230; ainda mais com alguns comentarios&#8230; hehe<br />Talvez a única parte diferente seja mostrar o menu: o método <b>show(&#8230;)</b> da classe JPopupMenu é o responsável por jogar o menu por cima dos outros componentes, e pra isso, ele precisa saber em cima de quem ele vai aparecer&#8230; então é só passar para ele uma referencia do nosso botão. Os outros dois parâmetros são as coordenadas X,Y que o menu vai ser desenhado, sendo que a coordenada 0,0 é a mesma coordenada 0,0 do botão. Só pra dar um efeito mais bonitinho, eu desloquei 10 em X e 10 em Y:</p>
<div class="separator" style="clear:both;text-align:center;"><a href="http://javasimples.files.wordpress.com/2009/08/img2.png" style="margin-left:1em;margin-right:1em;"><img border="0" src="http://javasimples.files.wordpress.com/2009/08/img2.png?w=300" /></a></div>
<p>Bem simples não?&#8230;<br />Dúvidas é só postar, twittar&#8230;</p>
<p>Para quem quiser o código fonte desse exemplo, é só pegar o <a href="http://www.4shared.com/file/128788442/d7fea22b/JPopupMenu_no_JButton.html">Projeto do NetBeans</a>.</p>
<p>[]s, e até a próxima.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=7&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2009/08/30/abrindo-um-menu-popup-ao-clicar-em-um-botao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>

		<media:content url="http://javasimples.files.wordpress.com/2009/08/img1.png?w=300" medium="image" />

		<media:content url="http://javasimples.files.wordpress.com/2009/08/img2.png?w=300" medium="image" />
	</item>
		<item>
		<title>Mudando a cor, fonte, alinhamento, etc&#8230; de células de JTable</title>
		<link>http://javasimples.wordpress.com/2009/08/27/mudando-a-cor-fonte-alinhamento-etc-de-celulas-de-jtable/</link>
		<comments>http://javasimples.wordpress.com/2009/08/27/mudando-a-cor-fonte-alinhamento-etc-de-celulas-de-jtable/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 16:36:00 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[alinhamento]]></category>
		<category><![CDATA[célula]]></category>
		<category><![CDATA[cor]]></category>
		<category><![CDATA[fonte]]></category>
		<category><![CDATA[jtable]]></category>
		<category><![CDATA[mudar]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/2009/08/27/mudando-a-cor-fonte-alinhamento-etc-de-celulas-de-jtable</guid>
		<description><![CDATA[Ae galera,Hoje vou dar uma dica bem interessante pra manipular as células de uma JTable. Vamos imaginar que devemos representar uma matriz dentro de uma JTable, ou seja, devemos ter um cabeçalho para as linhas e outro para as colunas.Nosso objetivo vai ser construir a seguinte matriz: Vamos começar definindo as colunas dessa tabela: String [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=6&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ae galera,<br />Hoje vou dar uma dica bem interessante pra manipular as células de uma JTable.</p>
<p>Vamos imaginar que devemos representar uma matriz dentro de uma JTable, ou seja, devemos ter um cabeçalho para as linhas e outro para as colunas.<br />Nosso objetivo vai ser construir a seguinte matriz:</p>
<p><a href="http://javasimples.files.wordpress.com/2009/08/matriz.png"><img src="http://javasimples.files.wordpress.com/2009/08/matriz.png?w=300" alt="" border="0" /></a><br />Vamos começar definindo as colunas dessa tabela:</p>
<p><span style="font-weight:bold;">String colunas[] = {&#8220;&#8221;,&#8221;A&#8221;,&#8221;B&#8221;,&#8221;C&#8221;};</span></p>
<p>Como a primeira coluna da tabela vai servir para representar o cabeçalho das linhas, então a primeira coluna fica sem nome.</p>
<p>Agora vamos definir a matriz de dados, lembrando que a primeira coluna será o cabeçalho ainda:</p>
<p><span style="font-weight:bold;">String dados[][] = {{&#8220;A&#8221;,&#8221;0&#8243;,&#8221;1&#8243;,&#8221;0&#8243;},{&#8220;B&#8221;,&#8221;1&#8243;,&#8221;0&#8243;,&#8221;1&#8243;},{&#8220;C&#8221;,&#8221;0&#8243;,&#8221;1&#8243;,&#8221;0&#8243;}};</span></p>
<p>Agora que temos todos os dados necessários, vamos completar a tabela:</p>
<p><span style="font-weight:bold;">jTable.setModel(new DefaultTableModel(dados,colunas));<br /><span style="font-weight:bold;"><br /></span></span>Obs: estou supondo que a tabela já foi instanciada e que seu nome seja &#8220;jTable&#8221;.<br />Pronto, agora a tabela está criada, porém ela não parece uma matriz ainda:</p>
<p><a href="http://javasimples.files.wordpress.com/2009/08/matrizfeia.png"><img src="http://javasimples.files.wordpress.com/2009/08/matrizfeia.png?w=300" alt="" border="0" /></a><br />Um pouco de teoria: o Java utiliza uma classe chamada TableCellRenderer para definir as propriedades de cada célula (cor de fundo, fonte, alinhamento, entre outras). Essa classe mostra a tabela como nós estamos acostumados a ver, porém se nós quisermos personalizar as células, nós devemos criar a nossa própria classe TableCellRenderer, para tal, devemos criar uma classe que herda de DefaultTableCellRenderer.</p>
<p>Como nossa finalidade é muito simples (apenas mudar a cor e o alinhamento), vamos criar o nosso objeto em tempo de execução mesmo:</p>
<p><span style="font-weight:bold;">DefaultTableCellRenderer letras =</span><br /><span style="font-weight:bold;">                    new DefaultTableCellRenderer() {</span></p>
<p><span style="font-weight:bold;">                        public void setValue(Object value) {</span><br /><span style="font-weight:bold;">                            setBackground(new Color(238, 238, 238));<br />                           setForeground(Color.BLACK);</span><br /><span style="font-weight:bold;">                            setHorizontalAlignment(JLabel.CENTER);</span><br /><span>                            //outras alterações entram aqui&#8230;</span><br /><span style="font-weight:bold;">                            super.setValue(value);</span><br /><span style="font-weight:bold;">                        }</span><br /><span style="font-weight:bold;">                    };</span></p>
<p>Acabamos de criar o objeto <span style="font-weight:bold;">letras</span>, que é do tipo DefaultTableCellRender e reescrevemos o método <span style="font-weight:bold;">setValue(Object value)</span>.</p>
<p>É dentro desse método que a mágica acontece: como estamos criando um objeto que define as propriedades de uma célula, basta alterá-las e consequentemente alterar a(s) célula(s).</p>
<p>Já com o nosso próprio objeto DefaultTableCellRender criado, basta atribuí-lo à célula desejada. No nosso caso, como queremos modificar todas as células de uma mesma coluna, vamos setar o nosso DefaultTableCellRender para todas as células de uma coluna:</p>
<p><span style="font-weight:bold;">TableColumn tc = jTable.getColumn(&#8220;&#8221;);</span> <span style="font-weight:bold;"><br />tc.setCellRenderer(letras);</span></p>
<p>TableColumn é a classe que controla todas as células da coluna, portanto se setarmos o nosso próprio DefaultTableCellRender como CellRenderer dela, todas as células daquela coluna vão ser personalizadas.<br />Para recuperar uma TableColumn usa-se o método <span style="font-weight:bold;">getColumn(Object id)</span> da JTable, onde<span style="font-weight:bold;"> id</span>  é o que está escrito no cabeçalho da coluna. Como definimos anteriormente que a primeira coluna seria <span style="font-weight:bold;">&#8220;&#8221;</span> <span style="font-weight:bold;"></span>, recuperamos ela do mesmo jeito.</p>
<p>Até aqui agente tem a seguinte tabela:</p>
<p><a href="http://javasimples.files.wordpress.com/2009/08/matrizquase.png"><img src="http://javasimples.files.wordpress.com/2009/08/matrizquase.png?w=300" alt="" border="0" /></a>Já está bem mais parecida com uma matriz, mas só para dar uma melhorada no visual, vamos centralizar as colunas dos dados também. Para isso precisamos definir um outro DefaultTableCellRender que só centralize o texto nas células:</p>
<p><span style="font-weight:bold;">DefaultTableCellRenderer numeros =</span><br /><span style="font-weight:bold;">                    new DefaultTableCellRenderer() {</span></p>
<p><span style="font-weight:bold;">                        public void setValue(Object value) {</span><br /><span style="font-weight:bold;">                            setHorizontalAlignment(JLabel.CENTER);</span><br /><span style="font-weight:bold;">                            super.setValue(value);</span><br /><span style="font-weight:bold;">                        }</span><br /><span style="font-weight:bold;">                    };</span></p>
<p><span style="font-weight:bold;">jTable.getColumn(&#8220;A&#8221;).</span><span style="font-weight:bold;">setCellRenderer(numeros);</span><br /><span style="font-weight:bold;">jTable.getColumn(&#8220;B&#8221;).</span><span style="font-weight:bold;">setCellRenderer(numeros);<br /></span><span style="font-weight:bold;">jTable.getColumn(&#8220;C&#8221;).</span><span style="font-weight:bold;">setCellRenderer(numeros);</span><span style="font-weight:bold;"></p>
<p></span>Pronto! Agora ficou igual uma matriz mesmo:<span style="font-weight:bold;"><br /></span><br /><a href="http://javasimples.files.wordpress.com/2009/08/matriz.png"><img src="http://javasimples.files.wordpress.com/2009/08/matriz.png?w=300" alt="" border="0" /></a><br />Obs: aqui eu fiz a tabela inteira estática só para facilitar o exemplo, mas nada impede que você personalize uma tabela com dados vindos de outra fonte (entrada, banco de dados&#8230;), a idéia é sempre a mesma.</p>
<p>É isso ai pessoal&#8230;<br />Qualquer duvida, dica ou seja lá o que for, posta um comentário ae&#8230; ^^</p>
<p>Até a próxima&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=6&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2009/08/27/mudando-a-cor-fonte-alinhamento-etc-de-celulas-de-jtable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>

		<media:content url="http://javasimples.files.wordpress.com/2009/08/matriz.png?w=300" medium="image" />

		<media:content url="http://javasimples.files.wordpress.com/2009/08/matrizfeia.png?w=300" medium="image" />

		<media:content url="http://javasimples.files.wordpress.com/2009/08/matrizquase.png?w=300" medium="image" />

		<media:content url="http://javasimples.files.wordpress.com/2009/08/matriz.png?w=300" medium="image" />
	</item>
		<item>
		<title>(J2ME + Bluetooth) Facinho&#8230;</title>
		<link>http://javasimples.wordpress.com/2009/08/20/j2me-bluetooth-facinho/</link>
		<comments>http://javasimples.wordpress.com/2009/08/20/j2me-bluetooth-facinho/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 18:52:00 +0000</pubDate>
		<dc:creator>Saab</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://javasimples.wordpress.com/2009/08/20/j2me-bluetooth-facinho</guid>
		<description><![CDATA[Primeiro post, N-ésimo blog&#8230; kkkkkkVamos ver se eu consigo manter esse blog atualizado&#8230; Bom, sem mais delongas&#8230; vamos ao assunto do post: Eu sempre tive muita vontade de aprender a desenvolver aplicativos que utilizassem o bluetooth do celular através de J2ME, então eu começei a pesquisar. Porém, meus esforços foram inúteis&#8230; nunca achava um bom [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=5&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Primeiro post, N-ésimo blog&#8230; kkkkkk<br />Vamos ver se eu consigo manter esse blog atualizado&#8230; <br />Bom, sem mais delongas&#8230; vamos ao assunto do post:</p>
<p>Eu sempre tive muita vontade de aprender a desenvolver aplicativos que utilizassem o bluetooth do celular através de J2ME, então eu começei a pesquisar. Porém, meus esforços foram inúteis&#8230; nunca achava um bom material, quando achava alguma coisa não tinha nenhum código fonte como exemplo&#8230; sempre uma m*#!@.<br />Até que um dia eu descobri o Project Marge, que tem como objetivo simplificar o uso do bluetooth em J2ME.<br />Ótima iniciativa, muito boa mesmo&#8230; alguém tinha que começar isso um dia não é mesmo? hehehe</p>
<p>A partir daí eu começei a fuçar alguns códigos que utilizam o framework &#8220;marge-core&#8221;(Framework resultante do projeto) e me impressionei com a facilidade de uso. Qualquer um que entenda um mínimo de J2ME e o básico de Java consegue facilmente acessar o bluetooth&#8230;</p>
<p>Enquanto eu aprendia eu ia desenvolvendo um joguinho pong, apenas alterando as classes de um exemplo disponível na época (um chat bluetooth), tal exemplo se encontra hoje no site do projeto, junto com muitos outros.</p>
<p>Quem se interessar e quiser dar uma olhadinha mais afundo: <a href='https://marge.dev.java.net/'>site do projeto</a>. </p>
<p><a href='https://marge.dev.java.net/source/browse/marge/trunk/demos/pongbluetooth-br/'>O pong que eu fiz.. =]</a> </p>
<p>PS: tem erros e redundâncias no código&#8230; vale frizar que meu objetivo era a comunicação bluetooth e não o design.</p>
<p>Se alguem quiser saber mais, é só deixar um comentário ou entrar em contato.<br />[] a todos e até a próxima.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javasimples.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javasimples.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javasimples.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javasimples.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/javasimples.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/javasimples.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/javasimples.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/javasimples.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javasimples.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javasimples.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javasimples.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javasimples.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javasimples.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javasimples.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javasimples.wordpress.com&amp;blog=9982079&amp;post=5&amp;subd=javasimples&amp;ref=&amp;feed=1" width="1" height="1" /><div class="sharedaddy sd-like-enabled"></div>]]></content:encoded>
			<wfw:commentRss>http://javasimples.wordpress.com/2009/08/20/j2me-bluetooth-facinho/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a9ce2c510f69e80918a4ae8e670577ba?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fesaab</media:title>
		</media:content>
	</item>
	</channel>
</rss>
