<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-32745412</id><updated>2009-10-15T08:13:41.546-03:00</updated><title type='text'>Cotidiano em Wonderland</title><subtitle type='html'>Anotações de um Programador de Wonderland</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/-/Netbeans'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/search/label/Netbeans'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32745412.post-4272548943207906596</id><published>2007-07-13T05:35:00.000-03:00</published><updated>2007-07-13T19:16:34.216-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>NetBeans IDE 6.0, GNU/Linux Ubuntu, GTK Look and Feel e Outras...</title><content type='html'>&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;NetBeans IDE 6.0, GNU/Linux Ubuntu e GTK Look and Feel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O primeiro aspecto que notei ao estrear o NetBeans 6.0 no Ubuntu foi o seu &lt;a style="font-style: italic;" href="http://rfiume.blogspot.com/2007/01/look-and-feel.html"&gt;look and feel&lt;/a&gt;. Está excelente, pois realmente parece um aplicativo GTK nativo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RpdD-rF5qiI/AAAAAAAAApI/jsnOebbIFlE/s1600-h/NetBeans-6.10-Glossy.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RpdD-rF5qiI/AAAAAAAAApI/jsnOebbIFlE/s400/NetBeans-6.10-Glossy.png" alt="" id="BLOGGER_PHOTO_ID_5086609048136690210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Acima temos o NetBeans 6.0 com o tema Glossy&lt;span class="fullpost"&gt;. Abaixo, com o Clearlooks.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RpdD1LF5qhI/AAAAAAAAApA/DHbOHxXZghA/s1600-h/NetBeans-6.10-ClearLooks.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RpdD1LF5qhI/AAAAAAAAApA/DHbOHxXZghA/s400/NetBeans-6.10-ClearLooks.png" alt="" id="BLOGGER_PHOTO_ID_5086608884927932946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Swing e a Sua Nova Era&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Temporada interessante para o Swing. Há pouco tempo atrás, alguns chegaram a soar as trombetas do apocalipse para esse &lt;span style="font-style: italic;"&gt;toolkit&lt;/span&gt;. Parece que ainda há pessoas que pensam assim, mas está ficando cada vez mais difícil encontrá-las.&lt;br /&gt;&lt;br /&gt;Alguém está investindo pesado no Swing. Com o Java 6, houve melhora na sua performance, &lt;a href="http://rfiume.blogspot.com/2007/03/desktop-api.html"&gt;integração com o sistema operacional nativo e seus aplicativos padrões&lt;/a&gt;, &lt;a href="http://rfiume.blogspot.com/2007/03/turbinando-o-anti-aliasing.html"&gt;anti-aliasing&lt;/a&gt;, além de outras facilidades interessantes como a &lt;a style="font-style: italic;" href="http://rfiume.blogspot.com/2007/02/splash-screen.html"&gt;splash screen&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Nesse momento, há projetos fervilhando, sendo o &lt;a href="http://rfiume.blogspot.com/search/label/SwingX"&gt;SwingX&lt;/a&gt; (do &lt;a href="http://swinglabs.org/"&gt;SwingLabs&lt;/a&gt;), Beans Binding (JSR-295) e &lt;a href="http://rfiume.blogspot.com/2007/05/swing-application-framework-jsr-296.html"&gt;Swing Application Framework (JSR-296)&lt;/a&gt; talvez os mais notáveis.&lt;br /&gt;&lt;br /&gt;Não seria perdoável esquecer dos vários &lt;a style="font-style: italic;" href="http://rfiume.blogspot.com/2007/01/look-and-feel.html"&gt;look and feels&lt;/a&gt; disponíveis e de &lt;span style="font-style: italic;"&gt;frameworks&lt;/span&gt; já existentes e estáveis. Exemplo? Consulte os JGoodies Binding e Validation.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Cadê Meus Plugins?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Com a chegada do NetBeans 6.0, nem estou me dando ao luxo de perguntar "quando vou poder utilizar meus plugins favoritos?", porque é bem provável que nem sejam portados da versão 5.x para a 6.0.&lt;br /&gt;&lt;br /&gt;Dentre estes estão o &lt;a href="http://rfiume.blogspot.com/2007/02/stripwhitespace-module-elimine-espaos.html"&gt;Stripwhitespace&lt;/a&gt; e o &lt;a href="http://rfiume.blogspot.com/2007/05/gerao-de-mtodos-hashcode-equals.html"&gt;NISECommons4E4N&lt;/a&gt;. Como não tenho tempo nem de fechar os olhos e sonhar que vou portá-los eu mesmo, só me resta uma saída: rezar.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Eclipse Europa&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O editor do NetBeans evoluiu, mas ainda não é páreo para o do Eclipse que, com a chegada do Europa 3.3.0, tem até &lt;span style="font-style: italic;"&gt;spell checker&lt;/span&gt;, entre outras cositas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RpdMLrF5qjI/AAAAAAAAApQ/bT2iHBeBB08/s1600-h/Eclipse_Europa_3.3.0_Spell_Checker.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RpdMLrF5qjI/AAAAAAAAApQ/bT2iHBeBB08/s400/Eclipse_Europa_3.3.0_Spell_Checker.png" alt="" id="BLOGGER_PHOTO_ID_5086618067568011826" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-4272548943207906596?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/4272548943207906596/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=4272548943207906596&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4272548943207906596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4272548943207906596'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/07/netbeans-ide-60-gnulinux-ubuntu-gtk.html' title='NetBeans IDE 6.0, GNU/Linux Ubuntu, GTK Look and Feel e Outras...'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KYeHnrXYwPg/RpdD-rF5qiI/AAAAAAAAApI/jsnOebbIFlE/s72-c/NetBeans-6.10-Glossy.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-2300506723217702006</id><published>2007-05-02T14:00:00.000-03:00</published><updated>2007-05-02T14:00:00.591-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Geração de Métodos hashCode, equals, compareTo e toString no NetBeans</title><content type='html'>Algumas coisas pedem por soluções automáticas. Entre os candidatos para a automação estão tarefas repetitivas, com regras e condições bem definidas e sujeitas a erros. Exatamente o caso dos métodos &lt;span style="font-style: italic;"&gt;hashCode&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;equals&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;compateTo&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;toString&lt;/span&gt;&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;Enquanto trabalhava com dúzias de entidades (&lt;a href="http://rfiume.blogspot.com/search/label/JPA%20-%20Java%20Persistence%20API"&gt;JPA entity beans&lt;/a&gt;), a necessidade de geração automática para os método citados ficou ainda mais evidente, por isso comecei a procurar na Net por plugins para esse fim. E achei (&lt;span style="font-style: italic;"&gt;thank god&lt;/span&gt;!) o &lt;span id="ctl00_MainContentPlaceholder_ctl00_ctl00_lblEntry"&gt;&lt;a href="http://www.javaworld.com.tw/roller/page/koji?entry=2006_3_12_NISECommons4E4N_1.0"&gt;NISECommons4E4N&lt;/a&gt;&lt;/span&gt;. Para utilizá-lo, baixe o &lt;a href="http://www.javaworld.com.tw/jute/upload/org-koji-nisecommons4e4n.nbm"&gt;arquivo .nbm&lt;/a&gt; e instale o plugin no NetBeans. Se precisar de ajuda, veja &lt;a href="http://rfiume.blogspot.com/2007/01/nota-nbextrasorg.html"&gt;Nota - nbextras.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-style: italic;"&gt;Contato&lt;/span&gt; será utilizada como exemplo para a geração automática dos métodos &lt;span style="font-style: italic;"&gt;equals&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;hashCode&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;toString&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;compareTo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Entity&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class Contato implements Serializable {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Id private Long id;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private String email;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private String nomePrimeiro;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private String nomeUltimo;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private String celular;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public Contato() {&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;. . .&lt;/span&gt; &lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Acessores e modificadores omitidos por brevidade.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(204, 102, 0);"&gt;equals(Object other)&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt; e &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(204, 102, 0);"&gt;hashCode()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No código fonte, selecione &lt;span style="font-style: italic;"&gt;NISECommons4E4N Lang&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Generate Equals and HashCode...&lt;/span&gt; Selecione os campos que devem fazer parte dos métodos &lt;span style="font-style: italic;"&gt;equals()&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;hashCode()&lt;/span&gt;, o ponto de inserção para esses métodos - primeiro método na classe, último método, etc. - e demais opções.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rjisp1m6xmI/AAAAAAAAAnU/fLH1zHEYpmc/s1600-h/NISE_equal_and_hashcode.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rjisp1m6xmI/AAAAAAAAAnU/fLH1zHEYpmc/s400/NISE_equal_and_hashcode.png" alt="" id="BLOGGER_PHOTO_ID_5059984016115680866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Os métodos &lt;span style="font-style: italic;"&gt;equals()&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;hashCode()&lt;/span&gt; resultantes para a entidade &lt;span style="font-style: italic;"&gt;Contato&lt;/span&gt; serão como abaixo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class Contato implements Serializable {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public boolean equals(final Object other) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if (this == other)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return true;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if (!(other instanceof Contato))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return false;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Contato castOther = (Contato) other;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return new EqualsBuilder()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(id, castOther.id)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(email, castOther.email)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(nomePrimeiro, castOther.nomePrimeiro)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(nomeUltimo, castOther.nomeUltimo)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(celular, castOther.celular)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.isEquals();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public int hashCode() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return new HashCodeBuilder()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(id)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(email)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(nomePrimeiro)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(nomeUltimo)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(celular)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.toHashCode();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="font-style: italic;"&gt;toString()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No código fonte, selecione &lt;span style="font-style: italic;"&gt;NISECommons4E4N Lang&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Generate ToString Method...&lt;/span&gt; Selecione os campos que devem fazer parte do método &lt;span style="font-style: italic;"&gt;toString()&lt;/span&gt;, seu ponto de inserção e outras opções.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RjiskVm6xlI/AAAAAAAAAnM/fuWExhOIxO4/s1600-h/NISE_toString.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RjiskVm6xlI/AAAAAAAAAnM/fuWExhOIxO4/s320/NISE_toString.png" alt="" id="BLOGGER_PHOTO_ID_5059983921626400338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Segue a implementação de &lt;span style="font-style: italic;"&gt;toString()&lt;/span&gt; para &lt;span style="font-style: italic;"&gt;Contato&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Entity &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class Contato implements Serializable {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="font-weight: bold;"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public String toString() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append("id", id)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append("email", email)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append("nomePrimeiro", nomePrimeiro)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append("nomeUltimo", nomeUltimo)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append("celular", celular)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.toString();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="font-style: italic;"&gt;compareTo(Object other)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Selecione &lt;span style="font-style: italic;"&gt;NISECommons4E4N Lang&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Generate CompareTo Method...&lt;/span&gt; Selecione os campos que devem fazer parte do método &lt;span style="font-style: italic;"&gt;compareTo()&lt;/span&gt;, o ponto de inserção e demais opções.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RjisV1m6xjI/AAAAAAAAAm8/2zT417q60RE/s1600-h/NISE_compareTo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RjisV1m6xjI/AAAAAAAAAm8/2zT417q60RE/s320/NISE_compareTo.png" alt="" id="BLOGGER_PHOTO_ID_5059983672518297138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O resultado será:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class Contato implements Serializable, &lt;span style="font-weight: bold;"&gt;Comparable&amp;lt;Contato&amp;gt;&lt;/span&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public int compareTo(final Contato other) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return new CompareToBuilder()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;....................&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(id, other.id)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;....................&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(email, other.email)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;....................&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(nomePrimeiro, other.nomePrimeiro)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;....................&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(nomeUltimo, other.nomeUltimo)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;....................&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.append(celular, other.celular)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;....................&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.toComparison();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;..........&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Mas Afinal do que se &lt;span&gt;Trata &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;EqualsBuilder&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;HashCodeBuilder&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;ToStringBuilder&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;CompareToBuilder &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;São classes da biblioteca &lt;a href="http://jakarta.apache.org/commons/lang/index.html"&gt;Commons Lang&lt;/a&gt; do &lt;a href="http://jakarta.apache.org/"&gt;Projeto Jakarta&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A premissa do Commons Lang é que &lt;span class="fullpost"&gt;a &lt;a href="http://java.sun.com/javase/6/docs/api/"&gt;Java API&lt;/a&gt; (biblioteca de classes presentes em todos os ambientes de produção Java) tem uma lacuna de métodos para manipulação de suas &lt;/span&gt;&lt;span class="fullpost"&gt;principais &lt;/span&gt;&lt;span class="fullpost"&gt;classes. De acordo com o sítio do projeto:&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt; The &lt;em&gt;Lang&lt;/em&gt; Component provides a host of helper utilities for the java.lang API, notably String manipulation methods, basic numerical methods, object reflection, creation and serialization, and System properties. Additionally it contains an inheritable enum type, an exception structure that supports multiple types of nested-Exceptions, basic enhancements to java.util.Date and a series of utlities dedicated to help with building methods, such as hashCode, toString and equals.&lt;/blockquote&gt;O fato do plugin NISECommons4E4N se apoiar na Commons Lang pode ser uma desvantagem quando existir o objetivo de evitar ao máximo bibliotecas de terceiros.&lt;br /&gt;&lt;br /&gt;Mas a Commons Lang é uma ótima pedida e uma excelente biblioteca. No geral, sobrescrever métodos da classe &lt;span style="font-style: italic;"&gt;Object&lt;/span&gt; pode ocasionar muitos &lt;span style="font-style: italic;"&gt;bugs&lt;/span&gt;, a maioria de difícil detecção (vejam o artigo &lt;a href="http://www.javaworld.com/javaworld/jw-01-1999/jw-01-object_p.html"&gt;How to avoid traps and correctly override methods from java.lang.Object&lt;/a&gt;). A classe &lt;a href="http://jakarta.apache.org/commons/lang/api/org/apache/commons/lang/builder/EqualsBuilder.html"&gt;EqualsBuilder&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/a&gt;, por exemplo, segue as regras do &lt;a href="http://java.sun.com/docs/books/effective/index.html"&gt;Effective Java&lt;/a&gt;  , de Joshua Bloch.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja Também:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/adicionando-uma-biblioteca-ao-classpath.html"&gt;Adicionando uma Biblioteca ao Classpath do Aplicativo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/stripwhitespace-module-elimine-espaos.html"&gt;Stripwhitespace Module - Elimine Espaços Desnecessários no Seu Código-Fonte&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/findbugs-in-action.html"&gt;FindBugs in Action&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2006/12/pmd-in-action.html"&gt;PMD in Action&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/search/label/JPA%20-%20Java%20Persistence%20API"&gt;JPA - Java Persistence API&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fontes Utilizadas:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://softwaredevscott.spaces.live.com/blog/cns%211A9E939F7373F3B7%21158.entry"&gt;equals() and hashCode() Generation Plugins for Eclipse&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javaworld.com.tw/roller/page/koji?entry=2006_3_12_NISECommons4E4N_1.0"&gt;A little Java User&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jakarta.apache.org/commons/lang/index.html"&gt;CommonsLang&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jakarta.apache.org/commons/lang/api/org/apache/commons/lang/builder/EqualsBuilder.html"&gt; org.apache.commons.lang.builder.EqualsBuilder&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-2300506723217702006?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/2300506723217702006/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=2300506723217702006&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2300506723217702006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2300506723217702006'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/05/gerao-de-mtodos-hashcode-equals.html' title='Geração de Métodos hashCode, equals, compareTo e toString no NetBeans'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KYeHnrXYwPg/Rjisp1m6xmI/AAAAAAAAAnU/fLH1zHEYpmc/s72-c/NISE_equal_and_hashcode.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-7403366206030515518</id><published>2007-02-22T02:56:00.000-02:00</published><updated>2007-03-24T18:02:47.157-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Stripwhitespace Module - Elimine Espaços Desnecessários no Seu Código-Fonte</title><content type='html'>Esse módulo está na categoria &lt;span style="font-style: italic;"&gt;Simples, Porém Útil&lt;/span&gt;. &lt;span style="font-weight: bold;"&gt;Stripwhitespace&lt;/span&gt; destaca todas as tabulações em vermelho e os espaços em branco sobrando num lilás claro&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdWCX2efWqI/AAAAAAAAAZo/3vjXjZn-wJc/s1600-h/stripwhitespace.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdWCX2efWqI/AAAAAAAAAZo/3vjXjZn-wJc/s320/stripwhitespace.png" alt="" id="BLOGGER_PHOTO_ID_5032071504928397986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdWB32efWpI/AAAAAAAAAZg/e4pZevrNL84/s1600-h/stripwhitespace-button.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdWB32efWpI/AAAAAAAAAZg/e4pZevrNL84/s400/stripwhitespace-button.png" alt="" id="BLOGGER_PHOTO_ID_5032070955172584082" border="0" /&gt;&lt;/a&gt;Sua função é eliminar esses espaços. Para isso, apenas clique no botão &lt;span style="font-style: italic;"&gt;Strip Trailing Whitespace&lt;/span&gt; da barra de ferramentas do NetBeans.&lt;br /&gt;&lt;br /&gt;Clique &lt;a href="http://blogs.sun.com/roller/resources/tor/org-netbeans-modules-stripwhitespace.nbm"&gt;aqui&lt;/a&gt; para baixar o arquivo .nbm contendo módulo. Stripwhitespace foi desenvolvido por &lt;a href="http://blogs.sun.com/tor/"&gt;Tor Norbye&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referências:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.nbextras.org/2006/04/29/1146344949612.html"&gt;Tab Highlighter/Fixer Module and Update of stripwhitespace Module&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.sun.com/tor/entry/tabs_are_evil_part_2"&gt;Tabs Are Evil, Part 2: The Remedy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-7403366206030515518?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/7403366206030515518/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=7403366206030515518&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7403366206030515518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7403366206030515518'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/stripwhitespace-module-elimine-espaos.html' title='Stripwhitespace Module - Elimine Espaços Desnecessários no Seu Código-Fonte'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KYeHnrXYwPg/RdWCX2efWqI/AAAAAAAAAZo/3vjXjZn-wJc/s72-c/stripwhitespace.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-6898295574330528038</id><published>2007-02-05T18:58:00.000-02:00</published><updated>2007-03-24T16:44:32.968-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qualidade de Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>FindBugs in Action</title><content type='html'>&lt;a href="http://findbugs.sourceforge.net/"&gt;&lt;/a&gt;O objetivo do &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; é ajudar no desenvolvimento de softwares com menos erros, mais estáveis, seguros e com melhor performance.&lt;br /&gt;&lt;br /&gt;Outro exemplo de ferramenta para o mesmo fim é o &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;. A principal diferença entre o FindBugs e o PMD é que o primeiro inspeciona os &lt;a href="http://pt.wikipedia.org/wiki/Bytecode"&gt;bytecodes&lt;/a&gt;, enquanto o último escaneia e analisa o código-fonte das classes&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;Como inspeciona os &lt;span style="font-style: italic;"&gt;bytecodes&lt;/span&gt;, é capaz de detectar &lt;span style="font-style: italic;"&gt;bugs&lt;/span&gt;, más práticas de programação ou código confuso que seriam difíceis de encontrar escaneando apenas o código-fonte, como &lt;a href="http://en.wikipedia.org/wiki/Circular_dependency"&gt;referência circular&lt;/a&gt; e &lt;a href="http://findbugs.sourceforge.net/bugDescriptions.html#DLS_DEAD_LOCAL_STORE"&gt;&lt;span style="font-style: italic;"&gt;dead store to local variable&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Instalação&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;Para instalar o FindBugs como plugin no NetBeans, configure-o para baixar plugins diretamente do &lt;a href="http://www.nbextras.org/"&gt;nbextras.org&lt;/a&gt;. As instruções para isso estão &lt;a href="http://rfiume.blogspot.com/2007/01/nota-nbextrasorg.html"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Na wizard &lt;span style="font-style: italic;"&gt;Update Center&lt;/span&gt;, procure pelo FindBugs em &lt;span style="font-style: italic;"&gt;NBExtras Update Center&lt;/span&gt; e instale o módulo.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Configuração&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Configure o FindBugs em &lt;span style="font-style: italic;"&gt;Tools&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Options&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Basic Options&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;FindBugs&lt;/span&gt; (ver figura 1).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RaYpI4WuskI/AAAAAAAAAGI/DGPZG5n7dJk/s1600-h/FindBugs_in_Action.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RaYpI4WuskI/AAAAAAAAAGI/DGPZG5n7dJk/s320/FindBugs_in_Action.png" alt="" id="BLOGGER_PHOTO_ID_5018744067294409282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Selecione os detectores de &lt;span style="font-style: italic;"&gt;bugs&lt;/span&gt; que melhor se adequam ao seu projeto. Vale a pena inspecionar todos eles para saber qual a sua utilidade e velocidade de execução.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Run FindBugs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RcVJAoqRPCI/AAAAAAAAAVw/NNCZTuWxnT8/s1600-h/FindBugs.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RcVJAoqRPCI/AAAAAAAAAVw/NNCZTuWxnT8/s400/FindBugs.png" alt="" id="BLOGGER_PHOTO_ID_5027504834292562978" border="0" /&gt;&lt;/a&gt;Selecione o projeto, pacote ou classe do projeto que irá ser analisado - de qualquer forma o FindBugs analisa o projeto inteiro - e clique no ícone do FindBugs.&lt;br /&gt;&lt;br /&gt;De outra forma, na janela &lt;span style="font-style: italic;"&gt;Project&lt;/span&gt; clique com o botão direito do mouse num projeto, pacote ou classe do projeto e selecione &lt;span style="font-style: italic;"&gt;Tools&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Run&lt;/span&gt; &lt;span style="font-style: italic;"&gt;FindBugs&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;O resultado da análise depende da configuração. Todos os &lt;span style="font-style: italic;"&gt;bugs&lt;/span&gt; gerados são mostrados no painel direito. Um sumário sobre a advertência selecionada é mostrado no painel esquerdo  (fig. 2).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RaYo_IWusjI/AAAAAAAAAGA/ZPvaSqBGHAM/s1600-h/Analyzing.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RaYo_IWusjI/AAAAAAAAAGA/ZPvaSqBGHAM/s320/Analyzing.png" alt="" id="BLOGGER_PHOTO_ID_5018743899790684722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para ir direto para a fonte do &lt;span style="font-style: italic;"&gt;bug&lt;/span&gt;, clique duas vezes na linha de advertência (fig. 3).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RaYo0YWusiI/AAAAAAAAAF4/zZpTE2I3Gfw/s1600-h/Improving_the_Source_Code.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RaYo0YWusiI/AAAAAAAAAF4/zZpTE2I3Gfw/s320/Improving_the_Source_Code.png" alt="" id="BLOGGER_PHOTO_ID_5018743715107090978" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Conclusão&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ferramentas como o FindBugs podem fazer diferença significativa para a qualidade do software. Não deixe para usá-lo apenas no fim do projeto. O ideal é realizar a análise seguindo algum critério, que pode ser segundo um intervalo de tempo, ou depois de mudanças significativas no projeto.&lt;br /&gt;&lt;br /&gt;Nem todos os detectores do FindBugs serão de serventia. Escolha conscientemente apenas aqueles que possam realmente ajudar a melhorar a qualidade do software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja também:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2006/12/pmd-in-action.html"&gt;PMD in Action&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://findbugs.sourceforge.net/"&gt;Find Bugs - Project's Home Page&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.netbeans.org/download/magazine/01/nb01_writing_quality.pdf"&gt;NetBeans Magazine - Issue One - May 2006: Writing Quality Code With NetBeans IDE&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www-128.ibm.com/developerworks/java/library/j-findbug1/"&gt;FindBugs, Part 1: Improve the Quality of Your Code&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-6898295574330528038?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/6898295574330528038/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=6898295574330528038&amp;isPopup=true' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6898295574330528038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6898295574330528038'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/findbugs-in-action.html' title='FindBugs in Action'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KYeHnrXYwPg/RaYpI4WuskI/AAAAAAAAAGI/DGPZG5n7dJk/s72-c/FindBugs_in_Action.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-8356459953963797443</id><published>2007-01-31T11:33:00.000-02:00</published><updated>2007-04-01T05:13:47.885-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>SwingX &amp; NetBeans IDE</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rb_v1SW686I/AAAAAAAAAS8/4fJqitjDzyw/s1600-h/palette.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rb_v1SW686I/AAAAAAAAAS8/4fJqitjDzyw/s200/palette.png" alt="" id="BLOGGER_PHOTO_ID_5025999407908844450" border="0" /&gt;&lt;/a&gt;Instale os componentes &lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt; na paleta do Matisse - o construtor de interfaces gráficas do NetBeans - para facilitar o manuseio desses componentes e aumentar a produtividade durante o desenvolvimento de &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI's&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Mãos à Obra&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na janela &lt;span style="font-style: italic;"&gt;Palette&lt;/span&gt;, clique com o botão direito do mouse e selecione &lt;span style="font-style: italic;"&gt;Palette Manager...&lt;/span&gt; .&lt;br /&gt;&lt;br /&gt;No &lt;span style="font-style: italic;"&gt;Palette Manager&lt;/span&gt;, clique em &lt;span style="font-style: italic;"&gt;New Category... .&lt;/span&gt; Digite &lt;span style="font-style: italic;"&gt;SwingX&lt;/span&gt;&lt;span class="fullpost"&gt; em &lt;span style="font-style: italic;"&gt;New Category Name&lt;/span&gt; e clique em &lt;span style="font-style: italic;"&gt;Ok&lt;/span&gt;. Caso ainda não tenha feito, adicione a biblioteca &lt;span&gt;SwingX&lt;/span&gt; ao Gerenciador de Bibliotecas do NetBeans  - veja como &lt;a href="http://rfiume.blogspot.com/2007/01/adicionando-uma-biblioteca-ao-classpath.html"&gt;aqui&lt;/a&gt;. Clique em &lt;span style="font-style: italic;"&gt;Add from Library...&lt;/span&gt; .&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rb_tSiW683I/AAAAAAAAASk/aslptLCoZzY/s1600-h/palette_manager.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rb_tSiW683I/AAAAAAAAASk/aslptLCoZzY/s320/palette_manager.png" alt="" id="BLOGGER_PHOTO_ID_5025996611885134706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Selecione &lt;span style="font-style: italic;"&gt;SwingX&lt;/span&gt; e clique em &lt;span style="font-style: italic;"&gt;Next&lt;/span&gt;. O Gerenciador da Paleta irá procurar por componentes disponíveis. Isto é, irá procurar classes que estejam de acordo com a especificação &lt;a href="http://pt.wikipedia.org/wiki/JavaBeans"&gt;JavaBeans&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rb_taSW684I/AAAAAAAAASs/dpmQQ_z5HdE/s1600-h/palette_manager_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rb_taSW684I/AAAAAAAAASs/dpmQQ_z5HdE/s320/palette_manager_2.png" alt="" id="BLOGGER_PHOTO_ID_5025996745029120898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nem todos os JavaBeans encontrados são úteis na paleta do Matisse. Use os componentes listados na seção &lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Componentes SwingX&lt;/span&gt;&lt;/span&gt;, do artigo &lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt;, como referência inicial sobre quais classes selecionar. Clique em &lt;span style="font-style: italic;"&gt;Next&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rb_t8CW685I/AAAAAAAAAS0/w1BOqp33qdc/s1600-h/palette_manager_3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rb_t8CW685I/AAAAAAAAAS0/w1BOqp33qdc/s320/palette_manager_3.png" alt="" id="BLOGGER_PHOTO_ID_5025997324849705874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Escolha SwingX como categoria da paleta e clique em &lt;span style="font-style: italic;"&gt;Finish&lt;/span&gt;. Está feito!&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Só uma Nota&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se desenvolver componentes, é possível utilizá-los diretamente da janela &lt;span style="font-style: italic;"&gt;Projects&lt;/span&gt; sem a necessidade de empacotá-los e adicioná-los à paleta do Matisse, com o &lt;a href="http://form.netbeans.org/updates/update55.html#dragging"&gt;Update Pack for NetBeans 5.5 GUI Builder (Matisse)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja também:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-8356459953963797443?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/8356459953963797443/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=8356459953963797443&amp;isPopup=true' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8356459953963797443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8356459953963797443'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/01/swingx-netbeans-ide.html' title='SwingX &amp; NetBeans IDE'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KYeHnrXYwPg/Rb_v1SW686I/AAAAAAAAAS8/4fJqitjDzyw/s72-c/palette.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-3249703818668380616</id><published>2007-01-28T03:22:00.000-02:00</published><updated>2007-04-01T02:21:46.819-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Básico'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Adicionando uma Biblioteca ao Classpath do Aplicativo</title><content type='html'>O &lt;span style="font-style: italic;"&gt;classpath&lt;/span&gt; figura entre as dúvidas mais freqüentes dos programadores iniciantes em Java.&lt;br /&gt;&lt;br /&gt;Não foi diferente comigo&lt;span class="fullpost"&gt;. A primeira versão do &lt;a href="http://rfiume.blogspot.com/2007/01/modelmat.html"&gt;ModelMat&lt;/a&gt; - meu primeiro programa em Java, desenvolvido nos laboratórios da faculdade - já contava com a tabela (&lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/components/table.html"&gt;JTable&lt;/a&gt;) para entrada de dados e uma área de texto colorida (&lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/components/editorpane.html"&gt;JTextPane&lt;/a&gt;) para a saída do resultado.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rbs92iW68mI/AAAAAAAAAPg/KlbXfsW1qUY/s1600-h/ModelMat-Alpha.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rbs92iW68mI/AAAAAAAAAPg/KlbXfsW1qUY/s400/ModelMat-Alpha.png" alt="" id="BLOGGER_PHOTO_ID_5024677816407093858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;JTable e JTextPane são classes complexas e me deram muito trabalho para fazer esse aplicativo tomar a forma que havia planejado. Bem, na verdade, nem tão como havia planejado...&lt;br /&gt;&lt;br /&gt;O que faz aquela pomba de duas cabeças numa ferramenta estatística? Tiraram muita onda da minha cara por causa disso. Eu sempre respondia vagamente que era o brasão da minha família, que havia encontrado na Net, sem maiores detalhes.&lt;br /&gt;&lt;br /&gt;Acontece que, no lugar desse brasão (que eu nem sei se é mesmo dos Fiumes), deveria estar um gráfico feito com a &lt;a href="http://pt.wikipedia.org/wiki/API"&gt;API&lt;/a&gt; &lt;a href="http://www.jfree.org/jfreechart"&gt;JFreeChart&lt;/a&gt;, para ajudar o usuário a compreender melhor o resultado de suas análises. Nada a ver com a minha família.&lt;br /&gt;&lt;br /&gt;Apesar de fazer o software funcionar utilizando JTable e JTextPane, eu simplesmente desisti do JFreeChart porque não sabia como ajustar o &lt;span style="font-style: italic;"&gt;classpath&lt;/span&gt; do ModelMat para utilizar essa biblioteca. E não é que eu não tenha tentado. Lembro-me de sair furioso da mesa - acho que eu bati nela também.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;O que é classpath?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No contexto da plataforma Java, é uma variável de ambiente que diz ao compilador e à &lt;a href="http://rfiume.blogspot.com/2007/01/java-virtual-machine-jre-jdk-e-java.html"&gt;JVM&lt;/a&gt; onde encontrar as classes que o software irá utilizar.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Configurando o &lt;span style="font-style: italic;"&gt;Classpath&lt;/span&gt; de um Projeto no NetBeans&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como minha principal ferramenta de desenvolvimento é o NetBeans, é essa &lt;a href="http://pt.wikipedia.org/wiki/Ambiente_de_Desenvolvimento_Integrado"&gt;IDE&lt;/a&gt; que vou utilizar para exemplificar como configurar o &lt;span style="font-style: italic;"&gt;classpath&lt;/span&gt; para usar bibliotecas de terceiros.&lt;br /&gt;&lt;br /&gt;Viva!! Agora posso usar o JFreeChart!&lt;br /&gt;&lt;br /&gt;Na janela &lt;span style="font-style: italic;"&gt;Projects&lt;/span&gt;, localize o projeto em questão - ModelMat, no meu caso - clique com o botão direito do &lt;span&gt;mouse&lt;/span&gt; em &lt;span style="font-style: italic;"&gt;Libraries&lt;/span&gt;. Selecione &lt;span style="font-style: italic;"&gt;Add Library...&lt;/span&gt; no menu contextual.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RbtZniW68qI/AAAAAAAAAQE/4ncHwkFB0aI/s1600-h/projects_view.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RbtZniW68qI/AAAAAAAAAQE/4ncHwkFB0aI/s400/projects_view.png" alt="" id="BLOGGER_PHOTO_ID_5024708345034633890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A janela &lt;span style="font-style: italic;"&gt;Add Library&lt;/span&gt; irá aparecer, no entanto ainda não adicionamos a API ao conjunto de bibliotecas disponíveis no NetBeans. Por isso, clique em &lt;span style="font-style: italic;"&gt;Manage Libraries...&lt;/span&gt; .&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RbtfnCW68sI/AAAAAAAAAQo/xdJAiVKkwRw/s1600-h/add_library.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RbtfnCW68sI/AAAAAAAAAQo/xdJAiVKkwRw/s320/add_library.png" alt="" id="BLOGGER_PHOTO_ID_5024714933514465986" border="0" /&gt;&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;Em &lt;span style="font-style: italic;"&gt;Library Manager&lt;/span&gt;, clique em &lt;span style="font-style: italic;"&gt;New Library...&lt;/span&gt; e defina o nome e o tipo da biblioteca, na caixa de diálogo &lt;span style="font-style: italic;"&gt;New Library&lt;/span&gt; - &lt;span style="font-style: italic;"&gt;JFreeChart &lt;/span&gt;e &lt;span style="font-style: italic;"&gt;Class Libraries&lt;/span&gt; respectivamente, para adicionar a API JFreeChart.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RbtZViW68oI/AAAAAAAAAP0/Xjctkx0hnK0/s1600-h/library_manager.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RbtZViW68oI/AAAAAAAAAP0/Xjctkx0hnK0/s400/library_manager.png" alt="" id="BLOGGER_PHOTO_ID_5024708035796988546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;De volta à &lt;span style="font-style: italic;"&gt;Library Manager&lt;/span&gt;, selecione a biblioteca que acabou de adicionar, clique em &lt;span style="font-style: italic;"&gt;Add JAR/Folder...&lt;/span&gt; e navegue até o diretório onde a API está localizada.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RbtZfSW68pI/AAAAAAAAAP8/ptwsZKaeE6c/s1600-h/library_manager_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RbtZfSW68pI/AAAAAAAAAP8/ptwsZKaeE6c/s400/library_manager_2.png" alt="" id="BLOGGER_PHOTO_ID_5024708203300713106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Faça o mesmo nas abas &lt;span style="font-style: italic;"&gt;Sources&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;Javadoc&lt;/span&gt;, indicando o caminho para o diretório com o código-fonte da biblioteca no primeiro caso, e da documentação, no segundo. Nem sempre, a API inclui seu código-fonte e documentação. Nesse caso, não há problemas - o importante mesmo é o &lt;span style="font-style: italic;"&gt;classpath&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Clique em &lt;span style="font-style: italic;"&gt;Ok&lt;/span&gt; para voltar à caixa de diálogo &lt;span style="font-style: italic;"&gt;Add Library&lt;/span&gt;, selecione a biblioteca e clique em &lt;span style="font-style: italic;"&gt;Add Library&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pronto! Note que meu projeto também conta com outras bibliotecas, como &lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt; e JCommon.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RbtZvCW68rI/AAAAAAAAAQM/c9GC2o4av10/s1600-h/projects_view_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RbtZvCW68rI/AAAAAAAAAQM/c9GC2o4av10/s400/projects_view_2.png" alt="" id="BLOGGER_PHOTO_ID_5024708473883652786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Final Feliz!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O ModelMat mostra o gráfico da regressão linear de 2° grau. Na figura abaixo, utiliza o &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; &lt;a href="http://rfiume.blogspot.com/2007/03/synthetica.html"&gt;Synthetica&lt;/a&gt; Blue Moon.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rg8-uHRnLEI/AAAAAAAAAk8/tMwjmgKf_dc/s1600-h/ModelMat-0.3-BlueMoon.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rg8-uHRnLEI/AAAAAAAAAk8/tMwjmgKf_dc/s400/ModelMat-0.3-BlueMoon.png" alt="" id="BLOGGER_PHOTO_ID_5048322669253438530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Leitura Recomendada:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/java-virtual-machine-jre-jdk-e-java.html"&gt;Java Virtual Machine, JRE, JDK e Java Platform - Qual a Diferença?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/search/label/Look%20and%20Feel"&gt;Look and Feel (JGoodies, Napkin, Substance, Synthetica, Nimbus e outros)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/splash-screen.html"&gt;Adicionando Splash Screen ao seu Aplicativo&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.guj.com.br/java.tutorial.artigo.108.1.guj"&gt;Classpath - Entendendo o que é e para que serve&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-3249703818668380616?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/3249703818668380616/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=3249703818668380616&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3249703818668380616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3249703818668380616'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/01/adicionando-uma-biblioteca-ao-classpath.html' title='Adicionando uma Biblioteca ao Classpath do Aplicativo'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KYeHnrXYwPg/Rbs92iW68mI/AAAAAAAAAPg/KlbXfsW1qUY/s72-c/ModelMat-Alpha.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-1402482001993971041</id><published>2007-01-11T05:37:00.000-02:00</published><updated>2007-03-24T18:04:08.951-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Nota - nbextras.org</title><content type='html'>&lt;a href="http://www.nbextras.org/"&gt;nbextras.org&lt;/a&gt; é um Update Center não-oficial para a IDE Netbeans, contendo uma série de módulos úteis, geralmente específicos para um certo nicho de usuários, às vezes não extensamente testados, com pouca documentação e até com requisitos (features) incompletos.&lt;br /&gt;&lt;br /&gt;Basicamente, cinco passos são necessários para configurar o Update Center do NetBeans para baixar e instalar plugins a partir do nbextras.org&lt;span class="fullpost"&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;baixe o módulo &lt;a href="http://updatecenter.nbextras.org/5.0/org-netbeans-modules-nbextras-updatecenter.nbm"&gt;NBM para NetBeans 5.0&lt;/a&gt;, ou &lt;a href="http://updatecenter.nbextras.org/5.5/org-netbeans-modules-nbextras-updatecenter55.nbm"&gt;NBM para NetBeans 5.5&lt;/a&gt;, e salve-o em seu computador;&lt;/li&gt;&lt;li&gt;vá para &lt;span style="font-style: italic;"&gt;Tools&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Update Center&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;no &lt;span style="font-style: italic;"&gt;Update Center&lt;/span&gt; wizard, selecione &lt;span style="font-style: italic;"&gt;Install Manually Downloaded Modules (.nbm files)&lt;/span&gt; e clique em &lt;span style="font-style: italic;"&gt;Next&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;Clique em &lt;span style="font-style: italic;"&gt;Add&lt;/span&gt; e selecione o arquivo .nbm que você obteve no primeiro passo;&lt;/li&gt;&lt;li&gt;Clique no &lt;span style="font-style: italic;"&gt;checkbox&lt;/span&gt; perto do nome do módulo e inicie a instalação.&lt;/li&gt;&lt;/ol&gt;Caso prefira, veja instruções sobre como configurar o NetBeans para obter módulos do nbextras.org diretamente da &lt;a href="http://www.nbextras.org/pages/howto-use.html"&gt;fonte&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-1402482001993971041?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/1402482001993971041/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=1402482001993971041&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/1402482001993971041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/1402482001993971041'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/01/nota-nbextrasorg.html' title='Nota - nbextras.org'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-590282422343485253</id><published>2006-12-29T16:25:00.000-02:00</published><updated>2007-03-24T16:54:48.747-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qualidade de Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>NetBeans, Matisse e Web Services 2 - Refinamento</title><content type='html'>O cliente rico de web service que fizemos em &lt;a href="http://rfiume.blogspot.com/2006/12/netbeans-matisse-e-web-services.html"&gt;Netbeans, Matisse e Web Services&lt;/a&gt; funciona, mas ainda pode ser refinado.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;GUI (Graphical User Interface)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNcyz6KaI/AAAAAAAAADQ/e10KLlgBoIc/s1600-h/IPWSClient.png"&gt;interface gráfica atual&lt;/a&gt; é pouco interessante. Se usarmos um look&lt;span style="font-style: italic;"&gt; &lt;/span&gt;and&lt;span style="font-style: italic;"&gt; &lt;/span&gt;feel mais sofisticado, ao invés do padrão Metal, teremos uma GUI bem mais interessante&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;Certifique-se de ter o &lt;a href="http://www.jgoodies.com/downloads/libraries.html"&gt;JGoodies Looks&lt;/a&gt; no classpath do programa e modifique o método &lt;span style="font-style: italic;"&gt;Main&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public static void main(String args[]) {&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;br /&gt;.....&lt;/span&gt;java.awt.EventQueue.invokeLater(new Runnable() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.........&lt;/span&gt;public void run() {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;..............&lt;/span&gt;try {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;...................&lt;/span&gt;UIManager.setLookAndFeel(new Plastic3DLookAndFeel());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;..............&lt;/span&gt;} catch (UnsupportedLookAndFeelException ex) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;...................&lt;/span&gt;ex.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;..............&lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;..............&lt;/span&gt;new MainGUI().setVisible(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;..........&lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;});&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Exceptions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O que acontece se o IP que o usuário tentar procurar for inválido? E se não houver conexão com a Internet?&lt;br /&gt;&lt;br /&gt;É exatamente para isso que serve o tratamento de excessões - prever potenciais problemas que possam ocorrer e prover o software com a capacidade de lidar com eles da melhor forma possível.&lt;br /&gt;&lt;br /&gt;No método &lt;a href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNlyz6KbI/AAAAAAAAADY/aB1s8UrFP4Y/s1600-h/call_web_service_operation.png"&gt;&lt;span style="font-style: italic;"&gt;serchIP&lt;/span&gt;&lt;/a&gt; há três blocos &lt;span style="font-style: italic;"&gt;catch&lt;/span&gt; vazios. Isso é considerado como um &lt;a href="http://en.wikipedia.org/wiki/Anti-pattern"&gt;anti-pattern&lt;/a&gt;. No lugar de &lt;span style="font-style: italic; color: rgb(153, 153, 153);"&gt;//TODO handle ServiceException&lt;/span&gt;, adicione:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JOptionPane.showMessageDialog(&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.................................&lt;/span&gt;null,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.................................&lt;/span&gt;ex.getMessage(),&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.................................&lt;/span&gt;"Error",&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.................................&lt;/span&gt; JOptionPane.ERROR_MESSAGE);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Adicione esse mesmo código nos blocos &lt;span style="font-style: italic;"&gt;catch&lt;/span&gt; para &lt;span style="font-style: italic;"&gt;ServiceException&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;Exception&lt;/span&gt;. Agora, caso aconteça uma excessão, o aplicativo avisa ao usuário sobre o erro ocorrido de forma amigável, ao invés de simplesmente travar.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;PMD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por que não usar o PMD para refinar o software? É útil usá-lo em programas experimentais ou pequenos para afinar o programador com essa ferramenta.&lt;br /&gt;&lt;br /&gt;As linhas amarelas presentes no método &lt;a href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNlyz6KbI/AAAAAAAAADY/aB1s8UrFP4Y/s1600-h/call_web_service_operation.png"&gt;&lt;span style="font-style: italic;"&gt;searchIP&lt;/span&gt;&lt;/a&gt; são devidas ao não-cumprimento de quatro regras: &lt;span style="font-style: italic;"&gt;CallSuperInConstructor&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;ConstructorCallsOverridableMethod&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;MethodArgumentCouldBeFinal&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;LocalVariableCouldBeFinal&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A decisão final, no entanto, é do programador. É possível que, após uma avaliação, escolha-se ignorar certas advertências. Nesse caso, optei por ignorar &lt;span style="font-style: italic;"&gt;ConstructorCallsOverridableMethod&lt;/span&gt;. Para isso, é só usar a annotation&lt;span style="color: rgb(0, 0, 153);"&gt; @SuppressWarnings("ConstructorCallsOverridableMethod")&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Se perceber que está utilizando constantemente &lt;span style="font-style: italic;"&gt;@SuppressWarnings&lt;/span&gt; para uma certa regra, considere retirar a regra do conjunto (&lt;a href="http://pmd.sourceforge.net/rules/index.html"&gt;Rulesets&lt;/a&gt;), na &lt;a href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RZVGGiz6KeI/AAAAAAAAAD8/hyiQQJO36D8/s1600-h/rule_editor.png"&gt;configuração&lt;/a&gt; do PMD. Caso precise, veja como configurar o Rulesets do PMD &lt;a href="http://rfiume.blogspot.com/2006/12/pmd-in-action.html"&gt;aqui&lt;/a&gt;, na secção Configuração.&lt;br /&gt;&lt;br /&gt;Adeus linhas amarelas! Bem-vindo software de qualidade!&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;O Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Importe &lt;span&gt;as classes necessárias&lt;/span&gt; (Alt+Shif-F), rode o software e veja a diferença na interface gráfica (figura 1, abaixo).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RZZ9Wyz6KhI/AAAAAAAAAEg/nx633NTnGbo/s1600-h/IPWSClient_with_JGoodies.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RZZ9Wyz6KhI/AAAAAAAAAEg/nx633NTnGbo/s200/IPWSClient_with_JGoodies.png" alt="" id="BLOGGER_PHOTO_ID_5014333065673714194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Quando algum imprevisto ocorre - por exemplo, um usuário tentando procurar um IP com valores inválidos, na fig. 2 - o aplicativo sabe como lidar com essa excessão, informando ao usuário sobre o que ocorreu e recuperando-se desse erro.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RZaGWSz6KiI/AAAAAAAAAEw/WKkxlGtPTwM/s1600-h/the_result.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RZaGWSz6KiI/AAAAAAAAAEw/WKkxlGtPTwM/s320/the_result.png" alt="" id="BLOGGER_PHOTO_ID_5014342952688429602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;T +!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-590282422343485253?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/590282422343485253/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=590282422343485253&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/590282422343485253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/590282422343485253'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2006/12/netbeans-matisse-e-web-services-2.html' title='NetBeans, Matisse e Web Services 2 - Refinamento'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-8937905033978537297</id><published>2006-12-29T15:37:00.000-02:00</published><updated>2007-03-24T18:06:11.957-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Project Groups</title><content type='html'>&lt;a href="http://rfiume.blogspot.com/2006/12/netbeans-matisse-e-web-services.html"&gt;Ainda em Netbeans, Matisse e Web Services&lt;/a&gt;, perceba a &lt;span style="font-weight: bold;"&gt;janela &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Groups&lt;/span&gt; na &lt;a href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNyyz6KcI/AAAAAAAAADg/CDGMCPV14Is/s1600-h/web_service_gui.png"&gt;imagem&lt;/a&gt; que mostra a construção da GUI através da &lt;a href="http://www.netbeans.org/kb/articles/matisse.html"&gt;Matisse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Essa janela, como sugere o nome, pode agrupar vários projetos de alguma forma relacionados&lt;span class="fullpost"&gt;, sendo uma alternativa mais viável e mais inteligente que a velha janela &lt;span style="font-style: italic;"&gt;Projects&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Project Groups fará parte do NetBeans 6.0 e está disponível como plugin para o Netbeans 5.0 ou 5.5 - pode ser instalada a partir do &lt;a href="http://www.nbextras.org/"&gt;nbextras&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para instruções sobre como registrar nbextras no Update Center do NetBeans, veja essa &lt;a href="http://rfiume.blogspot.com/2007/01/nota-nbextrasorg.html"&gt;nota&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-8937905033978537297?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/8937905033978537297/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=8937905033978537297&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8937905033978537297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8937905033978537297'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2006/12/project-groups.html' title='Project Groups'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-730874673939991982</id><published>2006-12-29T11:59:00.000-02:00</published><updated>2007-03-24T16:49:32.821-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qualidade de Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>PMD in Action</title><content type='html'>Em &lt;a href="http://rfiume.blogspot.com/2006/12/netbeans-matisse-e-web-services.html"&gt;NetBeans, Matisse e Web Services&lt;/a&gt; talvez você tenha percebido estranhas linhas amarelas no &lt;a href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNlyz6KbI/AAAAAAAAADY/aB1s8UrFP4Y/s1600-h/call_web_service_operation.png"&gt;código-fonte&lt;/a&gt; do método &lt;span style="font-style: italic;"&gt;searchIP&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Tratá-se do &lt;span style="font-weight: bold;"&gt;PMD em ação&lt;/span&gt;. &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt; é mais uma das ferramentas utilizadas para ajudar programadores a tornarem o código-fonte de seus softwares mais seguros, eficientes e livre de erros&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;Outras ferramentas utilizadas para o mesmo fim são FindBugs e Jackpot.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Instalação&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Embora seja possível utilizar o PMD &lt;span style="font-style: italic;"&gt;stand-alone&lt;/span&gt;, é mais interessante fazê-lo como plugin de sua IDE favorita. Para tê-lo como plugin no NetBeans, configure-o para poder baixar plugins diretamente do site &lt;a href="http://www.nbextras.org/"&gt;nbextras.org&lt;/a&gt;. As instruções estão &lt;a href="http://rfiume.blogspot.com/2007/01/nota-nbextrasorg.html"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Na wizard &lt;span style="font-style: italic;"&gt;Update Center&lt;/span&gt;, procure pelo PMD em &lt;span style="font-style: italic;"&gt;NBExtras Update Center&lt;/span&gt; e instale o módulo.&lt;br /&gt;&lt;br /&gt;Também é possível instalar a partir de um arquivo .nbm contendo apenas o módulo PMD. Se optar por instalar dessa forma, veja como &lt;a href="http://pmd.sourceforge.net/integrations.html#netbeans"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Configuração&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Configure o PMD em Tools -&gt; Options -&gt; Basic Options -&gt; Miscellaneous -&gt; PMD. (Veja figura 1.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RZVGOCz6KfI/AAAAAAAAAEE/SQCvahM4nk0/s1600-h/pmd_options.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RZVGOCz6KfI/AAAAAAAAAEE/SQCvahM4nk0/s320/pmd_options.png" alt="" id="BLOGGER_PHOTO_ID_5013990967233620466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Se quiser analisar o código ao mesmo tempo em que programa (foi o que eu fiz em &lt;a href="http://rfiume.blogspot.com/2006/12/netbeans-matisse-e-web-services.html"&gt;NetBeans, Matisse e Web Services&lt;/a&gt;), clique na caixa &lt;span style="font-style: italic;"&gt;Enable scan&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Há uma série de regras (rules) que o PMD usa para decidir o que deve relatar como advertência e quais sugestões apontar. Não é um bom negócio deixar todas as regras ativas - linhas amarelas apareceriam por todo o código-fonte, sendo algumas de importância mínima ou relativa, desviando o foco do que realmente tem impacto na qualidade do software.&lt;br /&gt;&lt;br /&gt;Por exemplo, no &lt;a href="http://pmd.sourceforge.net/rules/controversial.html"&gt;conjunto de regras controversas&lt;/a&gt; há regras polêmicas, onde não existe consenso entre programadores, como &lt;span style="font-style: italic;"&gt;OnlyOneReturnPoint&lt;/span&gt; - a regra Highlander, pois &lt;span style="font-style: italic;"&gt;só pode haver um&lt;/span&gt; (ponto de retorno num método). Talvez você não concorde com essa regra e queira usar múltiplos pontos de retorno dentro de um método.&lt;br /&gt;&lt;br /&gt;Clique em &lt;span style="font-style: italic;"&gt;Manage rules...&lt;/span&gt; para configurar o conjunto de regras que o PMD levará em considereção enquanto escaneia o código-fonte de seu programa.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RZVGGiz6KeI/AAAAAAAAAD8/hyiQQJO36D8/s1600-h/rule_editor.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RZVGGiz6KeI/AAAAAAAAAD8/hyiQQJO36D8/s320/rule_editor.png" alt="" id="BLOGGER_PHOTO_ID_5013990838384601570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Run PMD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Outra forma de escanear o código-fonte, é clicar com o botão direito do mouse no projeto, package ou arquivo na janela &lt;span style="font-style: italic;"&gt;Project&lt;/span&gt;, e selecionar &lt;span style="font-style: italic;"&gt;Tools&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Run PMD&lt;/span&gt;. Na janela &lt;span style="font-style: italic;"&gt;Output&lt;/span&gt;, aparecerá a aba &lt;span style="font-style: italic;"&gt;PMD Output&lt;/span&gt; com o relatório gerado pelo PMD. Cada linha é um link para o ponto onde há uma advertência - linha amarela.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RZVF-Sz6KdI/AAAAAAAAAD0/aZ-Dp1qpDLE/s1600-h/tools_run_pmd.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RZVF-Sz6KdI/AAAAAAAAAD0/aZ-Dp1qpDLE/s320/tools_run_pmd.png" alt="" id="BLOGGER_PHOTO_ID_5013990696650680786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Rules - Sugestões&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;As regras&lt;/span&gt;&lt;span style="font-style: italic;"&gt; CloseResource&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;CompareObjectsWithEquals&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;ConstructorCallsOverridableMethod&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;FinalFieldCouldBeStatic&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;UnusedImports&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;são fortemente recomendáveis.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ImmutableField&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;LocalVariableCouldBeFinal&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;MethodArgumentCouldBeFinal &lt;/span&gt;&lt;a href="http://rfiume.blogspot.com/2006/12/final-final-final-final-final_09.html"&gt;marcam presença&lt;/a&gt;. Ajudam a distinguir campos (fields) de variáveis (variables) tornando o código mais legível para quem o lê e também mais seguro, pois fica garantido que um campo não tenha seu valor alterado.&lt;br /&gt;&lt;br /&gt;Essa garantia, no entanto, é parcial. Objetos qualificados com &lt;span style="font-style: italic;"&gt;final&lt;/span&gt; têm apenas as  referências que lhe são atribuídas como final (constantes), e não o seu valor.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-730874673939991982?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/730874673939991982/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=730874673939991982&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/730874673939991982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/730874673939991982'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2006/12/pmd-in-action.html' title='PMD in Action'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-7366554894812052130</id><published>2006-12-29T04:48:00.000-02:00</published><updated>2007-03-24T18:29:58.310-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>NetBeans, Matisse e Web Services</title><content type='html'>É simples criar um cliente rico para web services com o NetBeans.&lt;br /&gt;&lt;br /&gt;Os pré-requisitos para reescrever e executar no seu computador o aplicativo desenvolvido nesse post são: NetBeans 5.0 ou 5.5, conhecimentos básicos sobre essa IDE (&lt;a href="http://www.netbeans.org/kb/trails/java-se.html"&gt;set-up projects&lt;/a&gt;, &lt;a href="http://www.netbeans.org/kb/trails/matisse.html"&gt;Matisse&lt;/a&gt;) e Java básico.&lt;br /&gt;&lt;br /&gt;Esse pequeno programa consulta detalhes de um endereço IP, como sua localização, ISO code, entre outros dados, via wsdl&lt;span class="fullpost"&gt;: &lt;a href="http://webservices.tekever.eu/ip2pais/?wsdl"&gt;http://webservices.tekever.eu/ip2pais/?wsdl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;WSDL Client&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Crie um novo projeto (&lt;span style="font-style: italic;"&gt;General&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Java Application&lt;/span&gt;), com o nome IPWSClient e a localização que melhor lhe convir. Certifique-se que a caixa &lt;span style="font-style: italic;"&gt;Create Main Class&lt;/span&gt; esteja desmarcada.&lt;br /&gt;&lt;br /&gt;Crie um novo cliente de &lt;span&gt;web service&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;New&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;File/Folder...&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Web Services&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Web Service Client&lt;/span&gt;). Clique em &lt;span style="font-style: italic;"&gt;Next&lt;/span&gt;. Clique em &lt;span style="font-style: italic;"&gt;WSDL URL&lt;/span&gt; e preencha nesse campo o endereço &lt;a href="http://webservices.tekever.eu/ip2pais/?wsdl"&gt;&lt;span style="font-style: italic;"&gt;http://webservices.tekever.eu/ip2pais/?wsdl&lt;/span&gt;&lt;/a&gt;. No campo &lt;span style="font-style: italic;"&gt;Package&lt;/span&gt;, digite &lt;span style="font-style: italic;"&gt;org.wonderland.cws&lt;/span&gt;. Em &lt;span style="font-style: italic;"&gt;Jax Version&lt;/span&gt;, selecione &lt;span style="font-style: italic;"&gt;JAX-RPC&lt;/span&gt;. Clique em &lt;span style="font-style: italic;"&gt;Finish&lt;/span&gt;..&lt;br /&gt;&lt;br /&gt;A estrutura necessária para acessar o web service foi gerada pela IDE. Ainda bem, pois esse é um trabalho maçante e propenso a erros. &lt;span style="color: rgb(153, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;GUI (Graphical User Interface)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crie um novo JFrame &lt;span style="font-style: italic;"&gt;(New&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;File/Folder...&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Java GUI Forms&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;JFrame Form&lt;/span&gt;). Em &lt;span style="font-style: italic;"&gt;Class name&lt;/span&gt; digite &lt;span style="font-style: italic;"&gt;MainGui&lt;/span&gt;; em &lt;span style="font-style: italic;"&gt;Package&lt;/span&gt; digite &lt;span style="font-style: italic;"&gt;org.wonderland.gui&lt;/span&gt;. Clique em &lt;span style="font-style: italic;"&gt;Finish&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Use o Matisse para produzir uma interface gráfica parecida com a da figura 1, logo abaixo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNyyz6KcI/AAAAAAAAADg/CDGMCPV14Is/s1600-h/web_service_gui.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNyyz6KcI/AAAAAAAAADg/CDGMCPV14Is/s320/web_service_gui.png" alt="" id="BLOGGER_PHOTO_ID_5013928926431029698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Segue a lista de componentes que compõem essa gui, com suas respectivas propriedades:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JLabel (text = "IP Adress: ");&lt;/li&gt;&lt;li&gt;JTextField (variable name = "tfIP");&lt;/li&gt;&lt;li&gt;JButton (variable name = "bSearch", text = "Search");&lt;/li&gt;&lt;li&gt;JProgressBar (variable name = "pProgress");&lt;/li&gt;&lt;li&gt;JLabel (text = "Search Result: ");&lt;/li&gt;&lt;li&gt;JScrollPane;&lt;/li&gt;&lt;li&gt;JTextArea(variable name = "taIPResult"; editable = false; lineWrap = true; wrapStyleWord = true);&lt;/li&gt;&lt;/ul&gt;Note que só as propriedades com valores diferentes do padrão estão listadas acima.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;So, Call a Web Service Operation!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vá para &lt;span style="font-style: italic;"&gt;Source View&lt;/span&gt; e defina um método chamado &lt;span style="font-style: italic;"&gt;searchIP&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private void searchIP(final String ip) {   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dentro do método &lt;span style="font-style: italic;"&gt;searchIP&lt;/span&gt; clique com o botão direito do mouse, selecione &lt;span style="font-style: italic;"&gt;Web Service Client Resources&lt;/span&gt; - &gt; &lt;span style="font-style: italic;"&gt;Call Web Operation&lt;/span&gt;. Selecione &lt;span style="font-style: italic;"&gt;IP2Pais&lt;/span&gt;. O Netbeans irá gerar o código necessário para chamar &lt;span style="font-style: italic;"&gt;IP2Pais&lt;/span&gt; via &lt;span style="font-style: italic;"&gt;web service&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Substitua&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;conversaodeIPparaPaisPort.IP2Pais(/* TODO enter operation arguments*/);&lt;/span&gt;&lt;br /&gt;por&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Paisdados paisdados = conversaodeIPparaPaisPort.IP2Pais(ip);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É interessante usar o método &lt;span style="font-style: italic;"&gt;InvokeLater&lt;/span&gt; da classe &lt;span style="font-style: italic;"&gt;SwingUtilities&lt;/span&gt; pra melhorar o tempo de resposta da GUI. A implementação completa do método &lt;span style="font-style: italic;"&gt;searchIP&lt;/span&gt; está disponível na figura 2 (abaixo).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNlyz6KbI/AAAAAAAAADY/aB1s8UrFP4Y/s1600-h/call_web_service_operation.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNlyz6KbI/AAAAAAAAADY/aB1s8UrFP4Y/s400/call_web_service_operation.png" alt="" id="BLOGGER_PHOTO_ID_5013928703092730290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Quando a gui disparar um evento (um clique no botão Search, por exemplo), será &lt;span style="font-style: italic;"&gt;callServiceSearchIp&lt;/span&gt; quem será chamado:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void callServiceSearchIP(String ip) {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;bSearch.setEnabled(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;pProgress.setStringPainted(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;pProgress.setString(""Searching for ip address " + ip);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;pProgress.setIndeterminate(true);&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;searchIP(ip);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;Quase lá... Volte para o &lt;span style="font-style: italic;"&gt;Design View&lt;/span&gt;, clique com o botão direito do mouse em &lt;span style="font-style: italic;"&gt;bSearch&lt;/span&gt; (JButton), selecione &lt;span style="font-style: italic;"&gt;Events&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Action&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;actionPerformed&lt;/span&gt;. A IDE irá gerar o método &lt;span style="font-style: italic;"&gt;bSearchActionPerformed&lt;/span&gt;. Chame &lt;span style="font-style: italic;"&gt;callServiceSearchIp&lt;/span&gt; quando a gui disparar eventos &lt;span style="font-style: italic;"&gt;actionPerformed&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private void bSearchActionPerformed(java.awt.event.ActionEvent evt)  {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;....&lt;/span&gt;callServiceSerachIp(tfIP.getText());&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Agora sim.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Certifique-se que o aplicativo esteja rodando sobre Java 5. O que?! Java 5??&lt;br /&gt;&lt;br /&gt;Isso mesmo... Há um bug que (ao menos por enquanto) impede que esse programa funcione em Java 6. Esse bug já foi &lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=87181"&gt;relatado&lt;/a&gt;, mas parece que &lt;a href="http://forums.java.net/jive/thread.jspa?threadID=17683&amp;start=0&amp;amp;tstart=120"&gt;não foi concertado&lt;/a&gt; - aqui mesmo não funcionou e tive que voltar para o Java 5.&lt;br /&gt;&lt;br /&gt;Compile, rode o programa e divirta-se.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNcyz6KaI/AAAAAAAAADQ/e10KLlgBoIc/s1600-h/IPWSClient.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RZUNcyz6KaI/AAAAAAAAADQ/e10KLlgBoIc/s200/IPWSClient.png" alt="" id="BLOGGER_PHOTO_ID_5013928548473907618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O site &lt;a href="http://xmethods.org/"&gt;xmethods.org&lt;/a&gt; possui uma série de web services disponíveis para testes.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-7366554894812052130?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/7366554894812052130/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=7366554894812052130&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7366554894812052130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7366554894812052130'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2006/12/netbeans-matisse-e-web-services.html' title='NetBeans, Matisse e Web Services'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-7306037986694823090</id><published>2006-12-19T17:32:00.000-02:00</published><updated>2007-03-24T18:09:09.422-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Acesso ao Repositório do Java.net com o NetBeans</title><content type='html'>Retomo ao tema sobre &lt;span style="font-weight: bold;"&gt;acesso ao repositório de projetos do java.net&lt;/span&gt;, mas dessa vez com o &lt;span style="font-weight: bold;"&gt;NetBeans&lt;/span&gt; (5.5), diferentemente da publicação anterior, que usa o Eclipse 3.2.1&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;Certifique-se que o módulo de CVS está instalado no NetBeans. No menu, selecione &lt;span style="font-style: italic;"&gt;CVS&lt;/span&gt; -&gt; &lt;span style="font-style: italic;"&gt;Checkout...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Preencha os campos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CVS Root::pserver:&lt;span style="font-style: italic;"&gt;id_usuario&lt;/span&gt;@cvs.dev.java.net:/cvs&lt;/li&gt;&lt;li&gt;Password: ************&lt;/li&gt;&lt;li&gt;Module: &lt;span style="font-style: italic;"&gt;nome_do_projeto&lt;/span&gt; (ou clique em Browse... para selecionar o projeto)&lt;/li&gt;&lt;li&gt;Local Folder: &lt;span style="font-style: italic;"&gt;selecione a pasta onde ficará a cópia local do projeto&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Clique em Finish.&lt;br /&gt;&lt;br /&gt;O NetBeans irá perguntar se desejá-se criar um novo projeto a partir do que foi importado do repositório do Java.net. Se for o caso, crie o projeto na mesma pasta selecionada anteriormente no campo Local Folder.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja também:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/search/label/Netbeans"&gt;NetBeans em Wonderland&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-7306037986694823090?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/7306037986694823090/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=32745412&amp;postID=7306037986694823090&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7306037986694823090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7306037986694823090'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2006/12/acesso-ao-repositrio-do-javanet-com-o.html' title='Acesso ao Repositório do Java.net com o NetBeans'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='16551977039128178087'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>