<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-32745412</id><updated>2011-08-22T00:41:23.095-03:00</updated><category term='SwingX'/><category term='Python'/><category term='Netbeans'/><category term='Qualidade de Software'/><category term='Wonderland e Ciência'/><category term='Java Básico'/><category term='Outros...'/><category term='ModelMat'/><category term='Day-to-day Developer Life'/><category term='Look and Feel'/><category term='Swing Development'/><category term='Desktop Tips'/><category term='EJB 3.0'/><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?max-results=100'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/'/><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><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>68</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32745412.post-5901089998990354970</id><published>2010-03-24T13:11:00.002-03:00</published><updated>2010-05-11T17:08:15.898-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Day-to-day Developer Life'/><title type='text'>Tratamento de Erros e Exceções</title><content type='html'>Depois de várias discussões sobre o uso de exceções "checked" e "uncheked", tanto em livros quando em blogs e forums, acredito que existe um consenso geral de que:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;erros de negócio devem ser tratados em runtime, portanto devem ser utilizadas as checked exceptions;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;erros de programação lançam unchecked exceptions, pois bugs ainda não podem ser tratados em tempo de execução; é preciso reparar o software, não há nada a ser feito além de coletar informações sobre o erro, incluindo o estado do aplicativo, e tentar minimizar os efeitos do bug fazendo rollback, por exemplo.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Há os que discordam, os que nunca pensaram no assunto, os que não dão a mínima, mas geralmente essa abordagem é bem aceita.&lt;br /&gt;&lt;br /&gt;Um assunto relacionado, mas não tão discutido, é o uso de boolean em contraste às exceções nas APIs de validações. Não encontrei esse assunto nem mesmo no Effective Java 2° Edition, talvez por não considerarem relevante.&lt;br /&gt;&lt;br /&gt;Mas acredito que seja, porque nossa equipe já tomou a decisão errada, o que nos custou caro. (E com custar caro eu digo 1) um longo tempo com tratamento de erros deficiente e 2) a necessidade de refactoring.)&lt;br /&gt;&lt;br /&gt;Posso não ser um tremendo desenvolvedor, sou um Pleno com uns cinco anos de experiência, um mero mortal enfim, mas havia os feras na equipe, incluindo o arquiteto responsável pelo projeto, logo o principal responsável pelo nosso erro. (Talvez não fosse tão fera assim, ou talvez estivesse com a cabeça em outro lugar na hora do batente.)&lt;br /&gt;&lt;br /&gt;A API de validação nesse software não era genérica, não era algo do tipo #notNull, ou #isEmpty das classes Validate e StringUtils da Commons Lang (API de utilidades da Apache). Esse tipo de validação é melhor realizada com as bibliotecas já existentes, como a Commons Lang, Commons Collections (também da Apache), de modo a aproveitarmos o bom trabalho realizado por n profissionais competentes e o auxílio da comunidade. Os desenvolvedores da Commons Lang já fundiram a fuça pensando qual API retorna boolean, qual lança exceção (#notNull lança exceção, #isEmpty retorna true ou false).&lt;br /&gt;&lt;br /&gt;Nosso problema era validação de negócios, algo do tipo "temosTudoNosTrinquesPraSeguirAdiante"?&lt;br /&gt;&lt;br /&gt;O que acham? Já passaram por problema semelhante? O que decidiram? Têm ideia sobre onde erramos?&lt;br /&gt;&lt;br /&gt;Erramos porque decidimos utilizar booleanos, e com isso 1) a API não era capaz de retornar informações adicionais sobre eventuais problemas na validação, 2) os demais métodos da cadeia de chamada também precisavam retornar boolean e 3) comprometida a flexibilidade do tratamento de erros.&lt;br /&gt;&lt;br /&gt;No primeiro caso, como a API só retornava true/false, precisavamos inserir diversas linhas de log em meio aos métodos de validação. Isso comprometia bastante a legibilidade do método, gerava duplicação do código de log. Havia código de log espalhado por todo canto. E era isso ou nada (ponto 3).&lt;br /&gt;&lt;br /&gt;O segundo ponto infeliz era a necessidade de que todos os métodos a partir da chamada da validação deviam retornar bolean até "o cara" que tratava o erro. Dependendo da complexidade, era uma longa viagem, com umas 5 chamadas de diversas classes retornando boolean, sendo que pelo menos 3 desses métodos eram implementação de um contrato.&lt;br /&gt;&lt;br /&gt;A falta de flexibilidade era óbvia, pois não podíamos fazer nada diferente. Se quiséssemos mais informações sobre um erro além de um "false", tínhamos que colocar essa lógica dentro do método onde esse erro ocorreu. Isso não só é limitado ao extremo, como também gera complicações adicionais.&lt;br /&gt;&lt;br /&gt;Com a nossa API disparando exceções, 1) somos capazes de encapsular todas as informações que achamos necessária dentro da própria exceção, 2) podemos definir n mecanismos diferentes de tratamento de erro (algumas exceções são "logadas" em arquivos de texto, outras vão para o banco de dados, algumas disparam e-mails, outras não) e 3) o uso da API está mais fácil além de flexível; se um métodos não sabe como tratar o erro de validação, deixe o erro passar adiante para ser tratado mais acima na pilha de invocações.&lt;br /&gt;&lt;br /&gt;E tudo passou a ser tão óbvio...!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-5901089998990354970?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/5901089998990354970/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=5901089998990354970&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/5901089998990354970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/5901089998990354970'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2010/03/tratamento-de-erros-e-excecoes.html' title='Tratamento de Erros e Exceções'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-2393965151488791370</id><published>2007-07-18T04:44:00.000-03:00</published><updated>2007-07-18T05:09:20.354-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ModelMat'/><title type='text'>ModelMat e uma Melhor Arquitetura</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rp0fDrF5qlI/AAAAAAAAApg/oL5rC-gjvwY/s1600-h/ModelMat-0.4_1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rp0fDrF5qlI/AAAAAAAAApg/oL5rC-gjvwY/s320/ModelMat-0.4_1.png" alt="" id="BLOGGER_PHOTO_ID_5088257301966072402" border="0" /&gt;&lt;/a&gt;Resolvi estudar e planejar uma boa arquitetura para o &lt;a href="http://rfiume.blogspot.com/2007/01/modelmat.html"&gt;ModelMat&lt;/a&gt;, que acaba de ir para a versão 0.4. A concentração dos esforços se deu na separação da &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; e do &lt;span style="font-style: italic;"&gt;model&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;O objetivo é utilizá-lo como exemplo para uma boa arquitetura &lt;acronym title="Graphical User Interface"&gt;GUI&lt;/acronym&gt; Swing, mesmo sendo um exemplo limitado graças à natureza do ModelMat, que difere da maioria dos softwares comerciais. Ainda assim, deverá ajudar a mostrar o "caminho das pedras".&lt;br /&gt;&lt;br /&gt;As principais fontes de inspiração foram o padrão &lt;a style="font-style: italic;" href="http://www.martinfowler.com/eaaDev/PresentationModel.html"&gt;Presentation Model&lt;/a&gt;, do Martin Fowler, e JGoodies Binding, do Karsten Lentzsch, também em muito baseado no &lt;span style="font-style: italic;"&gt;Presentation Model&lt;/span&gt;&lt;span class="fullpost"&gt;, ainda que eu não tenha utilizado &lt;span style="font-style: italic;"&gt;binding&lt;/span&gt; automático.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;PresentationModel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De acordo com Martin Fowler,&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;Presentation Model&lt;/span&gt; transfere o estado e comportamento da &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; para uma classe &lt;span style="font-style: italic;"&gt;model&lt;/span&gt; que faz parte da apresentação (&lt;span style="font-style: italic;"&gt;presentation&lt;/span&gt;, no original). O &lt;span style="font-style: italic;"&gt;Presentation Model&lt;/span&gt; interage com a camada de domínio e provê uma interface para a &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; que minimiza a tomada de decisões nessa &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;. A &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; armazena todo o seu estado no &lt;span style="font-style: italic;"&gt;Presentation Model&lt;/span&gt; ou o sincroniza com o &lt;span style="font-style: italic;"&gt;Presentation Model&lt;/span&gt; freqüentemente.&lt;br /&gt;&lt;/blockquote&gt;No caso do ModelMat, comportamento &lt;span style="font-weight: bold;"&gt;e&lt;/span&gt; estado foram transferidos &lt;span style="font-weight: bold;"&gt;da&lt;/span&gt; &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;para&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;model&lt;/span&gt;, com possível exceção dos métodos que tem estrita relação com a &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;. Um exemplo é o método &lt;span style="font-size:130%;"&gt;&lt;code&gt;changeColumnName&lt;/code&gt;&lt;/span&gt;, da classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;Spreadsheet&lt;/code&gt;&lt;/span&gt;, cuja função é alterar o nome das colunas da planilha. (Faria sentido deslocar tal método para o &lt;span style="font-style: italic;"&gt;model&lt;/span&gt;?)&lt;br /&gt;&lt;br /&gt;A comunicação das mudanças no &lt;span style="font-style: italic;"&gt;model&lt;/span&gt; para a &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; é feita através do disparo de eventos do &lt;span style="font-style: italic;"&gt;model&lt;/span&gt; para a &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;. Assim, por exemplo, &lt;span style="font-size:130%;"&gt;&lt;code&gt;SpreadsheetModel&lt;/code&gt;&lt;/span&gt; dispara um evento para &lt;span style="font-size:130%;"&gt;&lt;code&gt;Spreadsheet&lt;/code&gt;&lt;/span&gt; (a &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;) atualizar o seu estado. Sem novidades.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://rfiume.blogspot.com/2007/05/swing-application-framework-jsr-296.html"&gt;Swing Application Framework&lt;/a&gt; (JSR-296), com o seu gerenciamento e &lt;acronym title="binding"&gt;ligação&lt;/acronym&gt; de &lt;span style="font-size:130%;"&gt;&lt;code&gt;Action&lt;/code&gt;&lt;/span&gt;'s ajudou a mover o comportamento da &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; para o &lt;span style="font-style: italic;"&gt;model&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Como resultado, as &lt;span style="font-style: italic;"&gt;views&lt;/span&gt; estão completamente "ignorantes". O código fonte da classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;ChartView&lt;/code&gt;&lt;/span&gt; tem apenas 64 linhas, contando com sua documentação; &lt;span style="font-size:130%;"&gt;&lt;code&gt;ReportView&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/span&gt; tem 69 e &lt;span style="font-size:130%;"&gt;&lt;code&gt;Spreadsheet&lt;/code&gt;&lt;/span&gt;, a mais complexa, 228 linhas. As &lt;span style="font-style: italic;"&gt;views&lt;/span&gt; apenas definem e organizam os componentes visuais e ajustam o seu &lt;span style="font-style: italic;"&gt;model&lt;/span&gt;. Eis a classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;ChartView&lt;/code&gt;&lt;/span&gt; (documentação omitida):&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public final class ChartView extends JPanel {&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;private ChartPanel chartPanel;&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;public ChartView() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;super();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;initComponents();&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;public ChartView(ChartModel model) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;this();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;add(createChartPanel(model.getJFreeChart()));&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;private ChartPanel createChartPanel(JFreeChart chart) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;chartPanel = new ChartPanel(chart, 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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;chartPanel.setMouseZoomable(true, 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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;return chartPanel;&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;private void initComponents() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setLayout(new java.awt.BorderLayout());&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;span style="color: rgb(0, 0, 153);"&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="font-size:130%;"&gt;&lt;code&gt;ChartModel&lt;/code&gt;&lt;/span&gt; define os métodos sobrecarregados &lt;span style="font-size:130%;"&gt;&lt;code&gt;reportResult&lt;/code&gt;&lt;/span&gt;, que contém toda a rotina para processar o resultado da função e mostrá-la ao usuário, e &lt;span style="font-size:130%;"&gt;&lt;code&gt;clear&lt;/code&gt;,&lt;/span&gt; que limpa a área do gráfico.&lt;br /&gt;&lt;br /&gt;Explicando a arquitetura da GUI de forma sucinta, há quatro &lt;span style="font-style: italic;"&gt;views&lt;/span&gt;: &lt;span style="font-size:130%;"&gt;&lt;code&gt;ModelMatView&lt;/code&gt;&lt;/span&gt;, a principal, é composta das demais: &lt;span style="font-size:130%;"&gt;&lt;code&gt;Spreadsheet&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;ReportView&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;ChartView&lt;/code&gt;&lt;/span&gt;. Também contém um &lt;span style="font-size:130%;"&gt;&lt;code&gt;JMenu&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;JToolBar&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;StatusBar&lt;/code&gt;&lt;/span&gt;. O &lt;span style="font-style: italic;"&gt;Presentation Model&lt;/span&gt; de &lt;span style="font-size:130%;"&gt;&lt;code&gt;ModelMatView&lt;/code&gt;&lt;/span&gt; é &lt;span style="font-size:130%;"&gt;&lt;code&gt;ApplicationModel&lt;/code&gt;&lt;/span&gt;, que contém os &lt;span style="font-style: italic;"&gt;models&lt;/span&gt; das demais &lt;span style="font-style: italic;"&gt;views&lt;/span&gt;: &lt;span style="font-size:130%;"&gt;&lt;code&gt;SpreadsheetModel&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;ReportModel&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;ChartModel&lt;/code&gt;&lt;/span&gt;, respectivamente.&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-style: italic;"&gt;workflow&lt;/span&gt; do software é basicamente definido no &lt;span style="font-size:130%;"&gt;&lt;code&gt;ApplicationModel&lt;/code&gt;&lt;/span&gt;, por isso está mais claro. Sua classe interna &lt;span style="font-size:130%;"&gt;&lt;code&gt;DoRegression&lt;/code&gt;&lt;/span&gt; é uma boa mostra de como isso acontece.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private class DoRegression extends Task&amp;lt;AbstractRegressionResult, Void&amp;gt; {&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;DoRegression() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;super(ModelMatApplication.getApplication());&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;protected AbstractRegressionResult doInBackground() &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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;throws CoordinateNumberException, InsufficientDataException {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if (selectedRegressionType == RegressionType.LINEAR) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return linearRegression();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;} else if (selectedRegressionType == RegressionType.NON_LINEAR) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return nonLinearRegression();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return null;&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;protected void succeeded(AbstractRegressionResult result) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;reportModel.reportResult(result);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;chartModel.reportResult(result);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setMessage("Regression succeeded.");&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;protected void failed(Throwable cause) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setMessage("Regression failed.");&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ExceptionNotifier.notifyError(cause);&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;span style="color: rgb(0, 0, 153);"&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;Antes, o uso do padrão &lt;span style="font-style: italic;"&gt;Observer&lt;/span&gt; para notificar as diversas operações ocorrendo no software tornava difícil o seu entendimento e depuração. &lt;span style="font-style: italic;"&gt;Observers&lt;/span&gt; foram retirados onde puderam, sendo utilizados apenas para notificar &lt;span style="font-style: italic;"&gt;views&lt;/span&gt; sobre mudanças nos &lt;span style="font-style: italic;"&gt;models&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;The Day After...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rp0fcLF5qmI/AAAAAAAAApo/4FzVXxGQ-iI/s1600-h/ModelMat-0.4_2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rp0fcLF5qmI/AAAAAAAAApo/4FzVXxGQ-iI/s320/ModelMat-0.4_2.png" alt="" id="BLOGGER_PHOTO_ID_5088257722872867426" border="0" /&gt;&lt;/a&gt;A única mudança perceptível para o usuário do aplicativo é a melhora na geração de gráficos. Compare o gráfico das duas figuras desse texto com o &lt;a href="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rbr7qyW68hI/AAAAAAAAAOk/mbUJSf-fn4M/s1600-h/ModelMat-Plastic3D.png"&gt;dessa figura&lt;/a&gt;. Esse aperfeiçoamento se deu graças ao melhor uso da &lt;acronym title="Application Programming Interface"&gt;API&lt;/acronym&gt; do JFreeChart. O código para gerar os gráficos está menor, mais claro e mais correto.&lt;br /&gt;&lt;br /&gt;O resultado de um &lt;span style="font-style: italic;"&gt;workflow&lt;/span&gt; mais simples e claro e de uma melhor arquitetura é um software mais fácil de entender e mais difícil de estragar.&lt;br /&gt;&lt;br /&gt;Na mesma proporção que os componenes ficaram com responsabilidades mais bem definidas, as rotinas desnecessárias e potencialmente problemáticas foram eliminadas.&lt;br /&gt;Há menos &lt;span style="font-style: italic;"&gt;imports&lt;/span&gt;, classes, métodos, propriedades e código em geral.&lt;br /&gt;&lt;br /&gt;Haviam falhas no conceito do software que tornaram-se evidentes e foram corrigidas. A antiga classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;Point&lt;/code&gt;&lt;/span&gt;, por exemplo, não representava um ponto no espaço 2D, como seu nome, seus métodos e propriedades levavam a crer. Inclusive eu pensei. &lt;span style="font-size:130%;"&gt;&lt;code&gt;Point&lt;/code&gt;&lt;/span&gt; na verdade representava índices na planilha - por exemplo, a célula da primeira linha e segunda coluna tem os índices (0, 1).&lt;br /&gt;&lt;br /&gt;Portanto, &lt;span style="font-size:130%;"&gt;&lt;code&gt;Point&lt;/code&gt;&lt;/span&gt; foi renomeada para &lt;span style="font-size:130%;"&gt;&lt;code&gt;XYTableIndex&lt;/code&gt;&lt;/span&gt; e seus dois métodos, para &lt;span style="font-size:130%;"&gt;&lt;code&gt;getRow&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;getColumn&lt;/code&gt;&lt;/span&gt;. De fato se faz necessário uma classe para representar as coordenadas dos pontos no espaço 2D, por isso foi criada uma nova classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;Point&lt;/code&gt;&lt;/span&gt;, com seus métodos &lt;span style="font-size:130%;"&gt;&lt;code&gt;getX&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;getY&lt;/code&gt;&lt;/span&gt; e outros.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Aperfeiçoamentos no ModelMat com Base no Swing Application Framework&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O ModelMat utiliza os benefícios do Swing Application Framework. Como o seu código fonte está no &lt;a href="https://modelmat.dev.java.net/source/browse/modelmat/"&gt;repositório do sítio do projeto&lt;/a&gt;, fica fácil consultar como funciona a implementação da JSR-296 na prática. Entre as funcionalidades, estão:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;uso de &lt;span style="font-style: italic;"&gt;multithreading&lt;/span&gt; para melhor resposta do software às ações do usuário (consulte &lt;span style="font-size:130%;"&gt;&lt;code&gt;org.modelmat.gui.ApplicationModel&lt;/code&gt;&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;gerencimento do ciclo de vida do aplicativo (veja &lt;span style="font-size:130%;"&gt;&lt;code&gt;org.modelmat.application.ModelMatApplication&lt;/code&gt;&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;estado da sessão persistente (&lt;span style="font-size:130%;"&gt;&lt;code&gt;ModelMatApplication&lt;/code&gt;&lt;/span&gt; herda essa funcionalidade de &lt;span style="font-size:130%;"&gt;&lt;code&gt;application.SingleFrameApplication&lt;/code&gt;&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;barra de estado (baseada na classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;application.example.StatusBar&lt;/code&gt;&lt;/span&gt;, utilizada em &lt;span style="font-size:130%;"&gt;&lt;code&gt;org.modelmat.gui.ModelMatView&lt;/code&gt;&lt;/span&gt;).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Nota: classes do pacote &lt;span style="font-size:130%;"&gt;&lt;code&gt;application&lt;/code&gt;&lt;/span&gt; e derivados fazem parte do Swing Application Framework.&lt;br /&gt;&lt;br /&gt;Nota 2: o ModelMat também pode ser fonte de consulta para implementação de &lt;a href="http://rfiume.blogspot.com/2007/02/tray-icon-para-o-seu-aplicativo.html"&gt;Tray Icon&lt;/a&gt;, &lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxtipoftheday.html"&gt;Tip of the Day&lt;/a&gt; e JTable. Novas funcionalidades estão a caminho, como o uso da &lt;a href="http://rfiume.blogspot.com/2007/03/desktop-api.html"&gt;Java Desktop API&lt;/a&gt; e integração com planilhas eletrônicas.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Outros Melhorias&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Os nomes das classes foram melhorados. Exemplo: antes, as classes responsáveis pela &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; chamavam-se &lt;span style="font-size:130%;"&gt;&lt;code&gt;VAlgumCoisa&lt;/code&gt;&lt;/span&gt;, como &lt;span style="font-size:130%;"&gt;&lt;code&gt;VReport&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;VChart&lt;/code&gt;&lt;/span&gt;; agora chamam-se &lt;span style="font-size:130%;"&gt;&lt;code&gt;AlgumaCoisaView&lt;/code&gt;&lt;/span&gt;, como &lt;span style="font-size:130%;"&gt;&lt;code&gt;ReportView&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;ChartView&lt;/code&gt;&lt;/span&gt;. A classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;Spreadsheet&lt;/code&gt;&lt;/span&gt;, antiga &lt;span style="font-size:130%;"&gt;&lt;code&gt;VTable&lt;/code&gt;&lt;/span&gt;, é a única exceção a essa regra. Como é claro que uma planilha é uma &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;, acrescentar essa palavra ao fim da classe (&lt;span style="font-size:130%;"&gt;&lt;code&gt;SpreadsheetView&lt;/code&gt;&lt;/span&gt;) é redundante.&lt;br /&gt;&lt;br /&gt;Da mesma forma, nomes de métodos estão mais precisos e concisos: &lt;span style="font-size:130%;"&gt;&lt;code&gt;clearReport&lt;/code&gt;&lt;/span&gt;, da classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;ChartView&lt;/code&gt;&lt;/span&gt;, mudou para &lt;span style="font-size:130%;"&gt;&lt;code&gt;clear&lt;/code&gt;&lt;/span&gt; - suficiente.&lt;br /&gt;&lt;br /&gt;Há maior uso de campos (i.e. utilizando o modificador &lt;span style="font-size:130%;"&gt;&lt;code&gt;final&lt;/code&gt;&lt;/span&gt;) e menor utilização de variáveis.&lt;br /&gt;&lt;br /&gt;O software está mais documentado. Contudo, sua documentação está incompleta, especialmente a referente ao &lt;span style="font-style: italic;"&gt;core&lt;/span&gt; do ModelMat.&lt;br /&gt;&lt;br /&gt;O algoritmo de regressão foi simplificado. Antes, o uso forçado de &lt;span style="font-style: italic;"&gt;Command&lt;/span&gt; (GoF), causava indireção e complexidade inúteis. Agora, o uso de &lt;span style="font-style: italic;"&gt;Strategy&lt;/span&gt; (GoF), padrão mais adequado para um serviço que tem diversas implementações - exatamente o caso das regressões - tornou o processo mais simples, eficiente e elegante.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;E a Produtividade Cadê?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alguém pode indagar &lt;span style="font-style: italic;"&gt;"tudo isso, e a única melhora para o usuário final foi uma geração de gráficos mais decente? E a produtividade, cadê ?"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A resposta merece e fica para outro texto.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Muito a Fazer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esse foi apenas mais um passo na direção certa. Um grande passo considerando que mover o comportamento da &lt;span style="font-style: italic;"&gt;view&lt;/span&gt; para o &lt;span style="font-style: italic;"&gt;model&lt;/span&gt; geralmente não está entre as tarefas mais simples em aplicativos Swing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referência Utilizada:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.martinfowler.com/eaaDev/PresentationModel.html"&gt;Presentation Model, de Martin Fowler&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Mais sobre ModelMat em:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/modelmat-03-tutorial.html"&gt;ModelMat 0.3 - Tutorial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://modelmat.dev.java.net/"&gt;ModelMat - JavaNet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/search/label/ModelMat"&gt;ModelMat em Wonderland&lt;/a&gt;&lt;/li&gt;&lt;/ul&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/SwingX"&gt;Componentes SwingX&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/05/swing-application-framework-jsr-296.html"&gt;Swing Application Framework (JSR-296) - Parte 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.danielfmartins.com/2007/06/14/swing-application-framework-jsr-296-parte-2/"&gt;Swing Application Framework (JSR-296) - Parte 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/05/swing-application-framework-jsr-296_29.html"&gt;Swing Application Framework (JSR-296) - Parte 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/06/o-bsico-sobre-swingworker.html"&gt;O Básico sobre SwingWorker&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/testes-de-aceitao-em-aplicaes-swing.html"&gt;Testes de Aceitação em Aplicações Swing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/search/label/Look%20and%20Feel"&gt;Diversos Look and Feels&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-2393965151488791370?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/2393965151488791370/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=2393965151488791370&amp;isPopup=true' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2393965151488791370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2393965151488791370'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/07/modelmat-e-uma-melhor-arquitetura.html' title='ModelMat e uma Melhor Arquitetura'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KYeHnrXYwPg/Rp0fDrF5qlI/AAAAAAAAApg/oL5rC-gjvwY/s72-c/ModelMat-0.4_1.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-648833109092560523</id><published>2007-07-06T13:29:00.000-03:00</published><updated>2007-07-06T13:29:03.453-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>Swing Application Framework (JSR-296) - Parte 3</title><content type='html'>A terceira parte do artigo sobre o &lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework&lt;/a&gt; trata sobre a execução de tarefas em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://rfiume.blogspot.com/2007/05/swing-application-framework-jsr-296.html"&gt;primeira parte&lt;/a&gt; discorre sobre a JSR-296, gerenciamento de ciclo de vida e inicialização do aplicativo, o armazenamento do estado da GUI entre sessões e persistência local. A &lt;a href="http://blog.danielfmartins.com/2007/06/14/swing-application-framework-jsr-296-parte-2/"&gt;segunda parte&lt;/a&gt; apresentou a injeção de recursos e a definição, gerenciamento e &lt;em&gt;&lt;acronym title="ligação"&gt;binding&lt;/acronym&gt;&lt;/em&gt; de &lt;em&gt;Action’s&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Para uma total compreensão dessa terceira parte, é necessária a leitura da &lt;a href="http://blog.danielfmartins.com/2007/06/14/swing-application-framework-jsr-296-parte-2/"&gt;segunda parte do artigo&lt;/a&gt; e do texto &lt;a href="http://rfiume.blogspot.com/2007/06/o-bsico-sobre-swingworker.html"&gt;O Básico sobre SwingWorker&lt;/a&gt;&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Tarefas em &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(204, 102, 0);"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt; estende &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt;, o que equivale a dizer que representa uma tarefa que executa em [uma thread em] &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;. De acordo com sua documentação, &lt;span style="font-size:130%;"&gt;&lt;code&gt;&lt;span style="font-style: italic;"&gt;Task&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt; adiciona [à &lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;&lt;span style="font-style: italic;"&gt;SwingWorker&lt;/span&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;]&lt;/span&gt;:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;ul&gt;&lt;li&gt;uma série de propriedades descritivas que podem ser mostradas aos usuários; &lt;/li&gt;&lt;li&gt;um novo conjunto de métodos para customizar o término de uma tarefa;&lt;/li&gt;&lt;li&gt;possibilidade de bloquear entrada (input) à &lt;acronym title="Graphical User Interface"&gt;GUI&lt;/acronym&gt; enquanto a tarefa está executando; e &lt;/li&gt;&lt;li&gt;um &lt;span style="font-size:130%;"&gt;&lt;code&gt;TaskListener&lt;/code&gt;&lt;/span&gt; que permite monitorar os três métodos chaves de &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt;: &lt;span style="font-size:130%;"&gt;&lt;code&gt;doInBackground&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;process&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Done&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O método abstrato &lt;span style="font-size:130%;"&gt;&lt;code&gt;doInBackground&lt;/code&gt;&lt;/span&gt; é a principal questão a ser considerada ao implementar tanto uma subclasse de &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; quanto de &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt;, já que é sua responsabilidade definir exatamente o que irá ser executado em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;O método &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt;, porém, é final em &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt;. &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt; é utilizado para executar atividades complementares na &lt;span style="font-style: italic;"&gt;event dispatch thread&lt;/span&gt; (EDT) após o termino do método &lt;span style="font-size:130%;"&gt;&lt;code&gt;doInBackground&lt;/code&gt;&lt;/span&gt;. Em &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt; invoca os métodos &lt;span style="font-size:130%;"&gt;&lt;code&gt;succeeded&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;cancelled&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;interrupted&lt;/code&gt;&lt;/span&gt; ou &lt;span style="font-size:130%;"&gt;&lt;code&gt;failed&lt;/code&gt;&lt;/span&gt; quando a &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt; termina, respectivamente, com sucesso, porque foi cancelado, interrompido ou por alguma falha de execução.&lt;br /&gt;&lt;br /&gt;Independentemente do resultado, &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt; sempre invoca &lt;span style="font-size:130%;"&gt;&lt;code&gt;finished&lt;/code&gt;&lt;/span&gt; ao terminar sua execução, mesmo que uma exceção seja lançada. Por padrão, &lt;span style="font-size:130%;"&gt;&lt;code&gt;failed&lt;/code&gt;&lt;/span&gt; grava o erro em questão num arquivo de &lt;span style="font-style: italic;"&gt;log&lt;/span&gt;; os demais métodos nada fazem. Como &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt; executa na EDT, todos esses métodos também correrão nessa mesma &lt;span style="font-style: italic;"&gt;thread&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-style: italic;"&gt;Task in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como mostrado em &lt;a href="http://rfiume.blogspot.com/2007/06/o-bsico-sobre-swingworker.html"&gt;O Básico sobre SwingWorker&lt;/a&gt;, obter as entidades cadastradas num banco de dados dificilmente deve ocorrer na EDT, sob pena de congelamento da GUI. Aquele artigo mostra o uso de &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; para resolver essa situação, enquanto esse texto irá mostrar o mesmo com &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt;, por suas facilidades adicionais.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private class LoadEntitiesWithTask extends Task&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;List&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;EntityClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;, Void&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;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(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;LoadEntitiesWithTask() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;super();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setLoadEnabled(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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;setStopEnabled(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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;protected List&amp;lt;EntityClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; doInBackground() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setMessage("Obtendo " + entityName + "s cadastrados...");&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return domainManager.findAll();&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;protected void succeeded(final List&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;EntityClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; newEntities) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;synchronized(this) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if (!entities.isEmpty()) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;clear();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&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;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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;entities.add(0, EMPTY_ENTITY);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;entities.addAll(newEntities);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;fireContentsChanged(this, 0, entities.size() - 1);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setMessage(&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"Feito: lista de " + entityName + "s obtida com êxito em "&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;+ getExecutionDuration(TimeUnit.MILLISECONDS) + "ms.");&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;&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(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;protected void cancelled() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setMessage("Operação cancelada.");&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;protected void interrupted(final InterruptedException 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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;setMessage("Operação cancelada.");&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;protected void failed(final Throwable 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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;setMessage("Erro: não foi possível obter " + entityName + "s cadastrados.");&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;protected void finished() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setLoadEnabled(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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setStopEnabled(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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;As mudanças mais significativas em relação à sua equivalente com &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; são referentes aos métodos &lt;span style="font-size:130%;"&gt;&lt;code&gt;succeeded&lt;/code&gt;&lt;/span&gt; (no lugar de &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt;), &lt;span style="font-size:130%;"&gt;&lt;code&gt;cancelled&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;interrupted&lt;/code&gt;&lt;/span&gt;, e &lt;span style="font-size:130%;"&gt;&lt;code&gt;failed&lt;/code&gt;&lt;/span&gt; que enviam mensagens a componentes específicos, como &lt;span style="font-style: italic;"&gt;statusbar&lt;/span&gt; (mais sobre isso depois), e ao método &lt;span style="font-size:130%;"&gt;&lt;code&gt;finished&lt;/code&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt; pode ser utilizada em conjunto com &lt;span style="font-size:130%;"&gt;&lt;code&gt;@Action&lt;/code&gt;&lt;/span&gt;'s (sobre &lt;span style="font-size:130%;"&gt;&lt;code&gt;Action&lt;/code&gt;&lt;/span&gt;'s, ver &lt;a href="http://blog.danielfmartins.com/2007/06/14/swing-application-framework-jsr-296-parte-2/"&gt;parte 2&lt;/a&gt;) para definir tarefas que iniciam a partir de eventos gerados pela GUI.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Action(block=BlockingScope.ACTION, enabledProperty="loadEnabled")&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public Task load() {&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;loadEntitiesTask = new DefaultEntityModel.LoadEntitiesWithTask();&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;span style="color: rgb(0, 0, 153);"&gt;return loadEntitiesTask;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note que o método &lt;span style="font-size:130%;"&gt;&lt;code&gt;load&lt;/code&gt;&lt;/span&gt; retorna &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt;. Infelizmente, tanta facilidade tem seu preço. Para alterar o comportamento de &lt;span style="font-size:130%;"&gt;&lt;code&gt;LoadEntitiesWithTask&lt;/code&gt;&lt;/span&gt; de modo que apenas obtenha as entidades se as mesmas &lt;b&gt;não&lt;/b&gt; foram previamente carregadas, é preciso estender a classe. (Com &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt;, bastaria criar uma variação do método &lt;span style="font-size:130%;"&gt;&lt;code&gt;load&lt;/code&gt;&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private class LoadEntitiesIfEmpty extends LoadEntitiesWithTask {&lt;br /&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;LoadEntitiesIfEmpty() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;super();&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;protected List&amp;lt;EntityClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; doInBackground() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;if (entities.isEmpty()) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return super.doInBackground();&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;&lt;/span&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;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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;return 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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;protected void succeeded(final List&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;EntityClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; entities) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;if (entities == 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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return;&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;&lt;/span&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;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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;super.succeeded(entities);&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;&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&gt;&lt;br /&gt;&lt;br /&gt;O método &lt;span style="font-size:130%;"&gt;&lt;code&gt;loadIfEmpty&lt;/code&gt;&lt;/span&gt; é responsável, sob o ponto de vista de quem o invocar, de carregar as entidades no formulário caso isso ainda não tenha acontecido.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void loadIfEmpty() {&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;loadEntitiesTask = new DefaultEntityModel.LoadEntitiesIfEmpty();&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;span style="color: rgb(0, 0, 153);"&gt;ApplicationContext.&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;getInstance().&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;getTaskService().&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;execute(loadEntitiesTask);&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;Bloqueando a GUI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ao utilizar a &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt; para executar longas tarefas, pode ser necessário bloquear certos componentes ou o aplicativo inteiro até que a tarefa termine.&lt;br /&gt;&lt;br /&gt;Como exemplo, a tarefa de &lt;acronym title="reload"&gt;recarregar&lt;/acronym&gt; as entidades cadastradas num banco de dados certamente deve correr em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;, e a possibilidade de concorrência dessa mesma tarefa dificilmente teria alguma utilidade. Portanto, bloquear o componente que inicia a tarefa em questão até que termine é interessante.&lt;br /&gt;&lt;br /&gt;A opção de bloquear a GUI durante a execução de uma tarefa é feita definindo um valor para a propriedade &lt;span style="font-size:130%;"&gt;&lt;code&gt;block&lt;/code&gt;&lt;/span&gt; da anotação &lt;span style="font-size:130%;"&gt;&lt;code&gt;Action&lt;/code&gt;&lt;/span&gt;. Os possíveis valores para &lt;span style="font-size:130%;"&gt;&lt;code&gt;block&lt;/code&gt; &lt;/span&gt;são obtidos através da enumeração&lt;span style="font-size:130%;"&gt; &lt;code&gt;BlockingScope&lt;/code&gt;&lt;/span&gt; de &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;:&lt;/span&gt; &lt;span style="font-size:130%;"&gt;&lt;code&gt;NONE&lt;/code&gt;&lt;/span&gt; (o padrão), &lt;span style="font-size:130%;"&gt;&lt;code&gt;ACTION&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;COMPONENT&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;WINDOW&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;APPLICATION&lt;/code&gt;&lt;/span&gt;. O método &lt;span style="font-size:130%;"&gt;&lt;code&gt;load&lt;/code&gt;&lt;/span&gt;, acima, utiliza &lt;span style="font-size:130%;"&gt;&lt;code&gt;BlockingScope.ACTION&lt;/code&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Action(block=BlockingScope.ACTION, &lt;span style="font-weight: bold;"&gt;. . .&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public Task load() {&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 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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/Ro5pMuNKdSI/AAAAAAAAAow/mCjwvOvB5M8/s1600-h/load.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/Ro5pMuNKdSI/AAAAAAAAAow/mCjwvOvB5M8/s320/load.png" alt="" id="BLOGGER_PHOTO_ID_5084116696630457634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Repare que o botão para carregar as entidades está desabilitado enquanto &lt;span style="font-size:130%;"&gt;&lt;code&gt;LoadEntitiesWithTask&lt;/code&gt;&lt;/span&gt; executa (observe a barra de progresso na &lt;span style="font-style: italic;"&gt;statusbar&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;BlockingScope.WINDOW&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;BlockingScope.APPLICATION&lt;/code&gt;&lt;/span&gt; bloqueiam a janela de nível mais alto e o aplicativo inteiro, respectivamente, por padrão mostrando um &lt;span style="font-style: italic;"&gt;dialog&lt;/span&gt; indicando que o software está ocupado. O modo como esse bloqueio é feito pode ser customizado implementando a classe abstrata &lt;span style="font-size:130%;"&gt;&lt;code&gt;application.Task.InputBlocker&lt;/code&gt;&lt;/span&gt; e estabelecendo-a como o bloqueador de &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt; por meio de seu método &lt;span style="font-size:130%;"&gt;&lt;code&gt;setInputBlocker&lt;/code&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;You've Got a Message&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Com o auxílio de &lt;span style="font-size:130%;"&gt;&lt;code&gt;application.TaskMonitor&lt;/code&gt;&lt;/span&gt;, desenhada para ser o &lt;span style="font-style: italic;"&gt;model&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;&lt;acronym title="componentes para interface gráfica"&gt;widgets&lt;/acronym&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt; como barra de estado, e dos métodos de &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt; &lt;span style="font-size:130%;"&gt;&lt;code&gt;setMessage&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;message&lt;/code&gt;&lt;/span&gt;, enviar notificações para a GUI sobre o estado da execução das tarefas na &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt; beira o trivial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;setMessage&lt;/code&gt;&lt;/span&gt; foi utilizado por simplicidade. O modo aconselhável para isso é definir as mensagens num arquivo de propriedade e utilizar o método &lt;span style="font-size:130%;"&gt;&lt;code&gt;message&lt;/code&gt;&lt;/span&gt; (consulte documentação da classe e exemplos que acompanham o &lt;span style="font-style: italic;"&gt;framework&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/Ro5pVeNKdTI/AAAAAAAAAo4/LHIwuU3ZTwM/s1600-h/load_finshed.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/Ro5pVeNKdTI/AAAAAAAAAo4/LHIwuU3ZTwM/s320/load_finshed.png" alt="" id="BLOGGER_PHOTO_ID_5084116846954313010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Repare na mensagem avisando sob o término da operação. Além disso, como a operação para carregar as entidades chegou ao fim. o botão para carregar as entidades está habiltado, enquanto o que cancela essa operação está desativado...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Outros Métodos Úteis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/span&gt; ainda possui uma série de métodos úteis que incluem, mas não se limitam a:&lt;span style="font-size:130%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;getExecutionDuration&lt;/code&gt;&lt;/span&gt; retorna o tempo de execução da tarefa;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;setProgress&lt;/code&gt;&lt;/span&gt; tem o objetivo de notificar barras de progresso em &lt;span style="font-style: italic;"&gt;statubars&lt;/span&gt; que a tarefa teve algum progresso;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;isStarted&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;isPending&lt;/code&gt;&lt;/span&gt; complementam os métodos, presentes na classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;isDone&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;isCancelled&lt;/code&gt;&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Mantenha em mente que...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esse artigo é apenas uma introdução ao assunto. Não deixe de consultar a documentação e até mesmo o código-fonte do projeto, fazer experiências, discutir sobre as funcionalidades do framework.&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/05/swing-application-framework-jsr-296.html"&gt;Swing Application Framework (JSR-296) - Parte 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.danielfmartins.com/2007/06/14/swing-application-framework-jsr-296-parte-2/"&gt;Swing Application Framework (JSR-296) - Parte 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.java.net/blog/joconner/archive/2007/06/swing_applicati_1.html"&gt;Swing Application Framework: Lifecycle Events&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/06/o-bsico-sobre-swingworker.html"&gt;O Básico sobre SwingWorker&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fontes e Referências utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework Home Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=296"&gt;JSR 296: Swing Application Framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Javadoc e código fonte do Swing Application Framework&lt;/li&gt;&lt;li&gt;&lt;a href="https://appframework.dev.java.net/intro/index.html"&gt;An Introduction to Swing Application Framework API (JSR-296)&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-648833109092560523?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/648833109092560523/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=648833109092560523&amp;isPopup=true' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/648833109092560523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/648833109092560523'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/05/swing-application-framework-jsr-296_29.html' title='Swing Application Framework (JSR-296) - Parte 3'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KYeHnrXYwPg/Ro5pMuNKdSI/AAAAAAAAAow/mCjwvOvB5M8/s72-c/load.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-5510952310719124983</id><published>2007-06-26T07:21:00.000-03:00</published><updated>2007-06-28T21:56:41.576-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>O Básico sobre SwingWorker</title><content type='html'>Uma &lt;acronym title="Graphical User Interface, ou, em português, Interface Gráfica para o Usuário"&gt;GUI&lt;/acronym&gt; razoável tem certos pré-requisitos. Entre esses pré-requisitos está uma interface gráfica que não &lt;acronym title="hang"&gt;trava&lt;/acronym&gt;. Ou seja, é sempre responsiva. Isso implica mover tarefas demoradas para uma &lt;span style="font-style: italic;"&gt;thread&lt;/span&gt; que executa em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Esse artigo é uma pequena introdução sobre execução de tarefas potencialmente longas em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt; com &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt;, para desenvolver GUI's que sempre respondem aos eventos gerados pelo usuário&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nota:&lt;/span&gt; esse texto refere-se à classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; presente no Java SE 6 (i.e. &lt;span style="font-size:130%;"&gt;&lt;code&gt;javax.swing.SwingWorker&lt;/code&gt;&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Processos e Threads&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Há fartura de material sobre processos e &lt;span style="font-style: italic;"&gt;threads&lt;/span&gt; disponíveis em livros, revistas e na Internet (veja, por exemplo, &lt;a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html"&gt;The Java Tutorials - Concurrency&lt;/a&gt;). Discorrer sobre &lt;span style="font-style: italic;"&gt;threads&lt;/span&gt; foge do escopo desse texto, porém uma contextualização é válida.&lt;br /&gt;&lt;br /&gt;Processos podem ser vistos como sinônimo de programas, embora um programa possa constituir-se de mais de um processo. O sistema operacional aloca para cada processo recursos, como espaço de memória, aos quais só esse processo tem acesso.&lt;br /&gt;&lt;br /&gt;Cada processo tem ao menos uma, mas pode ter várias, &lt;span style="font-style: italic;"&gt;threads&lt;/span&gt;, que compartilham recursos do processo ao qual pertencem e, por isso mesmo, são mais eficientes e sujeitas a uma série de problemas graves, de difícil depuração, como &lt;span style="font-style: italic;"&gt;deadlocks&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;starvation&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;race condition&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Threads e Swing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ao programar interfaces gráficas com Swing, ao menos três diferentes &lt;span style="font-style: italic;"&gt;threads&lt;/span&gt; devem ser consideradas: &lt;span style="font-style: italic;"&gt;initial thread&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;event dispatch thread&lt;/span&gt; (EDT) e &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt;, também chamada de &lt;span style="font-style: italic;"&gt;background thread&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Num aplicativo Swing para &lt;span style="font-style: italic;"&gt;desktop&lt;/span&gt;, a &lt;span style="font-style: italic;"&gt;thread&lt;/span&gt; inicial apenas agenda a criação da GUI através dos métodos estáticos &lt;code&gt;&lt;span style="font-size:130%;"&gt;invokeLater&lt;/span&gt;&lt;/code&gt; ou &lt;span style="font-size:130%;"&gt;&lt;code&gt;invokeAndWait&lt;/code&gt;&lt;/span&gt;, da classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingUtilities&lt;/code&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public static void main(final String args[]) {&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;SwingUtilities.invokeLater(new Runnable() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;public void run() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Cria e mosta a GUI.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;new Applicatio().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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&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;Em applets, a &lt;span style="font-style: italic;"&gt;thread&lt;/span&gt; incial invoca os métodos &lt;span style="font-size:130%;"&gt;&lt;code&gt;init&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;start&lt;/code&gt;&lt;/span&gt; do objeto applet. O agendamento da construção da GUI em applets deve necessariamente ser feito através de &lt;span style="font-size:130%;"&gt;&lt;code&gt;invokeAndWait&lt;/code&gt;&lt;/span&gt;, em &lt;span style="font-size:130%;"&gt;&lt;code&gt;init&lt;/code&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A partir daí, o aplicativo passa a correr "baseado em eventos", executados na &lt;span style="font-style: italic;"&gt;event dispatch thread&lt;/span&gt;, gerados pelo usuário do software através da GUI. Tarefas executadas nessa &lt;span style="font-style: italic;"&gt;thread &lt;/span&gt;devem terminar rapidamente, caso contrário a interface irá congelar.&lt;br /&gt;&lt;br /&gt;Por exemplo, ao clicar no &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxhyperlink.html"&gt;hyperlink&lt;/a&gt; &lt;span style="font-style: italic;"&gt;Pedir Suporte&lt;/span&gt;, o método &lt;span style="font-size:130%;"&gt;&lt;code&gt;actionPerformed&lt;/code&gt;&lt;/span&gt; abre o cliente de e-mail padrão do usuário, com o endereço do suporte e um título para o e-mail (detalhes &lt;a href="http://rfiume.blogspot.com/2007/03/desktop-api.html"&gt;aqui&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RoCpDEMqk_I/AAAAAAAAAoQ/7fH3rw9XnJk/s1600-h/Desktop_API-Sending_Email.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RoCpDEMqk_I/AAAAAAAAAoQ/7fH3rw9XnJk/s400/Desktop_API-Sending_Email.png" alt="" id="BLOGGER_PHOTO_ID_5080246249805485042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// actionPerformed executa na EDT...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void actionPerformed(final ActionEvent e) {&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;if (desktop != 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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;if (desktop.isSupported(Desktop.Action.MAIL)) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// try...catch omitido para simplificar exemplo.&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;desktop.mail(uri);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RoCrWkMqlBI/AAAAAAAAAog/lKQ-bAujH0A/s1600-h/Desktop_API-Sending_Email_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RoCrWkMqlBI/AAAAAAAAAog/lKQ-bAujH0A/s200/Desktop_API-Sending_Email_2.png" alt="" id="BLOGGER_PHOTO_ID_5080248783836189714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Longas tarefas podem e devem ser executadas na &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt;. A intercomunicação necessária entre a &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt; e a EDT não é uma tarefa trivial. Considere implementar uma subclasse de &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt;, que é abstrata, para rodar tarefas em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Boa parte dos componentes Swing não é &lt;span style="font-style: italic;"&gt;thread safe &lt;/span&gt;(veja o porquê em &lt;a class="OutsideLink" target="_blank" href="http://weblogs.java.net/blog/kgh/archive/2004/10/multithreaded_t.html"&gt;MultiThreaded toolkits: A failed dream?&lt;/a&gt;). Isto é, quando executados em concorrência podem causar erros imprevisíveis. Portanto, comumente, invocações aos métodos dos componentes Swing devem ser feitos na  &lt;span style="font-style: italic;"&gt;event dispatch thread&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Se realmente for necessário invocar tais métodos na &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt;, consulte a documentação das classes Swing para ter certeza que o método em questão é &lt;span style="font-style: italic;"&gt;thread safe&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Congelando GUI's - Como Irritar os Usuários do Seu Software... e Perder Clientes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Um exemplo de atividade que certamente irá travar a interface gráfica é a obtenção de objetos cadastrados através do &lt;span style="font-size:130%;"&gt;&lt;code&gt;EntityManager&lt;/code&gt;&lt;/span&gt; da &lt;acronym title="Java Persistence API"&gt;JPA&lt;/acronym&gt;, no Java SE. (Mais sobre JPA &lt;a href="http://rfiume.blogspot.com/search/label/JPA%20-%20Java%20Persistence%20API"&gt;aqui mesmo&lt;/a&gt;, nesse blog.)&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;DefaultEntityModel&lt;/code&gt;&lt;/span&gt; é utilizada como &lt;span style="font-style: italic;"&gt;model&lt;/span&gt; da GUI&lt;acronym title="User Interface, ou Interface para o Usuário"&gt;&lt;/acronym&gt;. Seu método &lt;span style="font-size:130%;"&gt;&lt;code&gt;load&lt;/code&gt;&lt;/span&gt; é utilizado para carregar a lista de entidades cadastradas.&lt;br /&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;public void load() {&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Primeiro verifica se a lista já foi carregada com as entidades cadastradas&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; no banco de dados;&lt;br /&gt;&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// isto é, se o usuário já havia acessado esse formulário.&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if (isEmpty()) {&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;&lt;/span&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;span style="color: rgb(102, 102, 102);"&gt;// Código auxiliar omitido para melhor clareza.&lt;br /&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;&lt;/span&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;span style="color: rgb(102, 102, 102);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; Bem aqui&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;, congela a GUI ao carregar a lista com as entidades cadastradas.&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;List&amp;lt;EntityClass&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; loadedEntities = domainManager.findAll();&lt;br /&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;&lt;/span&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;span style="color: rgb(102, 102, 102);"&gt;// Finalmente atualiza a GUI. Só então a interface "descongela".&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;entities.addAll(loadedEntities);&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;fireContentsChanged(this, 0, entities.size() - 1);&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;As entidades cadastradas são carregadas na interface gráfica sob demanda. Para tanto, &lt;span style="font-size:130%;"&gt;&lt;code&gt;load&lt;/code&gt;&lt;/span&gt; é invocado no momento em que o formulário de cadastro aparece para o usuário.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private void formComponentShown(java.awt.event.ComponentEvent evt) {                                  &lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;entityListPanel.load();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RoDC-0MqlCI/AAAAAAAAAoo/ee5YaRinwd4/s1600-h/VProduto.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RoDC-0MqlCI/AAAAAAAAAoo/ee5YaRinwd4/s320/VProduto.png" alt="" id="BLOGGER_PHOTO_ID_5080274764093363234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Operações que envolvem manipulação de entidades com JPA, como é caso do método &lt;span style="font-size:130%;"&gt;&lt;code&gt;findAll&lt;/code&gt;&lt;/span&gt; da classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;DomainManager&lt;/code&gt;&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;Service&lt;/span&gt; que disponibiliza API de alto nível para gerenciamento de entidades) costumam ser lentas no ambiente Java SE, porque implicam:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;conexão ao banco de dados; &lt;/li&gt;&lt;li&gt;tentativa de geração das tabelas do banco de dados, de acordo com a configuração; &lt;/li&gt;&lt;li&gt;execução de operações &lt;acronym title="Create, Read, Update e Delete"&gt;CRUD&lt;/acronym&gt;; e&lt;br /&gt;&lt;/li&gt;&lt;li&gt;desconectar-se do banco de dados.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-style: italic;"&gt;SwingWorker in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-size:130%;"&gt;&lt;code&gt;javax.swing.SwingWorker&lt;/code&gt;&lt;/span&gt; fornece a infraestrutura necessária para executar tarefas demoradas na &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt;. Cada instância de &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; implementa uma tarefa em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;. De acordo com sua documentação:&lt;br /&gt;&lt;blockquote&gt;é desenhada para situações onde é preciso ter tarefas demoradas executando em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt; que forneçam atualizações para a GUI, seja quando a tarefa terminar, seja enquanto processando (não mostrado nesse artigo).&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; é parametrizada. O primeiro parâmetro de tipo é utilizado para definir o resultado final dos métodos &lt;span style="font-size:130%;"&gt;&lt;code&gt;doInBackground()&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;get()&lt;/code&gt;&lt;/span&gt;. O segundo, para definir o tipo dos resultados intermediários em &lt;span style="font-size:130%;"&gt;&lt;code&gt;publish(V... chunks)&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;process(List&amp;lt;V&amp;gt; chunks)&lt;/code&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; /**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;   * Background thread utilizada pelo método load para preencher&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; lista de entidades.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;   *&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;   * LoadEntities espera carregar todas as entidades&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;   * na instância de List, entities, para só então atualizar a GUI.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;   */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  private class LoadEntities extends SwingWorker&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;List&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;EntityClass&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;, Void&amp;gt; {&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;@Override&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;protected List&amp;lt;EntityClass&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; doInBackground() {&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return domainManager.findAll();&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&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(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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Override&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void done() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Código auxiliar e bloco try...catch omitidos para melhor clareza.&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;          entities.addAll(get());&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;fireContentsChanged(this, 0, entities.size() - 1);&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;Subclasses de &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; devem implementar o método &lt;span style="font-size:130%;"&gt;&lt;code&gt;doInBackground&lt;/code&gt;&lt;/span&gt;. &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt; executa na EDT assim que o método &lt;span style="font-size:130%;"&gt;&lt;code&gt;doInBackground&lt;/code&gt;&lt;/span&gt; termina. &lt;span style="font-size:130%;"&gt;&lt;code&gt;get&lt;/code&gt;&lt;/span&gt; também corre na EDT e espera &lt;span style="font-size:130%;"&gt;&lt;code&gt;doInBackground&lt;/code&gt;&lt;/span&gt; terminar para só então retornar o resultado da computação desse método. Em &lt;span style="font-size:130%;"&gt;&lt;code&gt;LoadEntities&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;get&lt;/code&gt;&lt;/span&gt; é chamado em &lt;span style="font-size:130%;"&gt;&lt;code&gt;done&lt;/code&gt;&lt;/span&gt;, portanto retorna imediatamente.&lt;br /&gt;&lt;br /&gt;O método &lt;span style="font-size:130%;"&gt;&lt;code&gt;load&lt;/code&gt;&lt;/span&gt; de &lt;span style="font-size:130%;"&gt;&lt;code&gt;DefaultEntityModel&lt;/code&gt;&lt;/span&gt;, atualizado, instancia a classe interna &lt;span style="font-size:130%;"&gt;&lt;code&gt;LoadEntities&lt;/code&gt;&lt;/span&gt; e invoca seu método &lt;span style="font-size:130%;"&gt;&lt;code&gt;execute&lt;/code&gt;&lt;/span&gt; na &lt;span style="font-style: italic;"&gt;event dispatch thread&lt;/span&gt;, que retorna imediatamente. Repare que a assinatura de &lt;span style="font-size:130%;"&gt;&lt;code&gt;load&lt;/code&gt;&lt;/span&gt; não foi alterada, portanto a interface gráfica não precisa ser atualizada.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void load() {&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;span style="color: rgb(102, 102, 102);"&gt;// Primeiro verifica se a lista já foi carregada com as entidades cadastradas &lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;no banco de dados;&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;span style="color: rgb(102, 102, 102);"&gt;// isto é, se o usuário já havia acessado esse formulário.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;if (isEmpty()) {&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Agora, executa tarefa em background. Conclusão, a GUI não congela.&lt;/span&gt;&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;new DefaultEntityModel.LoadEntities().execute();&lt;/span&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;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;Repare em&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;new DefaultEntityModel.LoadEntities().execute();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; é desenhada para executar apenas uma vez; não há como reaproveitar o uso de suas instâncias.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;E não é só isso!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; também possibilita:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cancelar a &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt; em execução com &lt;span style="font-size:130%;"&gt;&lt;code&gt;cancel(boolean mayInterruptIfRunning)&lt;/code&gt;&lt;/span&gt;, verificar se essa &lt;span style="font-style: italic;"&gt;thread&lt;/span&gt; terminou através de &lt;span style="font-size:130%;"&gt;&lt;code&gt;isDone()&lt;/code&gt;&lt;/span&gt;, ou se foi cancelada com &lt;span style="font-size:130%;"&gt;&lt;code&gt;isCancelled()&lt;/code&gt;&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Como mencionado anteriormente, &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; pode fornecer resultados intermediários enquando a &lt;span style="font-style: italic;"&gt;worker thread&lt;/span&gt; está em execução. Para isso, use o método &lt;span style="font-size:130%;"&gt;&lt;code&gt;publish((V... chunks)&lt;/code&gt;&lt;/span&gt;. &lt;span style="font-size:130%;"&gt;&lt;code&gt;publish&lt;/code&gt;&lt;/span&gt; faz com que &lt;span style="font-size:130%;"&gt;&lt;code&gt;process(List&amp;lt;V&amp;gt; chunks)&lt;/code&gt; &lt;/span&gt;seja invocado de modo assíncrono na EDT.&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&gt; pode &lt;acronym title="bound properties"&gt;amarrar propriedades&lt;/acronym&gt;. Mudanças nessas propriedades disparam eventos que deverão ser tratados na EDT. Na prática, isso possibilita conhecer o estador da &lt;span style="font-style: italic;"&gt;background thread&lt;/span&gt; (&lt;span style="font-size:130%;"&gt;&lt;code&gt;PENDING&lt;/code&gt;&lt;/span&gt;, &lt;span style="font-size:130%;"&gt;&lt;code&gt;STARTED&lt;/code&gt;&lt;/span&gt; e &lt;span style="font-size:130%;"&gt;&lt;code&gt;DONE&lt;/code&gt;&lt;/span&gt;), assim como o seu  progresso.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Consulte as fontes utilizadas nesse artigo para conhecer os detalhes técnicos necessários para implementar essas funcionalidades de &lt;span style="font-size:130%;"&gt;&lt;code&gt;SwingWorker&lt;/code&gt;&lt;/span&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;Consulte as Fontes Utilizadas, logo abaixo&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/search/label/Swing%20Development"&gt;Swing Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/search/label/SwingX"&gt;Componentes SwingX&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fontes Utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html"&gt;The Java Tutorials - Concurrency in Swing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html"&gt;The Java Tutorials - Concurrency&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SwingWorker (Javadoc do Java SE 6)&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-5510952310719124983?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/5510952310719124983/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=5510952310719124983&amp;isPopup=true' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/5510952310719124983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/5510952310719124983'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/06/o-bsico-sobre-swingworker.html' title='O Básico sobre SwingWorker'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KYeHnrXYwPg/RoCpDEMqk_I/AAAAAAAAAoQ/7fH3rw9XnJk/s72-c/Desktop_API-Sending_Email.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-2060901997158475584</id><published>2007-06-15T04:45:00.000-03:00</published><updated>2007-06-15T04:38:25.567-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>Swing Application Framework (JSR-296) - Parte 2</title><content type='html'>&lt;a href="http://blog.danielfmartins.com/2007/06/14/swing-application-framework-jsr-296-parte-2/"&gt;A segunda parte desse artigo&lt;/a&gt; foi publicado no blog &lt;a href="http://blog.danielfmartins.com/"&gt;batteries not included&lt;/a&gt;, do &lt;a href="http://blog.danielfmartins.com/sobre/"&gt;Daniel (Tritone) Fernandes Martins&lt;/a&gt;. Você pode acessá-lo clicando &lt;a href="http://blog.danielfmartins.com/2007/06/14/swing-application-framework-jsr-296-parte-2/"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Valeu, Daniel!&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/05/swing-application-framework-jsr-296.html"&gt;Swing Application Framework (JSR-296) - Parte 1&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Fontes e Referências Utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework Home Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=296"&gt;JSR 296: Swing Application Framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Javadoc e código fonte do Swing Application Framework&lt;/li&gt;&lt;li&gt;&lt;a href="https://appframework.dev.java.net/intro/index.html"&gt;An Introduction to Swing Application Framework API (JSR-296)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-2060901997158475584?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/2060901997158475584/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=2060901997158475584&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2060901997158475584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2060901997158475584'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/06/swing-application-framework-jsr-296.html' title='Swing Application Framework (JSR-296) - Parte 2'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-3529659837517331391</id><published>2007-05-29T10:01:00.000-03:00</published><updated>2007-06-16T10:51:55.847-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>Swing Application Framework (JSR-296) - Parte 1</title><content type='html'>A missão do &lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework (JSR-296)&lt;/a&gt;, segundo os seus criadores, é &lt;span style="font-style: italic;"&gt;definir uma infraestrutura que é comum à maioria dos aplicativos Desktop:&lt;/span&gt; &lt;ul style="font-style: italic;"&gt;&lt;li&gt;gerenciamento do ciclo de vida dos aplicativos, especialmente GUI startup e shutdown&lt;/li&gt;&lt;li&gt;gerenciamento e &lt;acronym title="loading"&gt;carregamento&lt;/acronym&gt; de recursos, como strings, mensagens formatadas, cores, fontes e outros, em componentes Swing&lt;br /&gt;&lt;/li&gt;&lt;li&gt;apoio para a definição, gerenciamento e &lt;acronym title="binding"&gt;ligação&lt;/acronym&gt; de Actions&lt;/li&gt;&lt;li&gt;Actions assíncronos (executam em "background")&lt;/li&gt;&lt;li&gt;Estado da sessão persistente.&lt;/li&gt;&lt;/ul&gt;O &lt;span style="font-style: italic;"&gt;Swing Application Framework&lt;/span&gt; visa fornecer uma base padrão e um ponto de partida para&lt;span class="fullpost"&gt; aplicativos &lt;span style="font-style: italic;"&gt;Swing&lt;/span&gt;, tornando mais fácil o seu desenvolvimento, e ser simples o suficiente para que até mesmo programadores novatos entendam como utilizá-lo dentro de horas, ao invés de meses.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Inicialização e Gerenciamento do Ciclo de Vida de Aplicativos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Através da classe &lt;code&gt;Application&lt;/code&gt;, a base desse &lt;span style="font-style: italic;"&gt;framework&lt;/span&gt;, é possível executar tarefas específicas de acordo com o ciclo de vida do aplicativo.&lt;br /&gt;&lt;br /&gt;O aplicativo deve estender essa classe e implementar ao menos o método &lt;code&gt;startup&lt;/code&gt;, responsável por preparar a GUI inicial e torná-la visível. A implementação dos outros métodos que lidam com o ciclo de vida dos aplicativos - &lt;code&gt;initialize&lt;/code&gt;, &lt;code&gt;ready&lt;/code&gt; e &lt;code&gt;shutdown&lt;/code&gt; - é opcional.&lt;br /&gt;&lt;br /&gt;U&lt;span&gt;&lt;span&gt;se &lt;/span&gt;&lt;/span&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;initialize&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span&gt;&lt;span&gt; se precisar configurar propriedades do sistema antes da construção da GUI. Utilize &lt;/span&gt;&lt;/span&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;ready&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span&gt;&lt;span&gt; se precisar executar trabalho extra depois que a GUI estiver pronta e visível. O objetivo é fazer com que &lt;/span&gt;&lt;/span&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;startup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span&gt;&lt;span&gt; execute menos tarefas, tornando a GUI visível o mais rápido possível. O método &lt;/span&gt;&lt;/span&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;shutdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;span&gt;&lt;span&gt; fecha a GUI e executa outras tarefas de limpeza antes de encerrar o aplicativo.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A subclasse concreta de &lt;code&gt;Application&lt;/code&gt; inicia o aplicativo por meio de seu método &lt;code&gt;launch&lt;/code&gt;.&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public final class OhMyApplication extends Application {&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;private SingleFrame mainFrame;&lt;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Override&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;span style="color: rgb(0, 0, 153);"&gt;protected void initialize(final String [] args) {&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;protected void startup() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;mainFrame = new SingleFrame();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;mainFrame.addWindowListener(new MainFrameListener());&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;mainFrame.pack();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;mainFrame.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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;@Override&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;span style="color: rgb(0, 0, 153);"&gt;protected void ready() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;TipOfTheDay.show(mainFrame);&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;br /&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Override&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;protected void shutdown() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;mainFrame.setVisible(false);&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public static void main(final String[] args) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;PlasticLookAndFeel.setPlasticTheme(new ExperienceBlue());&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;Application.launch(OhMyApplication.class, args);&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private class MainFrameListener extends WindowAdapter {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;public void windowClosing(final WindowEvent e) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;exit(e);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;Se o aplicativo em questão contar com apenas um &lt;code&gt;JFrame&lt;/code&gt; principal, há a opção de criar uma subclasse concreta de &lt;code&gt;SingleFrameApplication&lt;/code&gt;, ao invés de estender &lt;code&gt;Application&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Os aplicativos devem ter um arquivo de propriedades com o mesmo nome da classe que estende &lt;code&gt;Application&lt;/code&gt; ou &lt;code&gt;SingleFrameApplication&lt;/code&gt; num subpacote denominado &lt;code&gt;resources&lt;/code&gt;. Esse &lt;code&gt;ResourceBundle&lt;/code&gt; irá compartilhar seus recursos por todo o aplicativo e deverá contar com as seguintes propriedades padrões:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:130%;"&gt;Application.name        = Nome do aplicativo&lt;br /&gt;Application.id          = Apropriado para identificadores específicos do aplicativo&lt;br /&gt;Application.title       = Título para dialogs e frames.&lt;br /&gt;Application.version     = Versão pode ser incorporada em mensagens&lt;br /&gt;Application.vendor      = Nome da organização/pessoa responsável pelo software&lt;br /&gt;Application.vendorId    = &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:130%;"&gt;Apropriado para identificadores específicos do aplicativo&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;Application.homepage    = Uma URL como http://rafaelfiume.wordpress.com&lt;br /&gt;Application.description = Breve descrição sobre o software.&lt;br /&gt;Application.lookAndFeel = system, default, ou uma classe LookAndFeel&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Estado da Sessão Persistente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É interessante manter o estado da interface gráfica entre sessões do aplicativo. Para isso existe a classe &lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;code&gt;SessionStorage&lt;/code&gt;. O estado da sessão é armazenado baseado em componentes, desde que estes tenham definidos a propriedade &lt;code&gt;name&lt;/code&gt; e uma classe &lt;code&gt;SessionState.Property&lt;/code&gt; equivalente.&lt;br /&gt;&lt;br /&gt;Por padrão, &lt;code&gt;SessionStorage&lt;/code&gt; possui implementações de &lt;code&gt;SessionState.Property&lt;/code&gt; para os componentes &lt;code&gt;Window&lt;/code&gt;,  &lt;code&gt;JTabbedPane&lt;/code&gt;,  &lt;code&gt;JSplitPane&lt;/code&gt;, e &lt;code&gt;JTable&lt;/code&gt;, armazenado as propriedades &lt;code&gt;bounds&lt;/code&gt; (posição e tamanho da janela) da classe &lt;code&gt;Rectangle&lt;/code&gt; para &lt;code&gt;Window's&lt;/code&gt;, &lt;code&gt;dividerLocation&lt;/code&gt; para &lt;code&gt;JSliderPane's&lt;/code&gt;, &lt;code&gt;selectedIndex&lt;/code&gt; para &lt;code&gt;JTabbedPane's&lt;/code&gt; e &lt;code&gt;width&lt;/code&gt; (tamanho das colunas) para &lt;code&gt;JTable's&lt;/code&gt;.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;code&gt;SessionStorage&lt;/code&gt; é obtido através do método &lt;code&gt;getSessionStorage&lt;/code&gt; de &lt;code&gt;ApplicationContext&lt;/code&gt;, um &lt;span style="font-style: italic;"&gt;Singleton&lt;/span&gt; utilizado para encontrar variáveis e serviços globais, o que corresponde a maior parte dos componentes do &lt;span style="font-style: italic;"&gt;Swing Application Framework&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Durante a inicialização do software (&lt;span style="font-style: italic;"&gt;startup&lt;/span&gt;), &lt;code&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;restore&lt;/code&gt; é chamado para restaurar o estado da sessão anterior da GUI. Ao encerrar a execução do programa (&lt;span style="font-style: italic;"&gt;shutdown&lt;/span&gt;), &lt;code&gt;store&lt;/code&gt; é invocado para persisitir a sessão atual da GUI.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;protected void startup() {&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;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;ApplicationContext.getInstance()&lt;span style="font-weight: bold;"&gt;.getSessionStorage().&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;restore(mainFrame, "session.xml");&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;span style="color: rgb(0, 0, 153);"&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(0, 0, 153);"&gt;@Override&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;protected void shutdown() {&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;span style="color: rgb(0, 0, 153);"&gt;ApplicationContext.getInstance()&lt;span style="font-weight: bold;"&gt;.getSessionStorage().&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;save(mainFrame, "session.xml");&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;span style="color: rgb(0, 0, 153);"&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;O estado da sessão é armazenado a partir do diretório do usuário. As propriedades &lt;code&gt;vendorId&lt;/code&gt; e &lt;code&gt;applicationId&lt;/code&gt; (veja a seção &lt;u&gt;Inicialização e Gerenciamento do Ciclo de Vida de Aplicativos&lt;/u&gt;) devem estar definidas para garantir que o diretório correto  seja acessado em diferentes plataformas (de acordo com a seção &lt;u&gt;Persistência Local&lt;/u&gt;, logo abaixo).&lt;br /&gt;&lt;br /&gt;A classe &lt;code&gt;SingleFrameApplication&lt;/code&gt; implementa rotinas para persistir / restaurar o estado da sessão da GUI, inclusive de janelas secundárias, como &lt;span style="font-style: italic;"&gt;dialogs&lt;/span&gt;, livrando o programador dessa tarefa.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Persistência Local&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;SessionStorage&lt;/code&gt; utiliza a classe &lt;code&gt;LocalStorage&lt;/code&gt; para persistir / restaurar um &lt;code&gt;java.util.Map&lt;/code&gt; com dados sobre o estado da GUI numa sessão, por meio de seus métodos &lt;code&gt;save&lt;/code&gt; e &lt;code&gt;load&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void save(Component root, String fileName) throws IOException {&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;span style="color: rgb(0, 0, 153);"&gt;LocalStorage lst = ApplicationContext.getInstance()&lt;span style="font-weight: bold;"&gt;.getLocalStorage()&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;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;lst.save(stateMap, fileName);&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(0, 0, 153);"&gt;public void restore(Component root, String fileName) throws IOException {&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;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;LocalStorage lst = ApplicationContext.getInstance()&lt;span style="font-weight: bold;"&gt;.getLocalStorage()&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;span style="color: rgb(0, 0, 153);"&gt;Map&lt;string,&gt; stateMap = (Map&lt;string,&gt;) (&lt;span style="font-weight: bold;"&gt;lst.load(fileName)&lt;/span&gt;);&lt;/string,&gt;&lt;/string,&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;span style="color: rgb(0, 0, 153);"&gt;. . .&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;&lt;code&gt;LocalStorage&lt;/code&gt; deve ser obtido através do método &lt;code&gt;getLocalStorage&lt;/code&gt; de &lt;code&gt;ApplicationContext&lt;/code&gt;, e pode ser utilizado para persistir / restaurar outros dados, desde que estejam de acordo com os mecanismos da API &lt;span style="font-style: italic;"&gt;Java Beans Persistence&lt;/span&gt;, o que inclui &lt;span style="font-style: italic;"&gt;Java Beans&lt;/span&gt;, bem como a maioria dos tipos primitivos. O método &lt;code&gt;save&lt;/code&gt; é implementado com a ajuda de &lt;code&gt;java.beans.XMLEncoder&lt;/code&gt;, enquanto &lt;code&gt;load&lt;/code&gt; utiliza &lt;code&gt;java.beans.XMLDecoder&lt;/code&gt;.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Como visto na seção acima &lt;u&gt;Estado da Sessão Persistente&lt;/u&gt;, as propriedades &lt;code&gt;vendorId&lt;/code&gt; e &lt;code&gt;applicationId&lt;/code&gt; devem estar definidas para garantir que o diretório correto  seja acessado em diferentes plataformas. O diretório onde os dados serão persistidos dependem do sistema operacional. No Windows esse diretório poderá ser:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;${userHome}\Application Data\${vendorId}\${applicationId}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;no Mac OS X:&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;code&gt;${userHome}/Library/Application Support/${applicationId}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;por fim, em sistemas UNIX e derivados será:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;${userHome}/.${applicationId}/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Cenas dos Próximos Capítulos...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nas partes seguintes serão explicadas as funcionalidades de Injeção de Recursos, definição de &lt;span style="font-style: italic;"&gt;Actions&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;Tasks&lt;/span&gt; (tarefas que executam em &lt;span style="font-style: italic;"&gt;background&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fontes e Referências utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework Home Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=296"&gt;JSR 296: Swing Application Framework&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Javadoc e código fonte do Swing Application Framework&lt;/li&gt;&lt;li&gt;&lt;a href="https://appframework.dev.java.net/intro/index.html"&gt;An Introduction to Swing Application Framework API (JSR-296)&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-3529659837517331391?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/3529659837517331391/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=3529659837517331391&amp;isPopup=true' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3529659837517331391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3529659837517331391'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/05/swing-application-framework-jsr-296.html' title='Swing Application Framework (JSR-296) - Parte 1'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-6319618641791071568</id><published>2007-05-21T04:40:00.000-03:00</published><updated>2007-05-28T22:52:53.553-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Básico'/><title type='text'>Por que Utilizar a Commons Lang?</title><content type='html'>A definição dos objetivos da Commons Lang, que você encontra no &lt;a href="http://jakarta.apache.org/commons/lang/"&gt;sítio do projeto&lt;/a&gt;, é algo como:&lt;br /&gt;&lt;blockquote&gt;[...] prover um conjunto de utilitários para a &lt;span style="font-style: italic;"&gt;java.lang API&lt;/span&gt;, particularmente métodos para manipulação de &lt;span style="font-style: italic;"&gt;Strings&lt;/span&gt;, métodos numéricos básicos, operações para criação e serialização e obtenção de propriedades do sis&lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;tem&lt;/span&gt;a. Além disso, disponibiliza &lt;span style="font-style: italic;"&gt;enum&lt;/span&gt; com suporte a herança, uma estrutura de exceções com suporte à múltiplas exceções aninhadas, alguns aperfeiçoamentos para &lt;span style="font-style: italic;"&gt;java.util.Date&lt;/span&gt; e utilitários para a contrução apropriada dos métodos  &lt;span style="font-style: italic;"&gt;hashCode,&lt;/span&gt; &lt;span style="font-style: italic;"&gt;toString&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;equals&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;compareTo&lt;/span&gt;.&lt;br /&gt;&lt;/blockquote&gt;O ponto de partida para a &lt;a href="http://jakarta.apache.org/commons/lang/"&gt;Commons Lang&lt;/a&gt; é que a &lt;a href="http://java.sun.com/javase/6/docs/api/"&gt;Java API&lt;/a&gt; deveria fornecer métodos básicos para&lt;span class="fullpost"&gt; a manipulação de suas classes principais, tarefa essa que foi "jogada" à mão dos desenvolvedores. Trata-se então de um &lt;span style="font-style: italic;"&gt;toolkit&lt;/span&gt; com propósito específico e muito bem definido, que é prover essas funcionalidades básicas faltantes.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Builder&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A API &lt;span style="font-style: italic;"&gt;org.apache.commons.lang.builder&lt;/span&gt; está entre as mais úteis por auxiliar na construção de métodos &lt;span style="font-style: italic;"&gt;hashCode,&lt;/span&gt; &lt;span style="font-style: italic;"&gt;toString&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;equals&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;compareTo&lt;/span&gt; consistentes. As principais classes desse pacote são, respectivamente, &lt;span style="font-style: italic;"&gt;HashCodeBuilder&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;ToStringBuilder&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;EqualsBuilder&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;CompareToBuilder&lt;/span&gt;, que seguem as regras propostas pelo livro &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;Veja a API &lt;span style="font-style: italic;"&gt;org.apache.commons.lang.builder&lt;/span&gt; em ação e seus benefícios em &lt;a href="http://rfiume.blogspot.com/2007/05/gerao-de-mtodos-hashcode-equals.html"&gt;Geração de Métodos hashCode,  equals,  toString e  compareTo no NetBeans&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Enums&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Utilize a API &lt;span style="font-style: italic;"&gt;org.apache.commons.lang.enums&lt;/span&gt; caso precise de enums e não tenha acesso ao JDK 5.0 ou superior, ou ainda, se precisar criar uma hierarquia de enums (superclasse/subclasses).&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-style: italic;"&gt;Enum&lt;/span&gt; é abstrata e segue o padrão &lt;span style="font-style: italic;"&gt;Typesafe Enum&lt;/span&gt; descrito no i&lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;tem&lt;/span&gt; 21 do livro &lt;a href="http://java.sun.com/docs/books/effective/"&gt;&lt;i&gt;Effective Java&lt;/i&gt;&lt;/a&gt;. Eis um exemplo de seu uso, retirado do Javadoc:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public final class ColorEnum extends Enum {&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 static final ColorEnum RED = new ColorEnum("Red");&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public static final ColorEnum GREEN = new ColorEnum("Green");&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;span style="color: rgb(0, 0, 153);"&gt;public static final ColorEnum BLUE = new ColorEnum("Blue");&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;private ColorEnum(String color) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;super(color);&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;&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;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public static ColorEnum getEnum(String color) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;return (ColorEnum) getEnum(ColorEnum.class, color);&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;&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(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public static Map getEnumMap() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return getEnumMap(ColorEnum.class);&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;&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(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public static List getEnumList() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;return getEnumList(ColorEnum.class);&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public static Iterator iterator() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;return iterator(ColorEnum.class);&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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="font-style: italic;"&gt;ValuedEnum&lt;/span&gt;, abstrata, é utilizada para criação de &lt;span style="font-style: italic;"&gt;Typesafe Enums&lt;/span&gt; com valores inteiros, propícios para uso dentro de declarações &lt;span style="font-style: italic;"&gt;switch&lt;/span&gt;. A terceira classe desse pacote é a &lt;span style="font-style: italic;"&gt;EnumUtils&lt;/span&gt;, que fornece operações para acessar e manipular &lt;span style="font-style: italic;"&gt;Enums&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Enums&lt;/span&gt; podem ser extendidos e ter funcionalidades. Consulte o Javadoc para maiores informações.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Exception&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O pacote &lt;span style="font-style: italic;"&gt;org.apache.commons.lang.exception&lt;/span&gt;&lt;span&gt; oferece exceções aninhadas (&lt;/span&gt;&lt;span style="font-style: italic;"&gt;nested exception&lt;/span&gt;) para quem utilizar versões anteriores à JDK 1.4. &lt;span style="font-style: italic;"&gt;Nested exceptions&lt;/span&gt; permi&lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;tem&lt;/span&gt; que informações sobre as origens de uma exceção não se perca quando for preciso jogar (&lt;span style="font-style: italic;"&gt;throw&lt;/span&gt;) uma nova exceção, empacotando a original na nova excessão.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;A classe &lt;span style="font-style: italic;"&gt;ExceptionUtils&lt;/span&gt; contém operações para manipular e examinar objetos &lt;span style="font-style: italic;"&gt;Throwable&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Dentro do pacote &lt;span style="font-style: italic;"&gt;org.apache.commons.lang&lt;/span&gt; estão presentes exceções interessantes: &lt;span style="font-style: italic;"&gt;IllegalClassException&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;IncompleteArgumentException&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;NotImplementedException&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;NullArgumentException&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;SerializationException&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;UnhandledException&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Math&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A API &lt;span style="font-style: italic;"&gt;org.apache.commons.lang.math&lt;/span&gt; extende a API &lt;span style="font-style: italic;"&gt;java.math&lt;/span&gt; e tem propósitos financeiros, e não científicos. Conta com as classes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Range&lt;/span&gt;. Classe abstrata, representa um conjunto inclusivo de números do mesmo tipo.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;IntRange, LongRange, FloatRange&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;DoubleRange&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;NumberRange&lt;/span&gt;. Representam um conjunto inclusivo de &lt;span style="font-style: italic;"&gt;ints&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;longs&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;floats&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;doubles&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;java.lang.Numbers&lt;/span&gt;, respectivamente, imutáveis e serializáveis.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Fraction&lt;/span&gt;. Subclasse de &lt;span style="font-style: italic;"&gt;java.langNumber&lt;/span&gt;, representa corretamente uma fração. É imutável.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;JVMRandom&lt;/span&gt;. Um &lt;span style="font-style: italic;"&gt;wrapper&lt;/span&gt;, opera a partir de &lt;span style="font-style: italic;"&gt;random()&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;java.lang.Math&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;NumberUtils&lt;/span&gt;. Provê funcionalidades adicionais para subclasses de &lt;span style="font-style: italic;"&gt;java.lang.Number&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;Mutable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O pacote &lt;span style="font-style: italic;"&gt;org.apache.commons.lang.Mutable&lt;/span&gt; fornece &lt;span style="font-style: italic;"&gt;wrappers&lt;/span&gt; mutáveis para os tipos de dados primitivos e para &lt;span style="font-style: italic;"&gt;java.lang.Object&lt;/span&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Mutable&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;Wrappers&lt;/span&gt; para tipos de dados primitivos ou objetos mutáveis devem implementar essa interface.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;MutableBoolean&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;MutableByte&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;MutableShort&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;MutableInt&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;MutableLong&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;MutableFloat&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;MutableLong&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;MutableObject&lt;/span&gt;. Subclasses de &lt;span style="font-style: italic;"&gt;java.lang.Number&lt;/span&gt;, implementam &lt;span style="font-style: italic;"&gt;Mutable&lt;/span&gt;, são &lt;span style="font-style: italic;"&gt;wrappers&lt;/span&gt; mutáveis e comparáveis para &lt;span style="font-style: italic;"&gt;booleans&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;bytes&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;shorts&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;ints&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;longs&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;floats&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;doubles&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;java.lang.Object,&lt;/span&gt; respectivamente.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Text&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Praticamente uma pequena extensão de &lt;span style="font-style: italic;"&gt;java.text&lt;/span&gt;, as classes do pacote &lt;span style="font-style: italic;"&gt;org.apache.commons.lang.text&lt;/span&gt; são desenhadas para manipular texto:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;CompositeFormat&lt;/span&gt;. Formata utilizando um &lt;span style="font-style: italic;"&gt;java.text.Format&lt;/span&gt; e processa (&lt;span style="font-style: italic;"&gt;parse&lt;/span&gt;) utizando outro.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;StrBuilder&lt;/span&gt;. Um implementação alternativa para &lt;span style="font-style: italic;"&gt;StringBuffer&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;StringBuilder&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;StrBuilder&lt;/span&gt; no entanto: 1) não é final; 2) não é sincronizada; 3) permite às suas subclasses acesso ao seu array interno de caracteres; 4) fornece interessantes métodos adicionais, como &lt;span style="font-style: italic;"&gt;size&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;clear&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;isEmpty&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;replace&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;appendWithSeparators&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;StrLookup&lt;/span&gt;. Classe base (abstrata) para implementar &lt;acronym title="procura"&gt;lookup&lt;/acronym&gt; de um valor String a partir de  uma chave String. Contém uma implementação, &lt;span style="font-style: italic;"&gt;MapStrLookup&lt;/span&gt;, que utiliza &lt;span style="font-style: italic;"&gt;java.util.Map&lt;/span&gt; e pode ser obtida através de um de seus métodos factory.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;StrMatcher&lt;/span&gt;. Classe abstrata utilizada para obter a quantidade de caracteres que "ba&lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;tem&lt;/span&gt;" (&lt;span style="font-style: italic;"&gt;match&lt;/span&gt;) com um array de caracteres. Contém várias implementações, como &lt;span style="font-style: italic;"&gt;StringMatcher&lt;/span&gt;, e seus correspondentes métodos &lt;span style="font-style: italic;"&gt;factory&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;StrSubstitutor&lt;/span&gt;. Utilizada para substituir variáveis dentro de uma String por seus respectivos valores, definidos previamente.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;StrTokenizer&lt;/span&gt;. Alternativa ao &lt;span style="font-style: italic;"&gt;java.util.StringTokenizer&lt;/span&gt;, implementa &lt;span style="font-style: italic;"&gt;java.util.ListIterator&lt;/span&gt; e &lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;tem&lt;/span&gt; outros funcionalidades úteis.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Time&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;org.apache.commons.lang.Time&lt;/span&gt; tem classes auxiliares para tratamento de datas e períodos de tempo.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;DateFormatUtils&lt;/span&gt;. Possui constantes e métodos utilitários (i.e. estáticos) para formatação de datas. No geral, essa classe não é muito interessante para softwares ambientados fora dos Estados Unidos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;DateUtils&lt;/span&gt;. Conta com constantes e métodos utilitários para lidar com objetos &lt;span style="font-style: italic;"&gt;java.util.Calendar&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;java.util.Date&lt;/span&gt;, como &lt;span style="font-style: italic;"&gt;addDays&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;isSameDay&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;iterators&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;DurationFormatUtils&lt;/span&gt;. Possui constantes e métodos utilitários para formatação de períodos de tempo. &lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;FastDateFormat&lt;/span&gt;. Uma alternativa mais rápida e &lt;span style="font-style: italic;"&gt;thread-safe&lt;/span&gt; à &lt;span style="font-style: italic;"&gt;java.text.SimpleDateFormat&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;StopWatch&lt;/span&gt;. Abstrai um cronômetro. Se precisar de um, utilize essa classe.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Diversos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O pacote &lt;span style="font-style: italic;"&gt;org.apache.commons.lang&lt;/span&gt;, além das API's citadas acima, possui diverssas classes utilitárias.&lt;br /&gt;&lt;br /&gt;Se precisar lidar constantemente com propriedades do sistema, como diretório do usuário, versão da JDK, do sistema operacional, entre outras tantas, utilize &lt;span style="font-style: italic;"&gt;Sys&lt;/span&gt;&lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline; font-style: italic;font-size:inherit;color:black;"  &gt;tem&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Utils&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;SerializationUtils&lt;/span&gt;, que junto com as classes do pacote &lt;span style="font-style: italic;"&gt;builder&lt;/span&gt; é uma das mais interessantes e úteis, auxilia no processo de serialização/desserialização, com métodos simples e diretos como &lt;span style="font-style: italic;"&gt;serialize&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;deserialize&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Validate&lt;/span&gt; proporciona um código fonte mais limpo ajudando a validar argumentos, como &lt;span style="font-style: italic;"&gt;Collections&lt;/span&gt;, com métodos do gênero &lt;span style="font-style: italic;"&gt;notNull&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;notEmpty&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Como sempre, consulte o Javadoc para outras e mais completas informações.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Propósito Geral vs. Propósito Específico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Diferente do que ocorre com &lt;span style="font-style: italic;"&gt;frameworks&lt;/span&gt; ou bibliotecas de propósito geral, a Commons Lang &lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; display: inline;font-size:inherit;color:black;"  &gt;tem&lt;/span&gt; tamanho reduzido (o .jar tem apenas 239,5 KB), é fácil de entender e simples de usar, por ser pequena, ter escopo bem definido, ser auto-documentada e não precisar de toneladas de configuração.&lt;br /&gt;&lt;br /&gt;Nesse aspecto, caso semelhante ao da Commons Lang é a &lt;acronym title="Swing Application Framework"&gt;JSR-296&lt;/acronym&gt;, cujo tamanho e propósito - ao contrário da plataforma NetBeans por exemplo, que busca abraçar o mundo - também é limitado (i.e. definido, específico).&lt;br /&gt;&lt;br /&gt;Particularmente, prefiro &lt;span style="font-style: italic;"&gt;toolkits&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;frameworks&lt;/span&gt; especialistas, pois a curva de aprendizado fica reduzida a horas ao invés de meses, há pouco &lt;span style="font-style: italic;"&gt;bugs&lt;/span&gt;, sempre mais simples de corrigir, e há maior produtividade.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fontes utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jakarta.apache.org/commons/lang/"&gt;Commons Lang Home Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Javadoc e código fonte da Commons Lang&lt;/li&gt;&lt;li&gt;&lt;a href="http://c2.com/ppr/wiki/JavaIdioms/NestedException.html"&gt;Nested Exception&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-6319618641791071568?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6319618641791071568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6319618641791071568'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/05/por-que-utilizar-commons-lang.html' title='Por que Utilizar a Commons Lang?'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></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='http://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:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-8132967100785676080</id><published>2007-04-10T03:13:00.000-03:00</published><updated>2007-04-10T03:11:20.170-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3.0'/><title type='text'>Service Locator Não Morreu</title><content type='html'>&lt;span style="font-style: italic;"&gt;Dependency injection&lt;/span&gt; figura entre as principais novidades do EJB 3.0. Com a DI é possível aos clientes obter acesso à componentes apenas declarando suas dependências. (Para saber mais sobre injeção de dependência, veja &lt;a href="http://rfiume.blogspot.com/2007/03/pequena-introduo-dependency-injection.html"&gt;Pequena Introdução à Dependency Injection&lt;/a&gt; e &lt;a href="http://rfiume.blogspot.com/2007/04/o-papel-da-dependency-injection-no-ejb.html"&gt;O Papel da Dependency Injection no EJB 3.0&lt;/a&gt;.)&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Por exemplo, para acessar os serviços de um componente EJB utlizando a DI, teremos algo como:&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;@EJB&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private ProdutoDAO produtoDAO;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O container EJB se encarrega de injetar a referência à ProdutoDAO, liberando o cliente de ProdutoDAO da responsabilidade de procurar, inicializar e instanciar componentes.&lt;br /&gt;&lt;br /&gt;Porém, no EJB 3.0, o uso de DI está limitado aos &lt;span style="font-style: italic;"&gt;managed components&lt;/span&gt;, como &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;data sources&lt;/span&gt;. Para localizar e acessar outros componentes, por exemplo classes auxiliares, ainda é necessário o uso de &lt;span style="font-style: italic;"&gt;service locators&lt;/span&gt; ou, se realmente for preciso injeção de dependências, utilizar &lt;span style="font-style: italic;"&gt;frameworks&lt;/span&gt; como &lt;a href="http://www.picocontainer.org/"&gt;PicoContainer&lt;/a&gt; e &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Service Locator&lt;/span&gt; é outra solução para localizar e acessar componentes de maneira transparente e retirar dos clientes o peso dessa responsabilidade. Um &lt;span style="font-style: italic;"&gt;service locator&lt;/span&gt; centraliza o mecanismo de procura e acesso, evitando a duplicação de código, degradação de desempenho, dificuldade de manutenção e dependência de fornecedor.&lt;br /&gt;&lt;br /&gt;No contexto do J2EE e do Java EE, o &lt;span style="font-style: italic;"&gt;service locator&lt;/span&gt; é implementado utilizando a API JNDI. Felizmente, seu uso foi simplificado no Java EE 5, em comparação com o J2EE 1.4.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-style: italic;"&gt;Application Client&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O uso de DI em &lt;span style="font-style: italic;"&gt;application clients&lt;/span&gt; executando sobre o &lt;span style="font-style: italic;"&gt;application container&lt;/span&gt; está limitado à variáveis estáticas no método &lt;span style="font-style: italic;"&gt;main&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class AppClient {&lt;/span&gt;&lt;br /&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;@EJB&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;span style="color: rgb(0, 0, 153);"&gt;private static ProdutoDAO produtoDAO;&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;public static void main(String[] args) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;System.out.println("Criando produto... ");&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Produto abacaxi = new Produto();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;abacaxi.setNome("Abacaxi");&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;abacaxi.setDescricao("Fruta tropical, Gíria pra problemas.");&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;abacaxi.setPreco(new BigDecimal("4.56"));&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;System.out.println("Armazenando produto...");&lt;br /&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;produtoDAO.create(abacaxi);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;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;&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&gt;&lt;br /&gt;&lt;br /&gt;Em todos os outros casos, incluindo clientes &lt;span style="font-style: italic;"&gt;stand alone&lt;/span&gt; (i.e., não executam sobre o &lt;span style="font-style: italic;"&gt;application container&lt;/span&gt;), é preciso utilizar a API JNDI para localizar e acessar componentes. Conclusão: &lt;span style="font-style: italic;"&gt;application clients&lt;/span&gt; não se beneficam em nada da injeção de dependência advinda com o EJB 3.0.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Uma Nota Sobre &lt;span style="font-style: italic;"&gt;Inversion of Control&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dependency Injection&lt;/span&gt; é uma forma de &lt;span style="font-style: italic;"&gt;Inversion of Control&lt;/span&gt;, já que o cliente apenas declara suas dependências e deixa ao container a tarefa de injetar esses componentes no cliente. &lt;span style="font-style: italic;"&gt;Service Locator&lt;/span&gt; não é uma forma de IoC, pois o cliente ainda deve obter componentes e serviços, mesmo que com a ajuda de um &lt;span style="font-style: italic;"&gt;Service Locator&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&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/03/sobre-ejb-30.html"&gt;Pequena Introdução ao EJB 3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/04/stateless-e-stateful-session-beans.html"&gt;Stateless e Stateful Session Beans&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/sobre-annotations-e-deployment.html"&gt;Sobre Annotations e Deployment Descriptors no EJB 3.0&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/pequena-introduo-dependency-injection.html"&gt;Pequena Introdução à Dependency Injection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/04/o-papel-da-dependency-injection-no-ejb.html"&gt;O Papel da Dependency Injection no EJB 3.0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Fontes Utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.onjava.com/pub/a/onjava/2006/01/04/dependency-injection-java-ee-5.html"&gt;Using Dependency Injection in Java EE 5.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html"&gt;Core J2EE Patterns - Service Locator&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-8132967100785676080?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/8132967100785676080/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=8132967100785676080&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8132967100785676080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8132967100785676080'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/04/service-locator-no-morreu.html' title='Service Locator Não Morreu'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-4508370225135280125</id><published>2007-04-02T04:49:00.000-03:00</published><updated>2007-05-07T17:51:27.060-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outros...'/><title type='text'>Waldemar Fiume - Campeão Mundial de Interclubes</title><content type='html'>&lt;span style="font-size:130%;"&gt;Autor: Felipe Fiume&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dia 29/03/2007 o Palmeiras foi oficialmente confirmado pela FIFA, entidade máxima de futebol, como Campeão Mundial de Clubes. O time bateu campeões internacionais como o Olympique Nice (Campeão Francês 1950/51), o Estrela Vermelha (Campeão Iuguslavo 1950/51), o Vasco (Campeão Carioca de 1951) na semifinal, e na final derrotou o poderoso Juventus (campeão italiano de 1950/51).&lt;br /&gt;&lt;br /&gt; O reconhecimento oficial da conquista vem glorificar ainda mais a carreira de um dos maiores ídolos da história do Palmeiras, Waldemar Fiume&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt; O Pai da Bola (apelido recebido por sua habilidade) fez 601 jogos com a camisa do Palmeiras em 18 anos de clube. Começou a carreira como meia direita e depois passou a atuar mais recuado, primeiro na média central e depois na quarta zaga. Foi tetracampeão paulista (1942,1944,1947,1950), campeão do torneio Rio São Paulo (1951) e Campeão Mundial de Clubes.&lt;br /&gt;&lt;br /&gt; Fiume era um jogador versátil, habilidoso e disciplinado taticamente. Foi convocado várias vezes para a seleção paulista, porém não teve oportunidade de jogar uma Copa do Mundo. A CBD (Confederação Brasileira de Desportos, hoje CBF) era sediada no Rio e dava preferência para jogadores dos clubes cariocas. Na Copa de 1950, por exemplo, havia oito jogadores vascaínos e apenas três do Palmeiras. Por ironia, praticamente o mesmo Vasco foi derrotado em 1951 na semifinal do Mundial de Clubes pelo Palmeiras.&lt;br /&gt;&lt;br /&gt;Na final contra o Juventus de Turim, todos os brasileiros torciam a favor do Palmeiras, já que a vitória tiraria um pouco do gosto amargo deixado pelo vice no Mundial de 1950. Apesar de Waldemar Fiume não ter jogado os jogos contra o Vasco por estar contudido, por tudo que ele fez no Futebol Paulista e pela hegemonia do Palmeiras em 1950-1951, fica a impressão de que poderia ter sido muito útil à Seleção caso tivesse tido chance de representá-la.&lt;br /&gt;&lt;br /&gt;Apesar de não ter servido a Seleção Brasileira, a carreira desse jogador foi brilhante. Tanto que hoje possui um busto na Sociedade Esportiva Palmeiras. Em 1995, ao ir ao Parque Antártica assistir a uma partida do Palmeiras, Fiume ainda era reconhecido e cercado por vários torcedores que se aglomeravam para cumprimentá-lo. Prova de seu brilhantismo e digno de um Campeão Mundial de Clubes.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-4508370225135280125?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/4508370225135280125/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=4508370225135280125&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4508370225135280125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4508370225135280125'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/04/waldemar-fiume-campeo-mundial-de.html' title='Waldemar Fiume - Campeão Mundial de Interclubes'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-7766508422152984287</id><published>2007-03-29T08:36:00.000-03:00</published><updated>2007-03-29T22:11:21.554-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3.0'/><title type='text'>Pequena Introdução à Dependency Injection</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;/span&gt;Um software é composto por uma série de componentes que interagem e colaboram entre si. Tais componentes podem ser classificados como &lt;span style="font-style: italic;"&gt;clientes&lt;/span&gt;, que dependem de outros componentes para cumprir seus objetivos, e &lt;span style="font-style: italic;"&gt;os provedores de serviços&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;services&lt;/span&gt;, ou ainda, &lt;span style="font-style: italic;"&gt;server components&lt;/span&gt;), que executam tarefas conforme requisitados pelos &lt;span style="font-style: italic;"&gt;clientes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Para que clientes utilizem serviços é preciso, antes, encontrar (&lt;span style="font-style: italic;"&gt;look up&lt;/span&gt;), e instanciar&lt;span class="fullpost"&gt; os provedores de serviços. Deixar essa tarefa sob incumbência do cliente pode não ser a melhor opção.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dependency Injection&lt;/span&gt; (DI) é uma forma moderna e eficaz de "plugar" serviços nos clientes, deixando o trabalho de procura, instanciação e inicialização para o responsável pela DI. Dessa forma, os clientes apenas precisam declarar suas dependências para que os serviços sejam injetados nos mesmos, em tempo de execução, &lt;span style="font-style: italic;"&gt;thread safety&lt;/span&gt; e sem utilizar API's.&lt;br /&gt;&lt;br /&gt;A implementação da &lt;span style="font-style: italic;"&gt;injeção de dependência&lt;/span&gt; pode ser feita através de código próprio ou por containers, como &lt;a href="http://www.springframework.org/"&gt;Spring Framework&lt;/a&gt;, &lt;a href="http://picocontainer.codehaus.org/"&gt;PicoContainer&lt;/a&gt;, &lt;a href="http://hivemind.apache.org/"&gt;HiveMind&lt;/a&gt;, &lt;a href="http://www.opensymphony.com/xwork/"&gt;XWork&lt;/a&gt; e &lt;a href="http://java.sun.com/products/ejb/"&gt;EJB&lt;/a&gt; 3.0.&lt;br /&gt;&lt;br /&gt;O container sabe qual componente deve ser injetado através de arquivos de configuração XML, assinatura de métodos (propriedades JavaBeans ou construtores) ou metadados. Há outros meios mais incomuns para isso, como através de interfaces (&lt;span style="font-style: italic;"&gt;type &lt;/span&gt;1 IoC).&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Benefícios da &lt;span style="font-style: italic;"&gt;Dependency Injection&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Componentes mais fáceis de manter, justamente por dispensar lógica para ter acesso aos &lt;span style="font-style: italic;"&gt;services&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Dependências são explicitas e evidentes, tornando o código-fonte mais claro e o desenvolvimento mais simples&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Maior facilidade para fazer testes de unidade&lt;/li&gt;&lt;li&gt;Preserva &lt;a href="http://en.wikipedia.org/wiki/Strong_typing"&gt;&lt;span style="font-style: italic;"&gt;strong typing&lt;/span&gt;&lt;/a&gt;, eliminando os riscos de &lt;a href="http://download.java.net/jdk/jdk-api-localizations/jdk5-api-pt-br/builds/latest/html/pt_BR/api/java/lang/ClassCastException.html"&gt;&lt;span style="font-style: italic;"&gt;ClassCastException&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;E Sobre IoC ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://martinfowler.com/bliki/InversionOfControl.html"&gt;Inversion of Control&lt;/a&gt; (IoC) é um termo genérico para um padrão onde o controle e responsabilidade de uma atividade é invertido entre os participantes. Esse conceito é, por vezes, chamado divertidamente de &lt;a href="http://en.wikipedia.org/wiki/Hollywood_Principle"&gt;&lt;span&gt;Princípio de Hollywood&lt;/span&gt;&lt;/a&gt;: &lt;span style="font-style: italic;"&gt;"Don't call us, We'll call you"&lt;/span&gt;, ou, em português, &lt;span style="font-style: italic;"&gt;"Não nos telefone; Nós ligaremos para você"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dependency Injection&lt;/span&gt; é uma forma mais específica de IoC, cujo objetivo é eliminar dependências explicitas entre componentes e "externalizar" dos clientes a rotina para acesso aos provedores de serviços.&lt;br /&gt;&lt;br /&gt;Ao invés do cliente executar a lógica necessária para obter uma referência ao &lt;span style="font-style: italic;"&gt;service&lt;/span&gt; do qual é dependente para executar suas tarefas, o container se encarrega de obter e injetar esse componente no cliente. Daí a inversão de controle.&lt;br /&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/03/sobre-ejb-30.html"&gt;Pequena Introdução ao EJB 3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/sobre-annotations-e-deployment.html"&gt;Sobre Annotations e Deployment Descriptors no EJB 3.0&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fontes Utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;Inversion of Control Containers and the Dependency Injection Pattern&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=IOCBeginners"&gt;A Begginers Guide to Dependency Injection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.onjava.com/pub/a/onjava/2006/01/04/dependency-injection-java-ee-5.html"&gt;Using Dependency Injection in Java EE 5.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework"&gt;Introduction to the Spring Framework&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-7766508422152984287?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7766508422152984287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7766508422152984287'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/pequena-introduo-dependency-injection.html' title='Pequena Introdução à Dependency Injection'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-6614267256280909492</id><published>2007-03-28T11:12:00.000-03:00</published><updated>2007-03-28T20:57:25.450-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Look and Feel'/><title type='text'>Synthetica Look and Feel</title><content type='html'>Synthetica é um &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; baseado no &lt;a href="http://javadesktop.org/articles/synth/index.html"&gt;Synth&lt;/a&gt;, o que permite que seja modificado até mesmo por não programadores, através de arquivos XML. É possível conhecer as possiblidades do Synthetica por meio do demo disponibilizado pela &lt;a href="http://www.javasoft.de/jsf/secured/start"&gt;JavaSoft&lt;/a&gt;. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.javasoft.de/downloads/public/syntheticaaddons/demoCenter.jnlp"&gt;&lt;img center="" cursor="" pointer="" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RfhovEXwWQI/AAAAAAAAAiA/2jt5bAzexT8/s320/webstart.png" alt="" id="BLOGGER_PHOTO_ID_5041894940677789954" align="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O demo do Synthetica é interessante porque, além de mostrar diversos temas disponíveis&lt;span class="fullpost"&gt;, possui exemplos de uma série de extensões de componentes Swing, como &lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt; e &lt;a href="https://flexdock.dev.java.net/"&gt;Flexdoc&lt;/a&gt;, juntamente com o código-fonte desses exemplos.&lt;br /&gt;&lt;br /&gt;Para ser distribuído com aplicativos comerciais, uma licensa comercial deve ser adquirida. No caso de aplicativos não-comerciais, pode ser distribuído livremente.  Requer no mínimo &lt;a href="http://rfiume.blogspot.com/2007/01/java-virtual-machine-jre-jdk-e-java.html"&gt;JRE&lt;/a&gt; 1.5.&lt;br /&gt;&lt;br /&gt;Synthetica é, sem dúvida, um dos mais sofisticados &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; disponível no mercado.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Synthetica in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para fazer o &lt;span style="font-style: italic;"&gt;download&lt;/span&gt; do Synthetica, é preciso antes &lt;a href="http://www.javasoft.de/jsf/public/registration"&gt;registrar-se&lt;/a&gt; no sítio da JavaSoft. &lt;a href="http://rfiume.blogspot.com/2007/01/adicionando-uma-biblioteca-ao-classpath.html"&gt;Adicione a biblioteca ao classpath do projeto&lt;/a&gt; e utilize o método &lt;span style="font-style: italic;"&gt;setLookAndFeel(LookAndFeel laf),&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;UIManager&lt;/span&gt;, durante a execução de &lt;span style="font-style: italic;"&gt;main&lt;/span&gt; para alterar o &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt;.&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&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 SyntheticaStandardLookAndFeel());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ex.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;} catch (ParseException 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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ex.printStackTrace();&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;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rgp1XHRnLCI/AAAAAAAAAko/XlfSryH5Vb8/s1600-h/Synthetica.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rgp1XHRnLCI/AAAAAAAAAko/XlfSryH5Vb8/s320/Synthetica.png" alt="" id="BLOGGER_PHOTO_ID_5046975372372421666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Existem diversos temas disponíveis para o Synthetica, &lt;a href="http://www.javasoft.de/jsf/public/products/synthetica/themes"&gt;adquiridos separadamente&lt;/a&gt;, como o &lt;span style="font-style: italic;"&gt;Synthetica BlueMoon Look and Feel&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rgp0x3RnLAI/AAAAAAAAAkY/O23zquCvtzQ/s1600-h/Synthetica-BlueMoon.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rgp0x3RnLAI/AAAAAAAAAkY/O23zquCvtzQ/s320/Synthetica-BlueMoon.png" alt="" id="BLOGGER_PHOTO_ID_5046974732422294530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;..&lt;span style="font-style: italic;"&gt;. Synthetica GreenDream Look and Feel&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rgp1B3RnLBI/AAAAAAAAAkg/VO8NF73q0Zw/s1600-h/Synthetica-GreenDream.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rgp1B3RnLBI/AAAAAAAAAkg/VO8NF73q0Zw/s320/Synthetica-GreenDream.png" alt="" id="BLOGGER_PHOTO_ID_5046975007300201490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;... e o &lt;span style="font-style: italic;"&gt;Synthetica BlueIce Look and Feel&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rgp0onRnK_I/AAAAAAAAAkQ/u_7f2qZRCZg/s1600-h/Synthetica-BlueIce.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rgp0onRnK_I/AAAAAAAAAkQ/u_7f2qZRCZg/s320/Synthetica-BlueIce.png" alt="" id="BLOGGER_PHOTO_ID_5046974573508504562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Customização&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma das grandes vantagens do Synthetica é a possiblidade de customização, ou até criação de um novo tema, sem alterar o código-fonte, mas por meio de arquivos XML. Veja mais detalhes em &lt;a href="http://www.javalobby.org/java/forums/t73549.html"&gt;Customize Synthetica Look and Feel&lt;/a&gt; e &lt;a href="http://www.javasoft.de/jsf/public/products/synthetica/faq#q3"&gt;How Can I Customize an Existing Synthetica Look and Feel&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Também é possível alterar o &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; programaticamente através de propriedades UI padrões, utilizando o método estático &lt;span style="font-style: italic;"&gt;put(Object key, Object value)&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;UIManager&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Habilita o anti-aliasing&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;UIManager.put("Synthetica.text.antialias", Boolean.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;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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;UIManager.setLookAndFeel(new SyntheticaStandardLookAndFeel());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;catch (Exception 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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ex.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Veja a lista completa de propriedades UI que podem ser ajustadas ao utilizar o Synthetica &lt;a href="http://www.javasoft.de/jsf/public/products/synthetica/customize"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://www.javasoft.de/jsf/public/products/synthetica/faq"&gt;FAQ&lt;/a&gt; do Synthetica provê uma série de &lt;span style="font-style: italic;"&gt;How To's&lt;/span&gt; interessantes, com dicas para contornar possíveis problemas, customização e outras.&lt;br /&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://javadesktop.org/articles/synth/index.html"&gt;The Synth Look and Feel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javasoft.de/jsf/public/products/synthetica/features"&gt;Synthetica Features - lista de todas funcionalidades em cima do Synth.&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Veja mais sobre &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; em:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel.html"&gt;Look and Feel - Introdução&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel-jgoodies-looks.html"&gt;JGoodies Look and Feel&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel-napkin.html"&gt;Napkin L&amp;F&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/substance-look-and-feel.html"&gt;Substance Look and Feel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/skin-look-and-feel.html"&gt;Skin Look and Feel&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/look-and-feel-voc-conhece-o-nimbus.html"&gt;Nimbus Look and Feel&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fontes Utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javasoft.de/jsf/public/products/synthetica"&gt;Synthetica - The Extended Synth Look and Feel&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-6614267256280909492?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/6614267256280909492/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=6614267256280909492&amp;isPopup=true' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6614267256280909492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6614267256280909492'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/synthetica.html' title='Synthetica Look and Feel'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KYeHnrXYwPg/RfhovEXwWQI/AAAAAAAAAiA/2jt5bAzexT8/s72-c/webstart.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-4704409273036176344</id><published>2007-03-27T10:07:00.000-03:00</published><updated>2007-03-27T14:44:27.774-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wonderland e Ciência'/><title type='text'>Gigante Vermelha - O Início do Fim</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Aldebaran_e_sol.JPG/200px-Aldebaran_e_sol.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Aldebaran_e_sol.JPG/200px-Aldebaran_e_sol.JPG" alt="" border="0" /&gt;&lt;/a&gt;Durante os estágios finais de sua vida, uma estrela terá transformado quase todo o seu hidrogênio em hélio, que irá cada vez mais se acumular no seu centro. Com o fim do estoque de hidrogênio, a queima nuclear e, consequentemente, a força de expansão, proveniente do calor gerado pela fusão, cessa. Sem a força de expansão, ocorre o &lt;a href="http://pt.wikipedia.org/wiki/Colapso_gravitacional"&gt;colapso gravitacional&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A temperatura no núcleo pode atingir a impressionante marca dos 100 milhões °C e iniciar o processo de fusão de núcleos de hélio em núcleos maiores que, por sua vez, podem ser fundidos em outros ainda maiores, até o momento em que o processo de fusão resulte em núcleos de ferro (26 prótons e 32 nêutrons)&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;O centro da estrela, mais quente e mais denso, se expande, obrigando suas porções mais externas a expandirem-se também. O calor das regiões externas, nesse estágio, apesar de maior, fica diluído por toda a região ocupada pela estrela. Por isso, sua superfície é mais fria (cerca de 2500 °C), e a estrela emite apenas um brilho avermelhado. Daí o nome Gigante Vermelha.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RgkGFpbfkvI/AAAAAAAAAj4/sUJrB0IabJc/s1600-h/gigante_vermelha.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RgkGFpbfkvI/AAAAAAAAAj4/sUJrB0IabJc/s400/gigante_vermelha.png" alt="" id="BLOGGER_PHOTO_ID_5046571551535633138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Dependendo do tamanho da massa estelar, a Gigante Vermelha irá transformar-se numa &lt;a href="http://pt.wikipedia.org/wiki/An%C3%A3_branca"&gt;Anã Branca&lt;/a&gt;, Estrela de Nêutron ou Buraco Negro. Anãs Brancas com massa 1,4 superior a do Sol (&lt;a href="http://pt.wikipedia.org/wiki/Limite_de_Chandrasekhar"&gt;limite de Chandrasekhar&lt;/a&gt;) não resistem a pressão gravitacional e entram em colapso, tornando-se &lt;a href="http://pt.wikipedia.org/wiki/Estrela_de_n%C3%AAutrons"&gt;Estrela de Nêutron&lt;/a&gt; ou &lt;a href="http://pt.wikipedia.org/wiki/Buraco_negro"&gt;Buraco Negro&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/03/sol-um-reator-de-fuso-nuclear.html"&gt;&lt;span class="fullpost"&gt;Sol - Um Reator de Fusão Nuclear&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="fullpost"&gt;&lt;span style="font-weight: bold;"&gt;Esse artigo bebe das fontes:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pt.wikipedia.org/wiki/Isaac_Asimov"&gt;Isaac Asimov&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pt.wikipedia.org/wiki/Estrela_vermelha_gigante"&gt;Estrela Vermelha Gigante&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Imagem:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Na primeira figura, acima e à direita, &lt;a href="http://pt.wikipedia.org/wiki/Aldebar%C3%A3"&gt;Aldebarã&lt;/a&gt;, uma Gigante Vermelha, é comparada com o Sol.&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-4704409273036176344?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/4704409273036176344/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=4704409273036176344&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4704409273036176344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4704409273036176344'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/gigante-vermelha-o-incio-do-fim.html' title='Gigante Vermelha - O Início do Fim'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KYeHnrXYwPg/RgkGFpbfkvI/AAAAAAAAAj4/sUJrB0IabJc/s72-c/gigante_vermelha.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-6093713922297036281</id><published>2007-03-26T07:23:00.000-03:00</published><updated>2007-03-30T22:18:32.485-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3.0'/><title type='text'>Sobre Annotations e Deployment Descriptors no EJB 3.0</title><content type='html'>&lt;span style="font-style: italic;"&gt;Deployment&lt;/span&gt; é o conjunto de atividades que fazem com que um software, ou componentes de software, estejam prontos para uso. Durante o &lt;span style="font-style: italic;"&gt;deployment&lt;/span&gt;, o container EJB lê as configurações contidas no &lt;span style="font-style: italic;"&gt;deployment descriptor&lt;/span&gt; ou nas &lt;span style="font-style: italic;"&gt;annotations&lt;/span&gt; no código-fonte e prepara um ambiente padronizado para a execução dos &lt;span style="font-style: italic;"&gt;beans&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ou seja, o &lt;span style="font-style: italic;"&gt;&lt;acronym title="Arquivo padrão ejb-jar.xml"&gt;deployment descriptor&lt;/acronym&gt;&lt;/span&gt; especifica quais &lt;acronym title="Middleware services, como transaction, pooling, segurança e outros"&gt;serviços de infra-estrutura&lt;/acronym&gt; o container EJB proverá aos &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt;, desde que o &lt;span style="font-style: italic;"&gt;deployment&lt;/span&gt; seja feito num &lt;a href="http://en.wikipedia.org/wiki/J2EE#Java_EE_5_application_server_certified"&gt;container EJB certificado&lt;/a&gt;&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="font-style: italic;"&gt;Annotation&lt;/span&gt; (metadado)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Deployment descriptor&lt;/span&gt; é um arquivo XML, portanto propenso a erros, e acrescenta grande complexidade ao ciclo de vida de desenvolvimento. As &lt;span style="font-style: italic;"&gt;annottions&lt;/span&gt; para EJB foram introduzidas para ser uma alternativa aos &lt;span style="font-style: italic;"&gt;deployment descriptors&lt;/span&gt; e, conseqüentemente, aliviar o desenvolvedor da sua complexidade inerente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Annotation&lt;/span&gt;, ou metadado, é um elemento que pode ser adicionado a um pedaço de código para fornecer informações adicionais sobre esse código. A JSR-175 (A Metadata Facility for the Java Programming Language), íncluída no J2SE 5.0, fornece o meio para criação e processamento de &lt;span style="font-style: italic;"&gt;annotations&lt;/span&gt;. A &lt;acronym title="EJB 3.0"&gt;JSR-220&lt;/acronym&gt; definiu uma série de &lt;span style="font-style: italic;"&gt;annotations&lt;/span&gt; específicas para o desenvolvimento de &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Entretanto, &lt;span style="font-style: italic;"&gt;deployment descriptors&lt;/span&gt; não foram eliminados, nem estão ultrapassados. Foram mantidos como forma redundante de informação sobre o &lt;span style="font-style: italic;"&gt;deployment&lt;/span&gt; de um &lt;span style="font-style: italic;"&gt;enterprise bean&lt;/span&gt;; isto é, podem ser utilizados em conjunto com os metadados. Nesse caso, o &lt;span style="font-style: italic;"&gt;deployment descriptor&lt;/span&gt; tem precedência sobre a sua &lt;span style="font-style: italic;"&gt;annotation&lt;/span&gt; equivalente.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="font-style: italic;"&gt;Deployment Descriptors&lt;/span&gt; Proprietários&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Há certos serviços providos pelos containeres que são específicos de cada container EJB, indo além do que define a especificação JSR-220, como &lt;span style="font-style: italic;"&gt;clustering&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;load balancing&lt;/span&gt; - uma forma de diferenciação entre servidores Java EE.&lt;br /&gt;&lt;br /&gt;A configuração necessária para esses serviços é feita em &lt;span style="font-style: italic;"&gt;deployment descriptors&lt;/span&gt; proprietários. Esses serviços geralmente podem ser ajustados através de suas respectivas &lt;span style="font-style: italic;"&gt;annotation&lt;/span&gt;s, nesse caso, tornando o código-fonte não portável entre os diferentes servidores.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0); font-style: italic;"&gt;Annotations in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As duas figuras abaixo, retiradas do Apêndice 2 do livro &lt;span style="font-style: italic;"&gt;Mastering Enterprise JavaBeans 3.0&lt;/span&gt;, demonstram como os metadados ajudam a reduzir a complexidade do desenvolvimento de &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RgMd8NClUDI/AAAAAAAAAjg/lI7G9JehEhs/s1600-h/annotation.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RgMd8NClUDI/AAAAAAAAAjg/lI7G9JehEhs/s400/annotation.png" alt="" id="BLOGGER_PHOTO_ID_5044908927714938930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Perceba que as &lt;span style="font-style: italic;"&gt;annotations&lt;/span&gt; &lt;span style="font-style: italic;"&gt;@Stateful&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;@Remote&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;@Interceptors&lt;/span&gt; equivalem a 16 linhas de código XML de um &lt;span style="font-style: italic;"&gt;deployment descriptor&lt;/span&gt; equivalente. Além disso, os metadados são inerentemente ligados ao código-fonte, enquanto o &lt;span style="font-style: italic;"&gt;deployment descriptor&lt;/span&gt; é externo ao código.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RgMeHtClUEI/AAAAAAAAAjo/mORdjdEZwC0/s1600-h/deployment-descriptor.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RgMeHtClUEI/AAAAAAAAAjo/mORdjdEZwC0/s400/deployment-descriptor.png" alt="" id="BLOGGER_PHOTO_ID_5044909125283434562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Nem Tudo São Flores&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O uso de &lt;span style="font-style: italic;"&gt;annotation&lt;/span&gt; simplifica e agiliza o desenvolvimento de &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt;, contudo não substitui completamente os &lt;span style="font-style: italic;"&gt;deployment descriptors&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Quando os papéis de &lt;acronym style="font-style: italic;" title="O desenvolvedor do enterprise bean"&gt;Bean Provider&lt;/acronym&gt; e &lt;acronym style="font-style: italic;" title="Executa atividades relacionadas ao deployment e à manutenção do sistema"&gt;EJB Deployer&lt;/acronym&gt; são executados por pessoas diferentes, pode haver confusão e retrabalho ao definir a configuração do &lt;span style="font-style: italic;"&gt;deployment&lt;/span&gt;. Nesse caso, como os metadados estão presentes no código-fonte, se o &lt;span style="font-style: italic;"&gt;EJB Deployer&lt;/span&gt; precisar verificar ou alterar essa configuração, será necesário tod&lt;span&gt;o o trabalho para chegar ao código-fonte&lt;/span&gt;, inspecioná-lo e alterá-lo.&lt;br /&gt;&lt;br /&gt;Principalmente quando a mudança na configuração do &lt;span style="font-style: italic;"&gt;deployment&lt;/span&gt; é freqüente, é indicado uma separação de responsabilidades bem definida. A configuração deve ficar sob incubência exclusiva do &lt;span style="font-style: italic;"&gt;Bean Provider&lt;/span&gt; ou do &lt;span style="font-style: italic;"&gt;EJB Deployer&lt;/span&gt;.&lt;br /&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/03/sobre-ejb-30.html"&gt;Pequena Introdução ao EJB 3.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/pequena-introduo-dependency-injection.html"&gt;Pequena Introdução à Dependency Injection&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html"&gt;Annotations&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fontes Utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SRIGANESH, Rima Patel; BROSE, Gerald; SILVERMAN, Micah. &lt;span style="font-weight: bold;"&gt;Mastering Enterprise JavaBeans 3.0&lt;/span&gt;&lt;strong&gt;. &lt;/strong&gt;Indianapolis - Indiana: Wiley Publishing, Inc, 2006.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Software_deployment"&gt;Software Deployment&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-6093713922297036281?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/6093713922297036281/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=6093713922297036281&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6093713922297036281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6093713922297036281'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/sobre-annotations-e-deployment.html' title='Sobre Annotations e Deployment Descriptors no EJB 3.0'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KYeHnrXYwPg/RgMd8NClUDI/AAAAAAAAAjg/lI7G9JehEhs/s72-c/annotation.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-3434905736405769051</id><published>2007-03-23T02:52:00.000-03:00</published><updated>2007-04-01T00:23:20.617-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB 3.0'/><title type='text'>Pequena Introdução ao EJB 3.0</title><content type='html'>&lt;span style="font-style: italic;"&gt;Enterprise beans&lt;/span&gt; podem ser descritos como componentes reutilizáveis que executam rotinas relacionadas à lógica de negócios de um aplicativo, sozinhos ou em conjunto, num ou mais &lt;span style="font-style: italic;"&gt;Application Servers&lt;/span&gt;. Implementam a tecnologia &lt;acronym title="Enterprise JavaBeans"&gt;EJB&lt;/acronym&gt;, que faz parte de um quadro maior chamado &lt;acronym title="Java Platform, Enterprise Edition"&gt;Java EE&lt;/acronym&gt; e, na versão 3.0, consiste em duas partes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A especificação JSR-220, que define as regras para a implementação do suporte a &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt; pelos fornecedores de servidores Java EE, de forma a tornar viável o &lt;span style="font-style: italic;"&gt;"write once, run anywhere"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Conjunto de interfaces e suas respectivas implementações. Ambos devem seguir os contratos entre componentes e o servidor do aplicativo, definidos pela JSR-220.&lt;/li&gt;&lt;/ul&gt;Na JSR-220 existem dois tipos de EJB's: &lt;span style="font-style: italic;"&gt;session beans&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;message-driven beans&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;Session beans&lt;/span&gt; executam tarefas para um cliente; podem implementar um &lt;span style="font-style: italic;"&gt;web service&lt;/span&gt;. &lt;span style="font-style: italic;"&gt;Message-drive beans&lt;/span&gt; fornecem suporte para processamento assíncrono de requisições de serviços, além das funcionalidades&lt;span class="fullpost"&gt; dos &lt;span style="font-style: italic;"&gt;sessions beans&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;acronym title="Container Managed Persistence"&gt;CMP&lt;/acronym&gt; &lt;span style="font-style: italic;"&gt;beans&lt;/span&gt; foram substituídos pelos &lt;acronym title="Java Persistence API"&gt;JPA&lt;/acronym&gt; &lt;span style="font-style: italic;"&gt;entity beans&lt;/span&gt;. A JSR-220, no entanto, é compatível com as especificações anteriores, portanto CMP's podem ser utilizados em containeres EJB 3.0, assim como é possível todas as diversas combinações de interações entre cliente, EJB 2.1 e EJB 3.0.&lt;br /&gt;&lt;br /&gt;A excitação em torno do EJB 3.0 é motivada graças à simplificação de sua API, se comparado às especificações anteriores:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Interface de objetos e interface &lt;span style="font-style: italic;"&gt;home&lt;/span&gt; não são mais necessárias&lt;/li&gt;&lt;li&gt;Interfaces para componentes (&lt;span style="font-style: italic;"&gt;javax.ejb.SessionBean&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;javax.ejb.MessageDrivenBean&lt;/span&gt;) não são mais necessárias&lt;/li&gt;&lt;li&gt;Utilização de &lt;span style="font-style: italic;"&gt;annotations&lt;/span&gt; como metadados&lt;/li&gt;&lt;li&gt;Simplificação de API's para acessar o ambiente do &lt;span style="font-style: italic;"&gt;bean&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Coding-by-exception.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;Coding-by-exception&lt;/span&gt; é a capacidade dos &lt;span style="font-style: italic;"&gt;enterprise&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;entity beans&lt;/span&gt; de assumir um valor padrão para cada metadado. Dessa forma, só é preciso codificar &lt;span style="font-style: italic;"&gt;annotations&lt;/span&gt; quando seu valor padrão não for apropriado.&lt;br /&gt;&lt;br /&gt;Os &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt;, na especificação EJB 3.0, são &lt;acronym title="Plain Old Java Objects"&gt;POJO&lt;/acronym&gt;'s que, no caso dos &lt;span style="font-style: italic;"&gt;session beans,&lt;/span&gt; implementam métodos definidos numa &lt;span style="font-style: italic;"&gt;business interface&lt;/span&gt; local ou remota. A &lt;span style="font-style: italic;"&gt;business interface&lt;/span&gt; é uma &lt;acronym title="Plain Old Java Interface"&gt;POJI&lt;/acronym&gt; que define os métodos expostos pelo &lt;span style="font-style: italic;"&gt;session bean&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Esse conjunto de simplificações, mais a adição dos JPA &lt;span style="font-style: italic;"&gt;entity beans&lt;/span&gt;, visam facilitar e aumentar a produtividade do desenvolvimento de sistemas distribuídos que utilizam componentes EJB no seu &lt;span style="font-style: italic;"&gt;middleware&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Vantagens na utilização de EJB's&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sistemas de informação computacionais distribuídos precisam de uma série de serviços de infra-estrutura &lt;span style="font-style: italic;"&gt;(&lt;/span&gt;&lt;span style="font-style: italic;"&gt;system-level services&lt;/span&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt; para serem viáveis. Entre os também chamados &lt;span style="font-style: italic;"&gt;middleware services&lt;/span&gt;, porque são comumente requisitados e presentes na &lt;acronym title="A camada de negócio"&gt;camanda do meio&lt;/acronym&gt;, estão:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Invocação Remota de Métodos (RMI)&lt;/span&gt;. Serviço responsável por conectar uma camada a outra remota, via rede. A requisição de serviço numa camada (e.g. apresentação) é processadas em outra (e.g. negócio)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Balanceamento de Carga&lt;/span&gt;. Requisições de clientes por serviços são redirecionadas para servidores com menor carga [de trabalho]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Transparent failover&lt;/span&gt;. Se um servidor cair ou ficar indisponível na rede, os clientes são redirecionados de forma transparente para outro servidor em operação&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Integração com o &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;back-end&lt;/span&gt;. Suporte para persistência de dados em banco de dados e integração com sistemas legados&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Gerenciamento de Transações&lt;/span&gt;. Proteção à integridade de dados com controle de acesso concorrente e mecanismos para tratamento de excessões (e.g. interrupção brusca em meio a uma transação)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Clustering&lt;/span&gt;. O estado de um servidor é replicado para que o cliente possa utilizar outro servidor em caso de queda&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Redeployment&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; dinâmico&lt;/span&gt;. Capacidade de atualizar um aplicativo, ou seja, realizar um &lt;span style="font-style: italic;"&gt;deployment&lt;/span&gt; de um ou mais de seus componente, sem precisar reiniciar o servidor&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Logging&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; e auditoria&lt;/span&gt;. Registro das atividades no servidor de aplicativos, possibilitando a auditoria de eventuais problemas para descobrir a sua causa&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Gerenciamento do sistema&lt;/span&gt;. Monitoramento do sistema para o caso de falhas graves (&lt;span style="font-style: italic;"&gt;fatal errors&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Suporte para múltiplas requisições&lt;/span&gt;. Disponibilidade e gerenciamento de múltiplos &lt;span style="font-style: italic;"&gt;threads&lt;/span&gt; para possibilitar acesso simultâneo dos clientes aos &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Processamento assíncrono de requisições (&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;messaging&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;)&lt;/span&gt;. Maior desacoplamento entre clientes e servidor através de requisições baseadas em mensagens&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Gerenciamento do ciclo de vida dos &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;enterprise beans&lt;/span&gt;. Componentes são criados e destruídos conforme necessário&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Resource pooling&lt;/span&gt;. Criação de &lt;span style="font-style: italic;"&gt;pool&lt;/span&gt; de recursos, como conexões JDBC, e de &lt;span style="font-style: italic;"&gt;enterprise beans&lt;/span&gt; para fins de reutilização por diversos clientes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Segurança&lt;/span&gt;. O acesso aos serviços disponibilizados pelos &lt;span style="font-style: italic;"&gt;beans&lt;/span&gt; é controlado por metadados específicos&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Caching&lt;/span&gt;. Armazenamento temporário de dados comumente requisitados por clientes de modo a otimizar a performance do aplicativo&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Outros&lt;/span&gt;...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;O container EJB provê a infra-estrutura necessária para aplicativos distribuídos, liberando o desenvolvedor dessa árdua tarefa para que se concentre na implementação da lógica de negócios, encapsulada em componentes reutilizáveis.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Quando utilizar EJB 3.0 ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se entre os requisitos não-funcionais de um aplicativo estiverem escalabilidade, integridade de dados e numerosos clientes, considere utilizar EJB 3.0.&lt;br /&gt;&lt;br /&gt;Geralmente, um aplicativo precisa acomodar número crescente de usuários. Nesses casos, os &lt;span style="font-style: italic;"&gt;enterpise beans&lt;/span&gt; poderão ser distribuídos em diversos servidores, aumentando o desempenho do sistema.&lt;br /&gt;&lt;br /&gt;O container EJB tem mecanismos de gerenciamento de transações para preservar a integridade dos dados durante o acesso simultâneo à objetos compartilhados.&lt;br /&gt;&lt;br /&gt;Clientes de aplicativos Java EE podem concentrar-se nas rotinas de apresentação, deixando a implementação da lógica de negócio encapsulada nos EJB's. Cliente pode ser JSP, Servlet, &lt;span style="font-style: italic;"&gt;rich client&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;desktop&lt;/span&gt;), applet, outro &lt;span style="font-style: italic;"&gt;enterprise bean&lt;/span&gt;.&lt;br /&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/03/sobre-annotations-e-deployment.html"&gt;Sobre Annotations e Deployment Descriptors no EJB 3.0&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/pequena-introduo-dependency-injection.html"&gt;Pequena Introdução à Dependency Injection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/java-persistence-api-jpa.html"&gt;Java Persistence API - JPA&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fontes Utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javaee/5/docs/tutorial/doc/"&gt;The Java EE 5 Tutorial&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SRIGANESH, Rima Patel; BROSE, Gerald; SILVERMAN, Micah. &lt;span style="font-weight: bold;"&gt;Mastering Enterprise JavaBeans 3.0&lt;/span&gt;&lt;strong&gt;. &lt;/strong&gt;Indianapolis - Indiana: Wiley Publishing, Inc, 2006.&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/J2EE/jpa/"&gt;The Java Persistence API - A Simpler Programming Model for Entity Persistence.&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-3434905736405769051?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3434905736405769051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3434905736405769051'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/sobre-ejb-30.html' title='Pequena Introdução ao EJB 3.0'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-6256456896256616844</id><published>2007-03-22T01:57:00.000-03:00</published><updated>2007-05-22T17:50:37.445-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>Testes de Aceitação em Aplicações Swing</title><content type='html'>E aí,­ galera! Tudo bem com vocês? Meu nome é Daniel Martins, administrador do &lt;em&gt;blog&lt;/em&gt; &lt;a href="http://blog.danielfmartins.com/"&gt;batteries not included&lt;/a&gt;. Fui gentilmente convidado pelo Rafael, administrador deste &lt;em&gt;blog&lt;/em&gt;, para publicar sobre um assunto de minha escolha. Foi difí­cil escolher, mas espero que o texto seja de interesse de todos!&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Introdução&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Levando em consideração que este &lt;em&gt;blog&lt;/em&gt; disponibiliza muito material interessante sobre desenvolvimento com Swing, eu acabei optando por não sair muito desse assunto. Decidi escrever sobre um tema que é, ao mesmo tempo, muito importante e pouco comentado pelos desenvolvedores: testes de aceitação em aplicações Swing. É através dos testes de aceitação que podemos simular a utilização do sistema por um usuário e verificar se as reações do sistema correspondem ao esperado.&lt;br /&gt;&lt;br /&gt;Acredito que a falta de informação sobre o assunto se deve a uma questão meramente cultural, pois&lt;span class="fullpost"&gt; costumamos associar esse tipo de tarefa com trabalho manual, o que era verdade há alguns anos atrás. Entretanto, com o advento das metodologias ágeis, a cada dia surgem novas ferramentas capazes de nos ajudar a automatizar esse processo.&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;br /&gt;Tipos de Ferramentas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Antes de partir para a apresentação das ferramentas, precisamos aprender um pouco sobre como elas são agrupadas. Basicamente, existem dois tipos de ferramentas para criação e execução de testes de aceitação: as do tipo &lt;strong&gt;rec-and-play&lt;/strong&gt; e as &lt;strong&gt;programáveis&lt;/strong&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;As ferramentas &lt;strong style="font-weight: normal; font-style: italic;"&gt;rec-and-play&lt;/strong&gt; são ferramentas que gravam as ações do usuário com o sistema, permitindo que as mesmas ações sejam reproduzidas de uma forma automatizada;&lt;/li&gt;&lt;li&gt;Já o segundo grupo compreende as ferramentas que fornecem uma API para que o desenvolvedor possa simular as interações do usuário com o sistema.&lt;/li&gt;&lt;/ul&gt;Optar pela utilização de uma ferramenta de um grupo ou de outro pode impactar positiva ou negativamente no seu projeto. Embora cada ferramenta tenha suas próprias caracterí­sticas, podemos indicar algumas vantagens e desvantagens que costumam se aplicar às ferramentas de cada um desses grupos.&lt;br /&gt;&lt;br /&gt;Em relação às ferramentas do tipo &lt;span style="font-style: italic;"&gt;rec-and-play&lt;/span&gt;, a principal vantagem é que não é necessário saber programar para ser capaz de criar e reproduzir os testes. Isso torna qualquer pessoa apta a fazer este trabalho. Além disso, o fato de não se precisar programar os testes torna todo esse processo mais ágil.&lt;br /&gt;&lt;br /&gt;Entretanto, a grande desvantagem de ferramentas desse grupo é que os testes se tornam extremamente sensí­veis a qualquer modificação na &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;. Por exemplo, se um determinado teste clica com o &lt;span style="font-style: italic;"&gt;mouse&lt;/span&gt; em um botão que ficava na posição &lt;span style="font-style: italic;"&gt;x&lt;/span&gt; da &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;, e que agora está na posição &lt;span style="font-style: italic;"&gt;y&lt;/span&gt;, o teste falhará e deverá ser modificado para se adaptar à  "nova" &lt;span style="font-style: italic;"&gt;view&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Já as ferramentas que estão no segundo grupo são mais confiáveis neste aspecto, sendo necessário modificar os testes apenas em casos mais extremos, como na troca de um componente por outro. A desvantagem é que as ferramentas deste grupo demandam mais esforço na criação dos testes.&lt;br /&gt;&lt;br /&gt;Eu particularmente não simpatizo com as ferramentas &lt;span style="font-style: italic;"&gt;rec-and-play&lt;/span&gt;, pois os testes costumam "quebrar" com muito mais facilidade. Mas devo lembrar que "cada caso é um caso" e a melhor atitude é ponderar os prós e contras de cada tipo de ferramenta antes de fazer sua escolha.&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;br /&gt;Ferramentas Disponíveis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora que já sabemos diferenciar os tipos de ferramentas, nos resta agora conhecer algumas das opções disponí­veis:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jemmy.netbeans.org/"&gt;Jemmy&lt;/a&gt; - O Jemmy é uma biblioteca para testes de interfaces gráficas Swing e AWT desenvolvido pelo time do &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt;. Trata-se de uma ferramenta onde os testes são criados e executados programaticamente, através de uma API bem definida. A documentação ainda é fraca, mas o &lt;span style="font-style: italic;"&gt;site&lt;/span&gt; está repleto de exemplos de testes, o que já é de grande ajuda.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.uispec4j.org/"&gt;UISpec4J&lt;/a&gt; - Feito em cima do &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; e pode ser usado para testar interfaces gráficas baseadas em Swing de forma programática. A API fornecida por esta ferramenta é mais simples e intuitiva que a fornecida pelo Jemmy. A má notí­cia é que, apesar de já estar disponí­vel a algum tempo (desde meados de 2004), existem componentes Swing que não são 100% suportados. Além disso, a ferramenta não é multi-plataforma "de verdade" (alguns testes que fiz não funcionaram no Linux). Em relação a documentação, ela é fraca, mas é possí­vel se virar bem só com os JavaDocs.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.marathontesting.com/"&gt;Marathon&lt;/a&gt; - Esta ferramenta é do tipo &lt;span style="font-style: italic;"&gt;rec-and-play&lt;/span&gt; e os testes gravados são "convertidos" em &lt;em&gt;scripts&lt;/em&gt; &lt;a href="http://www.jython.org/"&gt;Jython&lt;/a&gt;, facilitando a modificação dos testes sem que seja necessário recriá-los. Uma coisa legal é que podemos testar qualquer tipo de componente sem que seja necessário trabalho extra (diferentemente do que acontece com o Jemmy e o UISpec4J, por exemplo). A documentação é razoável e dá para se virar sem nenhum problema.&lt;/li&gt;&lt;li&gt;&lt;a href="http://jfcunit.sourceforge.net/"&gt;JFCUnit&lt;/a&gt; - É uma ferramenta para criação programática de testes de interfaces gráficas Swing, feita como uma extensão ao JUnit. Tudo indica que este é um projeto abandonado, já que o último &lt;em&gt;release&lt;/em&gt; foi feito no dia 21 de Dezembro de 2004.&lt;/li&gt;&lt;li&gt;&lt;a href="http://abbot.sourceforge.net/"&gt;Abbot&lt;/a&gt; - O Abbot é uma extensão do JUnit para testes de interfaces gráficas semelhante ao JFCUnit. A diferença é que o projeto não parece estar abandonado. &lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/testng-abbot/"&gt;TestNG-Abbot&lt;/a&gt; - O TestNG-Abbot é um projeto cujo objetivo é adaptar o Abbot para rodar sobre o &lt;a href="http://testng.org/"&gt;TestNG&lt;/a&gt;. A documentação é praticamente inexistente, sendo que as únicas referências que encontrei foram &lt;em&gt;posts&lt;/em&gt; em &lt;em&gt;blogs&lt;/em&gt; e um artigo no &lt;a href="http://www-128.ibm.com/developerworks/java/"&gt;developerworks.com&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;É óbvio que existem outras ferramentas além das citadas, inclusive ferramentas pagas. Para mais detalhes, visite &lt;a href="http://wiki.java.net/bin/view/Javapedia/TestingGUIApplications"&gt;esta página&lt;/a&gt;.&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;br /&gt;Mas qual ferramenta escolher?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A função deste artigo não é oferecer um &lt;em&gt;review&lt;/em&gt; detalhado sobre cada uma das alternativas, mas sim mostrar quais são essas alternativas. Portanto, a tarefa de descobrir qual ferramenta melhor se adapta às suas necessidades é sua. Minha dica é: crie uma aplicação bem simples nos moldes das que você costuma desenvolver e verifique quais ferramentas fornecem os recursos necessários para testá-la adequadamente.&lt;br /&gt;&lt;br /&gt;Em alguns dias, eu publicarei &lt;em&gt;&lt;/em&gt;  no &lt;a href="http://blog.danielfmartins.com/"&gt;meu &lt;em&gt;blog&lt;/em&gt;&lt;/a&gt; um pouco mais sobre o Jemmy. Será mostrado, na prática, como utilizá-lo para testar uma aplicação Swing para conversão de temperaturas.&lt;br /&gt;&lt;br /&gt;Bom... eu vou ficando por aqui. Gostaria de agradecer novamente ao Rafael por me oferecer a oportunidade de escrever aqui. Valeu mesmo!&lt;br /&gt;&lt;br /&gt;Um abração a todos e bons testes!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-6256456896256616844?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/6256456896256616844/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=6256456896256616844&amp;isPopup=true' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6256456896256616844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6256456896256616844'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/testes-de-aceitao-em-aplicaes-swing.html' title='Testes de Aceitação em Aplicações Swing'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-2311624633283286509</id><published>2007-03-16T02:23:00.000-03:00</published><updated>2007-03-24T17:33:01.888-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Look and Feel'/><title type='text'>Look and Feel - Você Conhece o Nimbus?</title><content type='html'>Nimbus é o &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; do Java Desktop System, implementado como tema &lt;a href="http://pt.wikipedia.org/wiki/GTK"&gt;GTK&lt;/a&gt; nos últimos &lt;span style="font-style: italic;"&gt;pre-releases&lt;/span&gt; do Solaris 11. Recentemente, &lt;a href="https://nimbus.dev.java.net/"&gt;um projeto &lt;span style="font-style: italic;"&gt;open-source&lt;/span&gt;&lt;/a&gt; foi criado para tornar o Nimbus &lt;span style="font-weight: bold;"&gt;o futuro &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;cross-plataform-look-and-feel&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; para o Swing&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;É implementado através do &lt;a href="http://javadesktop.org/articles/synth/index.html"&gt;Synth&lt;/a&gt; e está disponível apenas para Java SE 6. Uma versão compatível com J2SE 5 é esperada apenas depois do lançamento de uma versão mais concreta para Java SE 6, prevista para o final de 2007&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RfhvGEXwWaI/AAAAAAAAAjQ/bwrf7NrCsOw/s1600-h/Nimbus-Demo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RfhvGEXwWaI/AAAAAAAAAjQ/bwrf7NrCsOw/s400/Nimbus-Demo.png" alt="" id="BLOGGER_PHOTO_ID_5041901932884548002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Prazer, Eu Sou Nimbus!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O Nimbus ainda está em estágio preliminar (&lt;span style="font-style: italic;"&gt;early alpha&lt;/span&gt;), mas já é possível conhecê-lo um pouco melhor através do &lt;span style="font-style: italic;"&gt;demo&lt;/span&gt; desenvolvido por Richard Bair.   &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://javadesktop.org/swinglabs/demos/nimbus/nimbus.jnlp"&gt;&lt;img center="" cursor="" pointer="" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RfhovEXwWQI/AAAAAAAAAiA/2jt5bAzexT8/s320/webstart.png" alt="" id="BLOGGER_PHOTO_ID_5041894940677789954" align="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Abaixo estão imagens de JButton's, JCheckBox'es e JRadioButton's com imagens. Os botões da esquerda estão sob o ponteiro do &lt;span style="font-style: italic;"&gt;mouse&lt;/span&gt;, os do centro estão "intocados" e os da direita, selecionados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Buttons&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RfhtDkXwWWI/AAAAAAAAAiw/Aw9iudMqDMk/s1600-h/Nimbus-Image-Buttons.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RfhtDkXwWWI/AAAAAAAAAiw/Aw9iudMqDMk/s200/Nimbus-Image-Buttons.png" alt="" id="BLOGGER_PHOTO_ID_5041899690911619426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Check Boxes&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rfhtf0XwWYI/AAAAAAAAAjA/oESXVmwvFzk/s1600-h/Nimbus-Image-CheckBoxes.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rfhtf0XwWYI/AAAAAAAAAjA/oESXVmwvFzk/s200/Nimbus-Image-CheckBoxes.png" alt="" id="BLOGGER_PHOTO_ID_5041900176242923906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;Radio Buttons&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rfht9kXwWZI/AAAAAAAAAjI/f6QG-F_7JLI/s1600-h/Nimbus-Image-Radio-Buttons.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rfht9kXwWZI/AAAAAAAAAjI/f6QG-F_7JLI/s320/Nimbus-Image-Radio-Buttons.png" alt="" id="BLOGGER_PHOTO_ID_5041900687344032146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;So What ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O objetivo do projeto Nimbus - ambicioso - é ser o melhor &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; para Swing, competir com o &lt;a href="http://en.wikipedia.org/wiki/Windows_Aero"&gt;Aero&lt;/a&gt; e o &lt;a href="http://www.apple.com/br/macosx/overview/aquauserinterface.html"&gt;Aqua&lt;/a&gt; e ser a principal referência como Synth &lt;span style="font-style: italic;"&gt;skin&lt;/span&gt; (i.e. implementação de &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; baseado no Synth).&lt;br /&gt;&lt;br /&gt;Entre suas inovações estarão facilidades para escolher entre três tamanhos diferentes de &lt;a href="http://en.wikipedia.org/wiki/Widget_%28computing%29"&gt;widgets&lt;/a&gt; e uso do &lt;a href="https://timingframework.dev.java.net/"&gt;Timing Framework&lt;/a&gt; para criação de efeitos visuais.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Matenha-se informado sobre Nimbus &lt;span style="font-style: italic;"&gt;&lt;/span&gt; em:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jasperpotts.com/blog/category/nimbus/"&gt;Caffeine Induced Ramblings&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://galbraiths.org/blog/category/nimbus/"&gt;Ben Galbraith's Blog&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Veja mais sobre &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; em:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel.html"&gt;Look and Feel - Introdução&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel-jgoodies-looks.html"&gt;JGoodies Look and Feel&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel-napkin.html"&gt;Napkin L&amp;F&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/substance-look-and-feel.html"&gt;Substance Look and Feel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/skin-look-and-feel.html"&gt;Skin Look and Feel&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Esse artigo bebe das fontes:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://nimbus.dev.java.net/"&gt;Nimbus - Java.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://galbraiths.org/blog/2007/03/09/desktop-matters-announcing-nimbus/"&gt;Desktop Matters - Announcing Nimbus&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://galbraiths.org/blog/2007/03/13/update-on-nimbus/"&gt;Update on Nimbus&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-2311624633283286509?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/2311624633283286509/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=2311624633283286509&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2311624633283286509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2311624633283286509'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/look-and-feel-voc-conhece-o-nimbus.html' title='Look and Feel - Você Conhece o Nimbus?'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KYeHnrXYwPg/RfhvGEXwWaI/AAAAAAAAAjQ/bwrf7NrCsOw/s72-c/Nimbus-Demo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-8745080518077618952</id><published>2007-03-15T05:06:00.000-03:00</published><updated>2007-03-24T19:39:49.506-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><title type='text'>SwingX - Aviso Importante</title><content type='html'>Os novos componentes SwingX são interessantes, estáveis em sua maioria e podem acrescentar valor ao software e produtividade no seu desenvolvimento. Porém, é importante ressaltar esse aviso disponível no &lt;a href="http://swinglabs.org/faq.jsp"&gt;FAQ do SwingLabs&lt;/a&gt;&lt;span class="fullpost"&gt;:&lt;br /&gt;&lt;blockquote&gt;Todos os componentes do projeto SwingLabs [do qual o SwingX faz parte] são focados para uso em ambiente de produção. &lt;span style="font-weight: bold;"&gt;Entretanto, a Sun não oferece qualquer garantia de suporte e desenvolvimento presente ou futuro para qualquer um desses componentes.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Esse aviso tem implicações importantes. Por exemplo, a API do &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxstatusbar.html"&gt;JXStatusBar&lt;/a&gt; foi atualizada no repositório do projeto em relação ao SwingX 0.8.0. Outro exemplo é a aparição do componente &lt;a href="http://rfiume.blogspot.com/2007/03/swingx-jxerrorpane.html"&gt;JXErroPane&lt;/a&gt; no lugar de JXErrorDialog, que foi "extinto" sumária e silenciosamente.&lt;br /&gt;&lt;br /&gt;Portanto, tenha planejamento e cuidado ao utilizar os componentes SwingX.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja outros componentes SwingX em:&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 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/03/mais-widgets-para-voc-l2fprod.html"&gt;L2FProd&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/mais-widgets-para-voc-parte-2-flamingo.html"&gt;Flamingo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-8745080518077618952?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/8745080518077618952/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=8745080518077618952&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8745080518077618952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8745080518077618952'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/swingx-aviso-importante.html' title='SwingX - Aviso Importante'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-9197779961609964928</id><published>2007-03-13T16:19:00.000-03:00</published><updated>2007-03-24T15:20:36.197-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wonderland e Ciência'/><title type='text'>Sol - Um Reator de Fusão Nuclear</title><content type='html'>As estrelas são um reator de fusão nuclear natural. Estão sempre em constante instabilidade, sob os domínios da força gravitacional e do empuxo resultante da energia liberada pela fusão nuclear.&lt;br /&gt;&lt;br /&gt;A força gravitacional atrai toda a matéria da estrela para o seu centro, onde a temperatura e a pressão (15 milhões °C e 1 milhão &lt;a href="http://pt.wikipedia.org/wiki/Atmosfera_%28unidade%29"&gt;atm&lt;/a&gt;, respectivamente) chegam ao ponto de fundir os &lt;a href="http://en.wikipedia.org/wiki/Atom"&gt;átomos&lt;/a&gt; de hidrogênio em hélio. Nesse processo, 4 núcleos de hidrogênio fundem-se formando 1 núcleo de hélio, com 2 &lt;a href="http://en.wikipedia.org/wiki/Proton"&gt;prótons&lt;/a&gt; e 2 &lt;a href="http://en.wikipedia.org/wiki/Neutron"&gt;nêutrons&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por outro lado, a energia gerada pela fusão nuclear empurra a matéria para fora da estrela&lt;span class="fullpost"&gt;. Uma força contrabalança a outra: a gravitacional evita que a matéria se dissipe no espaço, e o empuxo gerado pela fusão impede que a estrela se contraia até entrar em colapso.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rfb86kXwWPI/AAAAAAAAAh4/bubcxZEjddQ/s1600-h/sol.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rfb86kXwWPI/AAAAAAAAAh4/bubcxZEjddQ/s400/sol.png" alt="" id="BLOGGER_PHOTO_ID_5041494916013775090" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;O Sol&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Com a fusão nuclear, para cada 45 prótons, são gerados 55 nêutrons. Assim que um próton é transformado em nêutron, sua carga elétrica é despejada do núcleo em fusão junto com uma quantia de massa equivalente a de um &lt;a href="http://pt.wikipedia.org/wiki/El%C3%A9tron"&gt;elétron&lt;/a&gt;. Essa partícula é chamada de &lt;a href="http://pt.wikipedia.org/wiki/P%C3%B3sitron"&gt;pósitron&lt;/a&gt;, ou anti-elétron, já que se trata de um elétron com carga positiva.&lt;br /&gt;&lt;br /&gt;Esses pósitrons colidem com os elétrons presentes no Sol, resultando num aniquilamento mútuo, onde ambos são convertidos em raio gama - fótons energéticos que não possuem nem carga elétrica, nem massa.&lt;br /&gt;&lt;br /&gt;O Sol converte 600 bilhões de quilos de hidrogênio em 595,8 bilhões de quilos de hélio por segundo. Os 4,2 bilhões de quilos restantes são transformados na radiação gerada durante o aniquilamento mútuo.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Sopa Eletrônica&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No centro do Sol, a pressão supera a força eletromagnética na &lt;a href="http://en.wikipedia.org/wiki/Atomic_orbital"&gt;elétrosfera&lt;/a&gt; dos átomos, o que faz com que os átomos implodam, gerando uma sopa de elétrons.&lt;br /&gt;&lt;br /&gt;Os elétrons, nesse fluído eletrônico, ocupam muito menos espaço do que ocupariam normalmente como parte da elétrosfera num átomo intacto.&lt;br /&gt;&lt;br /&gt;Com os elétrons e prótons mais próximos, a resistência eletromagnética à pressão exercida pela força gravitacional aumenta. No entanto, os prótons, desprotegidos pela ausência de um "envoltório" e a 15 milhões °C, movem-se a uma velocidade altíssima, colidindo uns nos outros. É durante essas colisões que ocasionalmente os prótons se fundem, formando um núcleo maior e liberando radiação.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referência:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pt.wikipedia.org/wiki/Isaac_Asimov"&gt;Isaac Asimov&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-9197779961609964928?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/9197779961609964928/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=9197779961609964928&amp;isPopup=true' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/9197779961609964928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/9197779961609964928'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/sol-um-reator-de-fuso-nuclear.html' title='Sol - Um Reator de Fusão Nuclear'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KYeHnrXYwPg/Rfb86kXwWPI/AAAAAAAAAh4/bubcxZEjddQ/s72-c/sol.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-7666884961672087500</id><published>2007-03-12T09:26:00.000-03:00</published><updated>2007-05-22T17:50:37.446-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>Turbinando o Anti-Aliasing</title><content type='html'>O Java SE 6 trouxe várias melhorias para a construção de clientes ricos (&lt;span style="font-style: italic;"&gt;desktop&lt;/span&gt;) e, entre essas mudanças está o uso de &lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/Anti-aliasing"&gt;anti-aliasing&lt;/a&gt;. O Java 5 tem o &lt;span style="font-style: italic;"&gt;anti-aliasing&lt;/span&gt; desabilitado por padrão, o que contribui para um visual desagradável. Mas, mesmo ao utilizar o Java SE 6, é possível turbinar o &lt;span style="font-style: italic;"&gt;anti-aliasing&lt;/span&gt; do aplicativo.&lt;br /&gt;&lt;br /&gt;Para isso, sobrescreva o método &lt;span style="font-style: italic;"&gt;paintChildren(Graphics g)&lt;/span&gt; como abaixo&lt;span class="fullpost"&gt;:&lt;br /&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;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void paintChildren(final Graphics g) {&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;final Graphics2D g2 = (Graphics2D)g;&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;g2.setRenderingHint(&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;RenderingHints.KEY_ANTIALIASING,&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;RenderingHints.VALUE_ANTIALIAS_ON);&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;super.paintChildren(g2);&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;O Antes e o Depois&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aqui está um JLabel sem &lt;span style="font-style: italic;"&gt;anti-aliasing&lt;/span&gt; (clique na figura para ampliar).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RfDvf0XwWNI/AAAAAAAAAhg/FpuEIFMYs8o/s1600-h/antialiasing_off.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RfDvf0XwWNI/AAAAAAAAAhg/FpuEIFMYs8o/s400/antialiasing_off.png" alt="" id="BLOGGER_PHOTO_ID_5039791312940849362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A seguir, o anti-&lt;span style="font-style: italic;"&gt;aliasing&lt;/span&gt; está habilitado (clique na figura para ampliar).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RfDvqUXwWOI/AAAAAAAAAho/EbgSff6PFs4/s1600-h/antialiasing_on.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RfDvqUXwWOI/AAAAAAAAAho/EbgSff6PFs4/s400/antialiasing_on.png" alt="" id="BLOGGER_PHOTO_ID_5039791493329475810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Nota Pessoal (What Am I Doing?)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na Internet, &lt;a href="http://www.vivaolinux.com.br/dicas/verDica.php?codigo=7425"&gt;outras pessoas&lt;/a&gt; - inclusive o pessoal do Swing Hacks - sugerem inserir o argumento&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;-Dswing.aatext="true"&lt;/span&gt; no comando de inicialização do aplicativo para habilitar o &lt;span style="font-style: italic;"&gt;anti-aliasing&lt;/span&gt; sem tocar no código-fonte.&lt;br /&gt;&lt;br /&gt;Ou então, habilitá-lo através de &lt;span style="color: rgb(0, 0, 153);"&gt;System.setProperty("swing.aatext", "true") &lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Não sei que espécie de mágica eu faço, pois não tive sucesso em habilitar o &lt;span style="font-style: italic;"&gt;anti-aliasing&lt;/span&gt; dessa forma.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fonte:&lt;/span&gt; &lt;a href="http://safari.oreilly.com/0596009070/swinghacks-PREF-3"&gt;Swing Hacks&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-7666884961672087500?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/7666884961672087500/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=7666884961672087500&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7666884961672087500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7666884961672087500'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/turbinando-o-anti-aliasing.html' title='Turbinando o Anti-Aliasing'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KYeHnrXYwPg/RfDvf0XwWNI/AAAAAAAAAhg/FpuEIFMYs8o/s72-c/antialiasing_off.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-4668089057683000157</id><published>2007-03-08T13:14:00.000-03:00</published><updated>2007-03-24T19:42:37.611-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><title type='text'>SwingX - JXErrorPane</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RdycC_8pkZI/AAAAAAAAAc4/XnR72IyTZzM/s1600-h/JXErrorPane.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RdycC_8pkZI/AAAAAAAAAc4/XnR72IyTZzM/s320/JXErrorPane.png" alt="" id="BLOGGER_PHOTO_ID_5034070058832859538" border="0" /&gt;&lt;/a&gt;O objetivo do &lt;span style="font-weight: bold;"&gt;JXErrorPane&lt;/span&gt; é mostrar mensagens de erro, advertências e a ocorrência de &lt;span style="font-style: italic;"&gt;fatal errors&lt;/span&gt; aos usuários. JXErrorPane tem o foco em erros irrecuperáveis.&lt;br /&gt;&lt;br /&gt;Pode ser configurado para permitir ao usuário relatar o ocorrido ao desenvolvedor do software em questão através de um botão &lt;span style="font-style: italic;"&gt;Report.&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;O usuário pode ver os detalhes relacionados ao erro através do botão &lt;span style="font-style: italic;"&gt;Details&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;JXErrorPane in Action (1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&lt;/span&gt;É simples e direto utilizar o JXErrorPane. Veja o código abaixo.&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&lt;br /&gt;try {&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Alguma coisa deu errado aqui.&lt;/span&gt;&lt;br /&gt;} catch (Exception Ex) {&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;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// ErrorInfo encapsula dados sobre o erro.&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ErrorInfo info = new ErrorInfo(&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Título da janela.&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;"Erro ao Tentar Navegar para o Item.",&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Breve descrição do erro.&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;"Esse item não existe.",&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Descrição detalhada do erro.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;null,&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Categoria, serve para identificar onde o erro ocorreu.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// É recomendável utilizar o mesmo nome que teria utilizando logging.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"org.testswingx.jxerrorpane",&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Throwable, utilizado para obter informações sobre o erro úteis para os desenvolvedores.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ex,&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Nível do erro.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;org.jdesktop.swingx.error.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ErrorLevel.SEVERE,&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// O estado do aplicativo no momento em que o erro ocorreu.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;null);&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;span style="color: rgb(0, 0, 153);"&gt;JXErrorPane&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.showDialog(null, info);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Basta encapsular os detalhes do erro em &lt;span style="font-style: italic;"&gt;org.jdesktop.swingx.error.ErrorInfo&lt;/span&gt; e utilizar o método&lt;span style="font-style: italic;"&gt; showDialog(Component owner, ErrorInfo info)&lt;/span&gt; de JXErrorPane.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RdycP_8pkaI/AAAAAAAAAdA/LmjRRHjxYas/s1600-h/JXErrorPane-Detais.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RdycP_8pkaI/AAAAAAAAAdA/LmjRRHjxYas/s320/JXErrorPane-Detais.png" alt="" id="BLOGGER_PHOTO_ID_5034070282171158946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Pode ser melhor mostrar ao usuário uma mensagem mais amigável que o &lt;span style="font-style: italic;"&gt;stack trace&lt;/span&gt; do erro.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;try {&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Alguma coisa deu errado aqui.&lt;br /&gt;&lt;/span&gt;} catch (Exception Ex) {&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ErrorInfo info = new ErrorInfo(&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;"Erro ao Tentar Navegar para o Item.",&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"Esse item não existe.",&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Mensagem mais amigável ao usuário, pode inclusive contar com tags html.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"Por favor, contate o administrador do sistema.",&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;org.testswingx.jxerrorpane&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;null,&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;span style="color: rgb(0, 0, 153);"&gt;org.jdesktop.swingx.error.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ErrorLevel.SEVERE,&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXErrorPane&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;.showDialog(null, info);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rdyvhv8pkbI/AAAAAAAAAdI/btJ65GuRQ48/s1600-h/JXErrorPane-Friendly_Message.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/Rdyvhv8pkbI/AAAAAAAAAdI/btJ65GuRQ48/s320/JXErrorPane-Friendly_Message.png" alt="" id="BLOGGER_PHOTO_ID_5034091477834764722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Em situações críticas, é possível encerrar a execução do aplicativo. Basta ajustar o nível de erro em &lt;span style="font-style: italic;"&gt;ErrorInfo&lt;/span&gt; para &lt;span style="font-style: italic;"&gt;ErrorLevel.FATAL&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rdywh_8pkcI/AAAAAAAAAdQ/xuOUvI9NJrw/s1600-h/JXErrorPane-Fatal_Error.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/Rdywh_8pkcI/AAAAAAAAAdQ/xuOUvI9NJrw/s320/JXErrorPane-Fatal_Error.png" alt="" id="BLOGGER_PHOTO_ID_5034092581641359810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;JXErrorPane in Action (2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A funcionalidade de maior destaque do JXErrorPane é a possibilidade do usuário do aplicativo relatar o erro ao desenvolvedor do software por e-mail, RSS, ou o que for mais adequado, através de um botão &lt;span style="font-style: italic;"&gt;Report&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Basta implementar o método &lt;span style="font-style: italic;"&gt;reportError(ErrorInfo info)&lt;/span&gt; da interface &lt;span style="font-style: italic;"&gt;org.jdesktop.swingx.error.ErrorReporter&lt;/span&gt;, e chamar o método &lt;span style="font-style: italic;"&gt;setErrorReporter(ErrorReporter reporter)&lt;/span&gt; numa instância de &lt;span style="font-style: italic;"&gt;JXErrorPane&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private final JXErrorPane errorPane = new JXErrorPane();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;errorPane.setErrorReporter(new EmailErrorReporter());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;errorPane.setErrorInfo(info);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXErrorPane.showDialog(null, errorPane);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/Re3emdn1nZI/AAAAAAAAAgs/kJvlZM1HAsU/s1600-h/JXErrorPane_Report.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/Re3emdn1nZI/AAAAAAAAAgs/kJvlZM1HAsU/s320/JXErrorPane_Report.png" alt="" id="BLOGGER_PHOTO_ID_5038928310465568146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja outros componentes SwingX em:&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 style="font-weight: bold;"&gt;Referências:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://swinglabs.org/source/xref/java/org/jdesktop/swingx/JXErrorPane.java#JXErrorPane"&gt;org.jdesktop.swingx.JXErrorPane&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://swinglabs.org/source/xref/java/org/jdesktop/swingx/error/ErrorInfo.java#ErrorInfo"&gt;org.jdesktop.swingx.error.ErrorInfo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://swinglabs.org/source/xref/java/org/jdesktop/swingx/error/ErrorReporter.java#ErrorReporter"&gt;org.jdesktop.swingx.error.ErrorReporter&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-4668089057683000157?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/4668089057683000157/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=4668089057683000157&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4668089057683000157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4668089057683000157'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/swingx-jxerrorpane.html' title='SwingX - JXErrorPane'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KYeHnrXYwPg/RdycC_8pkZI/AAAAAAAAAc4/XnR72IyTZzM/s72-c/JXErrorPane.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-855676692673586813</id><published>2007-03-07T02:39:00.000-03:00</published><updated>2007-05-07T17:52:21.588-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Desktop Tips'/><title type='text'>Mais Widgets para Você, Parte 2 - Flamingo</title><content type='html'>Além das extensões Swing já comentadas nesse blog, &lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt; e &lt;a href="http://rfiume.blogspot.com/2007/03/mais-widgets-para-voc-l2fprod.html"&gt;L2FProd&lt;/a&gt;, há outra digna de menção. Trata-se do &lt;a href="https://flamingo.dev.java.net/"&gt;Flamingo&lt;/a&gt;, disponível sob a licença &lt;a href="http://pt.wikipedia.org/wiki/Licen%C3%A7a_BSD"&gt;BSD&lt;/a&gt;&lt;span class="fullpost"&gt;. O responsável por esse projeto é &lt;a href="http://weblogs.java.net/blog/kirillcool/"&gt;Kirill Grouchnikov&lt;/a&gt;, o criador e mantenedor do &lt;a href="http://rfiume.blogspot.com/2007/02/substance-look-and-feel.html"&gt;Substance Look and Feel&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Alguns componentes Flamingo são inspirados nas inovações da interface gráfica Aero, do Windows Vista, como o &lt;a href="http://pt.wikipedia.org/wiki/Widgets"&gt;widget&lt;/a&gt; JRibbon. A última versão lançada, Flamingo 1.1, conta com os componentes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://flamingo.dev.java.net/docs/jribbon.html"&gt;JRibbon&lt;/a&gt; ( &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://substance-flamingo.dev.java.net/webstart/testRibbon.jnlp"&gt;&lt;img style="margin: 0px;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RexdGBqXMAI/AAAAAAAAAgM/K9FpwcFN9x0/s200/webstart.png" border="0" /&gt;&lt;/a&gt; )&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://flamingo.dev.java.net/docs/breadcrumb-bar.html"&gt;Bread Crumb Bar&lt;/a&gt; ( &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://flamingo.dev.java.net/webstart/testBreadCrumbBar.jnlp"&gt;&lt;img style="margin: 0px;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RexdGBqXMAI/AAAAAAAAAgM/K9FpwcFN9x0/s200/webstart.png" border="0" /&gt;&lt;/a&gt; )&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://flamingo.dev.java.net/docs/file-viewer.html"&gt;File Viwer Panel&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://flamingo.dev.java.net/docs/wizard.html"&gt;Wizard&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://flamingo.dev.java.net/docs/button-strip.html"&gt;Button Strip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://flamingo.dev.java.net/docs/icons.html"&gt;Resizable Icon e Stack Icon&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://flamingo.dev.java.net/docs/glass-pane.html"&gt;Progress Glass Pane&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Abaixo, &lt;span style="font-style: italic;"&gt;JRibbon in action&lt;/span&gt; em &lt;a href="https://flamingo.dev.java.net/docs/jribbon.html"&gt;flamingo.dev.java.net/docs/jribbon.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://flamingo.dev.java.net/images/ribbon/blog/layout-example.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="https://flamingo.dev.java.net/images/ribbon/blog/layout-example.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja outras extensões Swing em:&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;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/mais-widgets-para-voc-l2fprod.html"&gt;L2FProd&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Referência:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://flamingo.dev.java.net/"&gt;Flamingo (Java.net)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Nota:&lt;/span&gt; Os demos dos componentes JRibbon e Bread Crumb Bar são de autoria de Kirill Grouchnikov e estão disponíveis em &lt;a href="https://flamingo.dev.java.net/"&gt;flamingo.dev.java.net&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-855676692673586813?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/855676692673586813/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=855676692673586813&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/855676692673586813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/855676692673586813'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/mais-widgets-para-voc-parte-2-flamingo.html' title='Mais Widgets para Você, Parte 2 - Flamingo'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KYeHnrXYwPg/RexdGBqXMAI/AAAAAAAAAgM/K9FpwcFN9x0/s72-c/webstart.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-4585472624932033087</id><published>2007-03-05T01:12:00.000-03:00</published><updated>2007-05-22T17:50:37.447-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>Desktop API: Integração entre Aplicativos Java e o Sistema Operacional Nativo</title><content type='html'>A Desktop API, do Java SE 6, permite que softwares baseados na tecnologia Java interajam com aplicativos padrões do sistema operacional nativo; ou seja, aplicativos que estão associados com certas extensões de arquivos numa determina plataforma.&lt;br /&gt;&lt;br /&gt;Isso equivale a dizer que o software que utiliza a Desktop Api pode&lt;span class="fullpost"&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;executar o navegador de Internet padrão com determinado URI (Uniform Resource Identifier)&lt;/li&gt;&lt;li&gt;executar o cliente de e-mail padrão, opcionalmente com determinado &lt;span style=";font-family:courier new;font-size:85%;"  &gt;mailto&lt;/span&gt; URI&lt;br /&gt;&lt;/li&gt;&lt;li&gt;executar um aplicativo registrado no sistema operacional hospedeiro, abrir, editar ou imprimir um arquivo associado a esse aplicativo.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Desktop API in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdvHX_8pkXI/AAAAAAAAAcY/H35s4ed_IQs/s1600-h/Desktop_API-Sending_Email.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdvHX_8pkXI/AAAAAAAAAcY/H35s4ed_IQs/s200/Desktop_API-Sending_Email.png" alt="" id="BLOGGER_PHOTO_ID_5033836223633396082" border="0" /&gt;&lt;/a&gt;Ao clicar no &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxhyperlink.html"&gt;&lt;span&gt;hyperlink&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: italic;"&gt;Pedir Suporte&lt;/span&gt; desse aplicativo, o cliente de e-mail padrão abre uma janela de composição de e-mail com o endereço do suporte técnico e o título "Pedido de Suporte".&lt;br /&gt;&lt;br /&gt;O &lt;span&gt;hyperlink&lt;/span&gt; é criado automaticamente após adicionar o &lt;span style="font-style: italic;"&gt;Action&lt;/span&gt; &lt;span style="font-style: italic;"&gt;AskForSuporte&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153); font-style: italic;"&gt; &lt;/span&gt;num &lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxtaskpane-um-painel-de-tarefas.html"&gt;JXTaskPane&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class AskForSuporte extends AbstractAction{&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// O ator pincipal desse artigo. Se atuar bem, ganha o Oscar!&lt;/span&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;private Desktop desktop;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private URI uri;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// A URI maito.&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final String MAILTO =&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;mailto:rafaelfiume_fatec@yahoo.com.br?subject=Pedido%20de%20Suporte%20Técnico";&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;span style="color: rgb(102, 102, 102);"&gt;// O rótulo do hyperlink.&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final String NAME =  "Pedir Suporte";&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final String ACTION = "pedir_suporte";&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// O tooltip text do hyperlink.&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final String SHORT_DESCRIPTION =&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; "Requisita suporte para o sistema";&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;br /&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public AskForSuporte() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;super();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;putValue(Action.NAME, NAME);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;putValue(Action.SHORT_DESCRIPTION, SHORT_DESCRIPTION);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;putValue(Action.ACTION_COMMAND_KEY, ACTION);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Verifica se a &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;a plataforma em questão provê suporte para a &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;classe Desktop.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;if (Desktop.isDesktopSupported()) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;desktop = Desktop.getDesktop();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;}&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;try {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;uri = new URI(MAILTO);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;} catch (URISyntaxException ex) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ex.printStackTrace();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;}&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void actionPerformed(final ActionEvent e) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;if (desktop != 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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Verifica se &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;a plataforma em questão provê suporte para essa &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;ação.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if (desktop.isSupported(Desktop.Action.MAIL)) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;try {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(102, 102, 102);"&gt;/*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; Finalmente, o ator principal entra em cena.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;* Abre a janela de composição do cliente de e-mail padrão&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(102, 102, 102);"&gt;* &lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;com os campos da mensagem especificados&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; pela &lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;mailto &lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;URI.  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;*/&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;desktop.mail(uri);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;} catch (IOException ex) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;ex.printStackTrace();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&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;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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;} else {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/*&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;Oh, my!! O sistema operacional não provê suporte, &lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;* ou para a classe Desktop, ou para a Desktop.Action.MAIL. &lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;*/&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JOptionPane.showMessageDialog(&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;null,&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"Impossível executar o cliente de e-mail padrão do sistema.",&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Atenção",&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JOptionPane.WARNING_MESSAGE);&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;&lt;/span&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;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;&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&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RdvHgP8pkYI/AAAAAAAAAcg/gPXbdRWJHw4/s1600-h/Desktop_API-Sending_Email_2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RdvHgP8pkYI/AAAAAAAAAcg/gPXbdRWJHw4/s320/Desktop_API-Sending_Email_2.png" alt="" id="BLOGGER_PHOTO_ID_5033836365367316866" border="0" /&gt;&lt;/a&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-jxhyperlink.html"&gt;SwingX - JXHyperlink&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxtaskpane-um-painel-de-tarefas.html"&gt;SwingX - JXTaskPane: Um Painel de Tarefas para o Seu Aplicativo&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Outras funcionalidades do Java SE 6 em:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/tray-icon-para-o-seu-aplicativo.html"&gt;Tray Icon para o Seu Aplicativo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/splash-screen.html"&gt;Splash Screen&lt;/a&gt;&lt;/li&gt;&lt;/ul&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://java.sun.com/developer/technicalArticles/javase/6_desktop_features_2/#4"&gt;New and Updated Desktop Features in Java SE 6, Part 2: The Desktop API&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/awt/Desktop.html"&gt;java.awt.Desktop&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-4585472624932033087?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/4585472624932033087/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=4585472624932033087&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4585472624932033087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4585472624932033087'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/desktop-api.html' title='Desktop API: Integração entre Aplicativos Java e o Sistema Operacional Nativo'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KYeHnrXYwPg/RdvHX_8pkXI/AAAAAAAAAcY/H35s4ed_IQs/s72-c/Desktop_API-Sending_Email.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-2430239496959204693</id><published>2007-03-02T03:03:00.000-03:00</published><updated>2007-03-24T19:46:15.539-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><title type='text'>SwingX - JXList</title><content type='html'>Extensão de &lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/components/list.html"&gt;JList&lt;/a&gt;, &lt;span style="font-weight: bold;"&gt;JXList&lt;/span&gt; fornece suporte para &lt;span style="font-style: italic;"&gt;highlighting&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;rollover&lt;/span&gt;, além de &lt;span style="font-style: italic;"&gt;filtering&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;sorting&lt;/span&gt;. Pode conter elementos atuando como &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxhyperlink.html"&gt;hyperlink&lt;/a&gt;.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;JXList in Action (1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;O &lt;/span&gt;&lt;span style="font-style: italic;"&gt;Highligter&lt;/span&gt; muda a cor de fundo das linhas da JXList, ditando regras sobre como essas linhas devem ser renderizadas. A figura abaixo mostra um JXList sem&lt;span style="font-style: italic;"&gt; highlighting&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://rfiume.blogspot.com/2007/03/ateno-artigo-em-construo.html"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdW_BmefWvI/AAAAAAAAAao/GI6EdbqaUeA/s320/JXList-Disabled.png" alt="" id="BLOGGER_PHOTO_ID_5032138192885603058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para habilitar o mecanismo de &lt;span style="font-style: italic;"&gt;highlighting&lt;/span&gt;, use algo parecido com o seguinte código:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXList list = new JXList();&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/* loadModel() é um factory cuja função é retornar uma instância de uma subclasse de DefaultListModel. */&lt;br /&gt;&lt;/span&gt;list.setModel(loadModel());&lt;br /&gt;list.setHighlighters(&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 HighlighterPipeline(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;new Highlighter[]{ AlternateRowHighlighter.quickSilver &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="font-style: italic;"&gt;AlternateRowHighlighter&lt;/span&gt; é subclasse de &lt;span style="font-style: italic;"&gt;Highlighter&lt;/span&gt; e possui algumas constantes &lt;span style="font-style: italic;"&gt;Highlighter&lt;/span&gt;'s pré-definidas. &lt;span style="font-style: italic;"&gt;HighlighterPipeline&lt;/span&gt; é instanciado com uma matriz unidimensional de &lt;span style="font-style: italic;"&gt;Highlighter&lt;/span&gt;'s. A próxima figura mostra o resultado.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdYAzmefWwI/AAAAAAAAAaw/ep118CDSoOU/s1600-h/JXList-Highlighter.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdYAzmefWwI/AAAAAAAAAaw/ep118CDSoOU/s320/JXList-Highlighter.png" alt="" id="BLOGGER_PHOTO_ID_5032210520134867714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O efeito de sobressair-se que uma linha, num certo componente, apresenta quando o cursor do mouse está sobre essa mesma linha é chamado &lt;span style="font-style: italic;"&gt;rollover&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Obtém o gerenciador de Highlighter's para adicionar mais um &lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;RolloverHighlighter&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; list.getHighlighters().addHighlighter(new RolloverHighlighter(Color.BLUE, Color.ORANGE));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;list.setRolloverEnabled(true);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Na figura abaixo, o cursor do mouse está sobre o &lt;span style="font-style: italic;"&gt;Item 5&lt;/span&gt;.&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdW6hmefWuI/AAAAAAAAAaQ/uzqVcmLmukY/s1600-h/JXList-Rollover.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdW6hmefWuI/AAAAAAAAAaQ/uzqVcmLmukY/s320/JXList-Rollover.png" alt="" id="BLOGGER_PHOTO_ID_5032133245083278050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;JXList in Action (2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Implementar filtro numa JXList é simples e direto. Os filtros estão desativados por padrão no SwingX 0.8.0 porque podem causar instabilidade.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Habilita filtro, que está desabilitado por padrão.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;list.setFilterEnabled(true);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Configura o filtro.&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;PatternFilter  patternFilter = new PatternFilter(null, 0, 0);&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;FilterPipeline filterPipeline&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; = new FilterPipeline(new Filter[] { patternFilter });&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;list.setFilters(filterPipeline);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Filtro será aplicado sempre que o método setPatern for chamado.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;patternFilter.setPattern(pattern);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na figura abaixo, aparecem apenas os elementos da JXList que contenham o número &lt;span style="font-style: italic;"&gt;1&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdfxsGefWzI/AAAAAAAAAbY/veqCMWyGz70/s1600-h/JXList-Filter.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdfxsGefWzI/AAAAAAAAAbY/veqCMWyGz70/s320/JXList-Filter.png" alt="" id="BLOGGER_PHOTO_ID_5032756848564853554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja outros componentes SwingX em:&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;br /&gt;&lt;/li&gt;&lt;/ul&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="https://swinglabs-demos.dev.java.net/source/browse/swinglabs-demos/"&gt;Código-fonte do Demo do SwingX&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/decorator/AlternateRowHighlighter.html"&gt;org.jdesktop.swingx.decorator.&lt;span&gt;AlternateRowHighlighter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/decorator/Highlighter.html"&gt;org.jdesktop.swingx.decorator.Highlighter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/decorator/AlternateRowHighlighter.html"&gt;org.jdesktop.swingx.decorator.HighlighterPipeline&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/decorator/Filter.html"&gt;org.jdesktop.swingx.decorator.Filter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/decorator/FilterPipeline.html"&gt;org.jdesktop.swingx.decorator.FilterPipeline&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXList.html"&gt;org.jdesktop.swingx.JXlist&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-2430239496959204693?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/2430239496959204693/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=2430239496959204693&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2430239496959204693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/2430239496959204693'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/swingx-jxlist.html' title='SwingX - JXList'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KYeHnrXYwPg/RdW_BmefWvI/AAAAAAAAAao/GI6EdbqaUeA/s72-c/JXList-Disabled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-4687784122597012889</id><published>2007-03-01T05:02:00.000-03:00</published><updated>2007-05-07T17:52:21.589-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Desktop Tips'/><title type='text'>Mais Widgets para Você - L2FProd</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Swing_%28Java%29"&gt;Swing&lt;/a&gt; tem componentes gráficos úteis, mas há outros faltando. Além dos &lt;a href="http://pt.wikipedia.org/wiki/Widgets"&gt;widgets&lt;/a&gt; &lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt;, há várias extensões Swing, algumas comerciais e proprietárias, outras livres. &lt;a style="font-weight: bold;" href="http://common.l2fprod.com/"&gt;L2FProd.com Common Components&lt;/a&gt; ajuda a preencher a lacuna dos componentes faltantes no Swing&lt;span class="fullpost"&gt;. O responsável por esse projeto é Frédérick Lavigne, que, entre outros trabalhos, está &lt;a href="https://jdnc-incubator.dev.java.net/documentation/l2fprod/"&gt;envolvido&lt;/a&gt; com o SwingX e é criador dos &lt;span style="font-style: italic;"&gt;look and feel's&lt;/span&gt; &lt;a href="http://javadesktop.org/articles/synth/index.html"&gt;Synth&lt;/a&gt; e &lt;a href="http://rfiume.blogspot.com/2007/02/skin-look-and-feel.html"&gt;SkinLF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Requer ao menos &lt;a href="http://rfiume.blogspot.com/2007/01/java-virtual-machine-jre-jdk-e-java.html"&gt;JDK&lt;/a&gt; 1.4.2 e está disponível sob a &lt;a href="http://www.apache.org/licenses/"&gt;Apache Software Lincense&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Teste alguns componentes L2FProd através do &lt;a href="http://common.l2fprod.com/jnlp/demo.jnlp"&gt;demo&lt;/a&gt; disponibilizado no &lt;a href="http://common.l2fprod.com/"&gt;site&lt;/a&gt; do projeto.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/ReYaLHTmaVI/AAAAAAAAAeQ/_b4p6TIKHLU/s1600-h/JOutlookBar.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/ReYaLHTmaVI/AAAAAAAAAeQ/_b4p6TIKHLU/s320/JOutlookBar.png" alt="" id="BLOGGER_PHOTO_ID_5036742011502618962" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Componentes L2FProd&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Componentes em comum com SwingX:&lt;ul&gt;&lt;li&gt;JCollapsiblePane (equivale ao &lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxcollapsiblepane-o-to-sonhado.html"&gt;JXCollapsiblePane&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;JLinkButton (equivale ao &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxhyperlink.html"&gt;JXHyperlink&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;JTaskPane (equivale ao &lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxtaskpanecontainer-container.html"&gt;JXTaskPaneContainer&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;JTaskPaneGroup (equivale ao &lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxtaskpane-um-painel-de-tarefas.html"&gt;JXTaskPane&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;Componentes de destaque:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JButtonBar&lt;/li&gt;&lt;li&gt;JDirectoryChooser&lt;/li&gt;&lt;li&gt;JFontChooser&lt;/li&gt;&lt;li&gt;JOutlookBar&lt;/li&gt;&lt;li&gt;PropertySheetPanel&lt;/li&gt;&lt;li&gt;PropertySheetTable&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Qualquer semelhança não é mera coincidência&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Frédérick Lavigne é &lt;span style="font-style: italic;"&gt;committer&lt;/span&gt; do projeto &lt;a href="http://swinglabs.org/"&gt;SwingLabs&lt;/a&gt; e responsável pelos &lt;span style="font-style: italic;"&gt;widgets&lt;/span&gt; do L2FProd, portanto não é estranho que os dois projetos tenham alguns componentes em comum.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;L2FProd em IDE's&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Assim como SwingX, componentes L2FProd podem ser adicionados à paleta de componentes de uma &lt;a href="http://pt.wikipedia.org/wiki/Ambiente_de_Desenvolvimento_Integrado"&gt;IDE&lt;/a&gt; e usados para a construção de &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI's&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;O processo para ter o L2FProd Common Componentes na paleta do NetBeans é idêntico ao explicado no artigo &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-netbeans-ide.html"&gt;SwingX &amp; NetBeans IDE&lt;/a&gt;, mudando apenas a biblioteca: substitua o SwingX pelo L2FProd.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Contribua Você Também!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;L2FProd Common Components requer contribuições, tanto com a participação no desenvolvimento da biblioteca, quanto na forma de donações.&lt;br /&gt;&lt;br /&gt;Inscreva-se no &lt;a href="http://java.net/"&gt;Java.net&lt;/a&gt; e junte-se ao projeto através de &lt;a href="https://l2fprod-common.dev.java.net/"&gt;https://l2fprod-common.dev.java.net&lt;/a&gt;. Para acessar o código-fonte no repositório do projeto, veja &lt;a href="http://rfiume.blogspot.com/2006/12/acesso-ao-repositrio-do-javanet-com-o.html"&gt;Acesso ao Repositório do Java.net com o NetBeans&lt;/a&gt;. No campo &lt;span style="font-style: italic;"&gt;Module&lt;/span&gt;, digite&lt;span style="font-style: italic;"&gt; l2fprod-common&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja componentes SwingX em:&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;br /&gt;&lt;/li&gt;&lt;/ul&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://common.l2fprod.com/"&gt;L2FProd&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://l2fprod-common.dev.java.net/"&gt;L2FProd (Java.net)&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-4687784122597012889?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/4687784122597012889/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=4687784122597012889&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4687784122597012889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4687784122597012889'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/03/mais-widgets-para-voc-l2fprod.html' title='Mais Widgets para Você - L2FProd'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_KYeHnrXYwPg/ReYaLHTmaVI/AAAAAAAAAeQ/_b4p6TIKHLU/s72-c/JOutlookBar.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-6686790407978516491</id><published>2007-02-28T22:47:00.000-03:00</published><updated>2007-05-07T17:50:47.474-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outros...'/><title type='text'>Kit de Detecção de Mentiras</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.submarino.com.br/HomeCache/AllSearchResult.aspx?Query=carl%20sagan&amp;franq=184104"&gt;&lt;img src="http://i.s8.com.br/images/books/cover/img3/1478553.jpg" alt="" style="margin: 0pt 0pt 0px 10px; float: right;" border="0" /&gt;&lt;/a&gt;Retirado do livro &lt;a href="http://www.submarino.com.br/books_productdetails.asp?Query=ProductPage&amp;ProdTypeId=1&amp;amp;ProdId=1478553&amp;ST=SR&amp;amp;franq=184104"&gt;O Mundo Assombrado pelos Demônios&lt;/a&gt;, de Carl Sagan, esse Kit de Detecção de Mentiras é uma ferramenta valiosa para ajudar a &lt;span style="font-style: italic;"&gt;separar o joio do trigo&lt;/span&gt; quando estamos debatendo e tentando entender diferentes proposições, o que nos levará a melhores decisões, com bases mais sólidas&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;O que fazer ao avaliar uma afirmação&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Obter confirmação independente dos fatos&lt;/span&gt;. Partidários de diversas posições devem tentar chegar a uma conclusão, da forma mais imparcial possível.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Considerar mais de uma hipótese&lt;/span&gt; (manter a mente aberta). Não se apegar logo à primeira idéia que pareça estar certa.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Tentar se desprender das próprias idéias&lt;/span&gt;. O importante é chegar ao melhor resultado possível. Idéias, próprias ou de outrem, são apenas um estágio intermediário, um meio para um fim.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Se algo que está sendo afirmado pode ser medido, esse algo deve ser quantificado&lt;/span&gt;. O que é vago e qualitativo é passível de muitas explicações.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Caso haja uma cadeia de argumentos,&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;todos&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; os elos da cadeia devem ser fortes, &lt;/span&gt;&lt;span&gt;e não apenas  a maioria deles&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Utilizar a Navalha de Occam&lt;/span&gt;: se duas ou mais hipóteses explicarem um fato com igual eficácia, deve-se ficar com a hipótese mais simples.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;A pergunta "&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;essa hipótese pode ser falseada&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; ?" deve sempre ser feita&lt;/span&gt;. Proposições que não podem ser testadas valem menos do que as que podem.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;O que não fazer&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Aceitar argumentos de autoridades&lt;/span&gt;. Autoridades cometeram erros no passado e cometerão no futuro. Exemplo: &lt;span style="font-style: italic;"&gt;Trabalho a trinta anos nessa área, e você ainda quer discutir comigo?&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Atacar o argumentador e não o argumento&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;O que importa o que diz Bill Gates sobre Linux, já que seu interesse é promover o Windows&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Argumento das causas adversas&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;Devemos expor ao ridículo aqueles que não sabem se comportar, caso contrário os novos visitantes apresentarão o mesmo tipo de mal comportamento.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Apelo a ignorância, afirmando que qualquer coisa que não foi provada verdadeira deve ser falsa, e vice-versa&lt;/span&gt;. Como Carl Sagan gostava de dizer, &lt;span&gt;a ausência de evidência não é evidência da ausência&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;Não há sinal de vida extraterrestre, portanto não existem &lt;/span&gt;&lt;span style="font-style: italic;"&gt;extraterrestres&lt;/span&gt;&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Alegação especial, geralmente utilizada para salvar uma proposição com dificuldades teóricas&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;Pergunta: Como posso acreditar que alguém possa prever meu futuro baseado na posição das estrelas, ou em "vozes do além"? Alegação especial: Entre o céu e a Terra há mais coisas do imaginamos.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Petição de princípio&lt;/span&gt; (ou supor a resposta). Ex: &lt;span style="font-style: italic;"&gt;Precisamos reduzir a idade penal para dezesseis anos se quisermos reduzir a criminalidade em nossso país.&lt;/span&gt; Reduzir a idade penal realmente diminui a criminalidade? Existem estudos demonstrando essa relação de causa e efeito?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Seleção das observações&lt;/span&gt; (de acordo com &lt;a href="http://pt.wikipedia.org/wiki/Francis_Bacon_%28fil%C3%B3sofo%29"&gt;Francis Bacon&lt;/a&gt;, contar os acertos e esquecer os fracassos). &lt;span style="color: rgb(0, 0, 0);"&gt;Ex: Ao consultar um vidente, horóscopo, cabala, ou algo do gênero, lembrar-se de todos os acertos, mas desconsiderar todas as previsões furadas.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Praticar a estatística dos números pequenos&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;Dizem que uma entre cinco pessoas no mundo são chinesas. Mas é claro que isso não é verdade, pois conheço centenas de pessoas e nenhuma delas é chinesa.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Compreensão errônea da natureza estatística&lt;/span&gt;. Ex: O presidente norte-americano &lt;a href="http://pt.wikipedia.org/wiki/Dwight_D._Eisenhower"&gt;Dwight Eisenhower&lt;/a&gt; espantando-se ao saber que metade dos norte-americanos tem inteligência abaixo da média.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Incoerência&lt;/span&gt;. Ex: Prudentemente armar-se até os dentes para se defender de potenciais nações inimigas, mas ignorar os danos ambientais e suas consequências, porque &lt;span style="font-style: italic;"&gt;"não são comprovadas"&lt;/span&gt; (vide Iraque vs. New Orleans).&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Non sequitor&lt;/span&gt; (em português, &lt;span style="font-style: italic;"&gt;não se segue&lt;/span&gt;). Ex: &lt;span style="font-style: italic;"&gt;Nossa empresa&lt;/span&gt; (ou tecnologia, nação, ou o que for) &lt;span style="font-style: italic;"&gt;prevalecerá, pois estamos trabalhando muito duro para isso&lt;/span&gt;. Acontece que as outras empresas (tecnólogos, nações) estão fazendo o mesmo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Post hoc, ergo propter hoc&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;(em português, &lt;span style="font-style: italic;"&gt;aconteceu após uma fato, logo foi por ele causado&lt;/span&gt;). Ex: &lt;span style="font-style: italic;"&gt;Não existiam armas nucleares antes das mulheres terem direito ao voto.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Pergunta sem sentido&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;Você será tão bom presidente quanto eu no futuro?&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Dicotomia falsa&lt;/span&gt; (exclusão do meio termo). Exemplos: &lt;span style="font-style: italic;"&gt;Brasil, ame-o ou deixe-o.&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Ou você está do meu lado, ou contra mim.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Curto prazo vs. longo prazo &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;(subconjunto da dicotomia falsa). Ex: &lt;span style="font-style: italic;"&gt;Para que investir em ciência e tecnologia se há pessoas que nem têm o que comer?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Declive escorregadio &lt;/span&gt;(relacionado à exclusão do meio-termo). Exemplos: &lt;span style="font-style: italic;"&gt;Se dermos a mão, logo irão querer nossos braços. Se cedermos um passo agora, seremos aniquilados depois.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Confusão de correlação e causa&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;Estudos mostram que a proporção de homossexuais que possuem curso superior é maior do que os que não o possuem. Ou seja, estudar torna a pessoa homossexual.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Espantalho - caricaturar uma posição para tornar mais fácil o ataque&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;Você é um executivo de uma grande empresa do setor financeiro. Pessoas como você só se preocupam em lucrar. Não temos que ouvir suas opiniões sobre movimentos sociais.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Meia-verdade (evidência suprimida)&lt;/span&gt;. Ex: &lt;span style="font-style: italic;"&gt;O mundo será um lugar melhor sem um tirano como governador de uma nação geopoliticamente explosiva&lt;/span&gt;. Mesmo que após a queda desse tirano sobrevenha uma guerra civil?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Palavras equívocas&lt;/span&gt; (eufemismo). Substituir palavras ou expressões desgostosas para um público por outras mais suaves. Políticos e empresas freqüentemente rebatizam seus produtos com novos nomes para que voltem a ser aceitável para esse público.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Quando bem aplicado, o Kit de Detecção de Mentiras pode fazer grande diferença, inclusive para avaliarmos nossos próprios argumentos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Quem é Carl Sagan ?&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;Professor de astronomia e ciências espaciais na Cornell University e autor de dezenas de livros e artigos, o norte-americano &lt;a href="http://en.wikipedia.org/wiki/Carl_Sagan"&gt;Carl Sagan&lt;/a&gt; dedicou a vida ao desenvolvimento e divulgação da ciência, recebendo diversos prêmios e medalhas por essa contribuição. Preocupado com o vírus do analfabetismo científico, que faz com que hoje muitos acreditem em explicações místicas e ficções, Sagan reafirma o poder positivo e benéfico da ciência e da tecnologia, revidando com informações surpreendentes, transmitidas de forma clara e irreverente. &lt;/blockquote&gt;Tradução de Rosaura Eichemberg.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-6686790407978516491?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/6686790407978516491/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=6686790407978516491&amp;isPopup=true' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6686790407978516491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6686790407978516491'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/kit-de-deteco-de-mentiras.html' title='Kit de Detecção de Mentiras'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-1826081726739069725</id><published>2007-02-26T03:50:00.000-03:00</published><updated>2007-05-22T17:50:37.448-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>Tray Icon para o Seu Aplicativo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RduWLf8pkUI/AAAAAAAAAb8/itoQ2-Qdfyw/s1600-h/TrayIcon-ModelMat.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RduWLf8pkUI/AAAAAAAAAb8/itoQ2-Qdfyw/s320/TrayIcon-ModelMat.png" alt="" id="BLOGGER_PHOTO_ID_5033782132815270210" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;System tray&lt;/span&gt;, ou ainda, Bandeja do Sistema em bom português, é a área do &lt;span style="font-style: italic;"&gt;desktop&lt;/span&gt; onde usuários podem acessar programas continuamente em execução. É denominado &lt;span style="font-style: italic;"&gt;Taskbar Status Area&lt;/span&gt; no Windows, &lt;span style="font-style: italic;"&gt;Notification Area&lt;/span&gt;, no GNOME, e &lt;span style="font-style: italic;"&gt;System Tray&lt;/span&gt;, no KDE.&lt;br /&gt;&lt;br /&gt;O &lt;span style="font-style: italic;"&gt;system tray&lt;/span&gt; contém um ou mais &lt;span style="font-style: italic;"&gt;tray icons&lt;/span&gt;, no Java SE 6, representados pela classe &lt;a style="font-style: italic;" href="http://java.sun.com/javase/6/docs/api/java/awt/TrayIcon.html"&gt;TrayIcon&lt;/a&gt;. &lt;span style="font-style: italic;"&gt;TrayIcon&lt;/span&gt; pode ter imagem, &lt;span style="font-style: italic;"&gt;tooltip text&lt;/span&gt;, menu &lt;span style="font-style: italic;"&gt;popup&lt;/span&gt; e vários &lt;span style="font-style: italic;"&gt;listeners&lt;/span&gt; associados a ele&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;TrayIcon in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O &lt;a href="http://rfiume.blogspot.com/2007/01/modelmat.html"&gt;ModelMat&lt;/a&gt; usa a classe &lt;span style="font-style: italic;"&gt;TrayIconManager&lt;/span&gt; para gerenciar a interação desse software com o &lt;span style="font-style: italic;"&gt;system tray&lt;/span&gt; do &lt;span style="font-style: italic;"&gt;desktop&lt;/span&gt; em que está rodando.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class TrayIconManager {&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Única instância dessa classe.&lt;/span&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;private static TrayIconManager trayIconManager;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// A estrela desse artigo: o Tray Icon!&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static TrayIcon trayIcon;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// O ícone que aparecerá no System Tray.&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static Image icon;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// A "bandeja do sistema".&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;span style="color: rgb(0, 0, 153);"&gt;private static SystemTray systemTray;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/* Action Listener para o Tray Icon.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;......&lt;span style="color: rgb(102, 102, 102);"&gt;*&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;Um action event é disparado quando há um duplo clique no Tray &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;Icon. */&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static TrayIconActionListener trayIconActionListener;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// O popup menu do tray icon.&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static PopupMenu popup;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Itens do popup menu.&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final MenuItem menuTip = new MenuItem();&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final MenuItem menuSobre = new MenuItem();&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final MenuItem menuSair  = new MenuItem();&lt;br /&gt;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private TrayIconManager() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;super();&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;&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;br /&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; static void setTrayIcon() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;synchronized (TrayIconManager.class) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if (trayIconManager == null) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;trayIconManager = new TrayIconManager();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Verifica se o sistema suporta system tray.&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;if (SystemTray.isSupported()) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Obtém system tray.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;systemTray = SystemTray.getSystemTray();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;icon  = Toolkit.getDefaultToolkit().getImage(&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;TrayIconManager.class.getResource("md1.gif"));&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;popup = new PopupMenu();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Inicializa tray icon.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;trayIcon = new TrayIcon(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;icon,&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; "Double-click to maximize/minimize the software",&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; popup);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// O ícone deve se enquadrar na bandeja do sistema.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;trayIcon.setImageAutoSize(true);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Adiciona um ActionListener ao tray icon.&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;trayIconActionListener = new TrayIconActionListener();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;trayIcon.addActionListener(trayIconActionListener);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Configura menu popup.&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;menuTip.setLabel("Tip of the Day");&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;menuTip.addActionListener(new ShowTipOfTheDay());&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;popup.add(menuTip);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;menuSobre.setLabel("About              ");&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;menuSobre.addActionListener(new ShowAboutDialog());&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;popup.add(menuSobre);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;popup.addSeparator();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;menuSair.setLabel("Exit");&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;menuSair.addActionListener(new ExitApplication());&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;popup.add(menuSair);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Adiciona o tray icon no system tray.&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;try {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;systemTray.add(trayIcon);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;} catch (AWTException ex) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ex.printStackTrace();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;} else {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; Ops! A plataforma não provê suporte para system trays.&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; Fazer algo aqui, como registrar num arquivo de log.&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;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;&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;br /&gt;&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private class TrayIconActionListener implements ActionListener {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;public void actionPerformed(final ActionEvent e) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;trayIcon.displayMessage(&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Oh my!",&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"You double-clicked the tray icon!", &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;TrayIcon.MessageType.INFO);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;}&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;&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;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static class ShowTipOfTheDay implements ActionListener {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;public void actionPerformed(final ActionEvent e) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;TipOfTheDay.show(null, 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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;}&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;&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;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static class ShowAboutDialog implements ActionListener {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;public void actionPerformed(final ActionEvent e) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;AboutDialog.showDialog();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;}&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;&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;br /&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static class ExitApplication implements ActionListener {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;public void actionPerformed(final ActionEvent e) {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;System.exit(0);&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;}&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;&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;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A classe principal do sistema, &lt;span style="font-style: italic;"&gt;org.modelmat.main.ModelMat&lt;/span&gt;, só precisa chamar &lt;span style="color: rgb(0, 0, 153);"&gt;TrayIconManager.&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setTrayIcon()&lt;/span&gt; para ter o seu &lt;span style="font-style: italic;"&gt;tray icon&lt;/span&gt; devidamente configurado no &lt;span style="font-style: italic;"&gt;system tray&lt;/span&gt; do &lt;span style="font-style: italic;"&gt;desktop&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Leitura Recomendada:&lt;br /&gt;&lt;/span&gt;&lt;ul&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/search/label/Desktop%20Tips"&gt;Desktop Tips (Splash Screen, Tray Icon, Desktop API e outros)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt;&lt;/li&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="https://modelmat.dev.java.net/"&gt;ModelMat (Java.net)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/search/label/ModelMat"&gt;ModelMat em Wonderland&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fontes Utilizadas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/javase/6_desktop_features/#SystemTray"&gt;New and Updated Desktop Features in Java SE 6, Part 1: System Tray&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/"&gt;New System Tray Functionality in Java SE 6&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/awt/TrayIcon.html"&gt;java.awt.TrayIcon&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/awt/SystemTray.html"&gt;java.awt.SystemTray&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-1826081726739069725?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/1826081726739069725/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=1826081726739069725&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/1826081726739069725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/1826081726739069725'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/tray-icon-para-o-seu-aplicativo.html' title='Tray Icon para o Seu Aplicativo'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KYeHnrXYwPg/RduWLf8pkUI/AAAAAAAAAb8/itoQ2-Qdfyw/s72-c/TrayIcon-ModelMat.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-3945729347450611077</id><published>2007-02-23T15:45:00.000-02:00</published><updated>2007-03-24T20:33:53.827-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><title type='text'>SwingX - JXGlassBox</title><content type='html'>&lt;span style="font-weight: bold;"&gt;JXGlassBox&lt;/span&gt; é, de acordo com sua &lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXGlassBox.html"&gt;documentação&lt;/a&gt;,&lt;br /&gt;&lt;blockquote&gt;um componente usado para mostrar conteúdo &lt;a href="http://pt.wiktionary.org/wiki/Transl%C3%BAcido"&gt;translúcido&lt;/a&gt; na interface gráfica para o usuário.  Esse componente e todo o seu conteúdo será mostrado com o valor especificado na propriedade de translucência &lt;span style="font-style: italic;"&gt;alpha&lt;/span&gt;.&lt;/blockquote&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;JXGlassBox In Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O componente de boas-vindas desse aplicativo esconde&lt;span class="fullpost"&gt; o calendário do usuário. Ao clicar no ícone, um &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxhyperlink.html"&gt;hyperlink&lt;/a&gt; com a figura de calendário, o JXGlassBox contendo o &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxmonthview.html"&gt;JXMonthView&lt;/a&gt; aparece na &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdfjMGefWyI/AAAAAAAAAbI/23MyF8ebcbM/s1600-h/JXGlassBox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdfjMGefWyI/AAAAAAAAAbI/23MyF8ebcbM/s320/JXGlassBox.png" alt="" id="BLOGGER_PHOTO_ID_5032740905646250786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;O JXGlassBox apenas "se esconde" novamente quando o usuário clica nele. Perceba como é translúcido.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdS0j2efWlI/AAAAAAAAAYs/hQIBP81-BrI/s1600-h/JXGlassBox-Alpha-Property.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdS0j2efWlI/AAAAAAAAAYs/hQIBP81-BrI/s320/JXGlassBox-Alpha-Property.png" alt="" id="BLOGGER_PHOTO_ID_5031845211691506258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Segue o código relevante para utilizar o JXGlassBox dessa forma:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXGlassBox glassBox = new JXGlassBox();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXMonthView monthView = new JXMonthView();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;glassBox.setLayout(new BorderLayout());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;glassBox.add(monthView, BorderLayout.CENTER);&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Adiciona borda DropShadow no glassBox.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;glassBox.setBorder(new DropShadowBorder());&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Cria hyperlink.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXHyperlink hCalendario = new JXHyperlink();&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Adiciona listener ao hyperlink.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;hCalendario.addActionListener(new ActionListener() {&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void actionPerformed(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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;calendarioActionPerformed(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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&gt;});&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Adiciona listener ao monthView.&lt;/span&gt;&lt;br /&gt;monthView.addMouseListener(new MouseAdapter() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public void mouseClicked(MouseEvent evt) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;monthViewMouseClicked(evt);&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;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;span style="color: rgb(0, 0, 153);"&gt;});&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;. . .&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;// Faz com que o glassBox apareça quando o usuário clicar no hyperlink.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private void calendarioActionPerformed(ActionEvent evt) {&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;Container glassPane = (Container) getRootPane().getGlassPane();&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(102, 102, 102);"&gt;// Faz com que apenas um JXGlassBox seja visto por vez.&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;Component glassPaneChildren[] = glassPane.getComponents();&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;for(int i = 0; i&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt; glassPaneChildren.length; ++) {&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;glassPaneChildren[i].setVisible(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;glassPane.remove(glassPaneChildren[i]);&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;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;Point p = SwingUtilities.convertPoint(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;this, hCalendario.getX(), hCalendario.getY(), null);&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;span style="color: rgb(0, 0, 153);"&gt;glassBox.showOnGlassPane(glassPane, p.x, p.y);&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;span style="color: rgb(0, 0, 153);"&gt;glassBox.setVisible(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Faz com que o glassBox desapareça quando o usuário clicar no monthView.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private void monthViewMouseClicked(MouseEvent 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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;glassBox.setVisible(false);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;JXGlassBox nas mãos de desenvolvedores criativos pode adicionar muito valor à interface gráfica de um aplicativo Swing.&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-jxhyperlink.html"&gt;JXHyperlink&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxmonthview.html"&gt;JXMonthView&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Veja outros componentes SwingX em:&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 style="font-weight: bold;"&gt;Referências:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXGlassBox.html"&gt;org.jdesktop.swingx.JXGlassBox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Código-fonte do Demo do SwingX&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-3945729347450611077?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/3945729347450611077/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=3945729347450611077&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3945729347450611077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3945729347450611077'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/swingx-jxglassbox.html' title='SwingX - JXGlassBox'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KYeHnrXYwPg/RdfjMGefWyI/AAAAAAAAAbI/23MyF8ebcbM/s72-c/JXGlassBox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-6669955573530013381</id><published>2007-02-21T01:50:00.000-02:00</published><updated>2007-05-22T17:50:37.449-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Swing Development'/><title type='text'>Splash Screen</title><content type='html'>Quando fui mostrar um dos primeiros softwares que fiz em Java para um colega da faculdade, logo veio a pergunta: "&lt;span style="font-style: italic;"&gt;e aquela telinha que aparece enquanto o aplicativo está carregando&lt;/span&gt;" ?&lt;br /&gt;&lt;br /&gt;Era a &lt;span style="font-style: italic;"&gt;splash screen&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Sinceramente, eu nem havia pensado nisso, então perguntei se ele achava a &lt;span style="font-style: italic;"&gt;splash screen&lt;/span&gt; deveras importante. A resposta: "Claro"! Eu estava preocupadíssimo com a integridade dos dados, principalmente quando houvesse acesso simultâneo ao software através de vários clientes e ele me cobra uma &lt;span style="font-style: italic;"&gt;splash screen?&lt;/span&gt;!&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Ok! Como ele estava fazendo o papel de um potencial cliente, resolvi colocar a &lt;span style="font-style: italic;"&gt;splash&lt;/span&gt; &lt;span style="font-style: italic;"&gt;screen&lt;/span&gt; no aplicativo. &lt;span style="font-style: italic;"&gt;Newbie &lt;/span&gt;total, quase perdi um churrasco no Sábado para conseguir implementar essa &lt;span style="font-style: italic;"&gt;splash screen&lt;/span&gt; e ainda tive que contar com [muita] ajuda do Google e de outros programadores que disponibilizaram código na Web.&lt;br /&gt;&lt;br /&gt;Além de quase perder o churrasco, tive que aturar outro colega, desenvolvedor .NET, tirar onda pela dificuldade que tive. "&lt;span style="font-style: italic;"&gt;Ahahaha! Com .Net é só selecionar o arquivo de imagem e pronto!&lt;/span&gt;" Confesso que fiquei com inveja...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Seus problemas acabaram!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Isso tudo foi antes do Java SE 6.&lt;br /&gt;&lt;br /&gt;Se o aplicativo é iniciado a partir da linha de comando ou atalho, basta utilizar a opção &lt;span style="font-size:130%;"&gt;&lt;code&gt;-splash&lt;/code&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;java -splash:app_splash_screen.gif  Application&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se o aplicativo estiver empacotado num arquivo .JAR, inclua a opção &lt;span style=";font-family:courier new;font-size:85%;"  &gt;SplashScreen-Image:&lt;/span&gt; no MANIFEST.mf. Especifique o caminho para a imagem que servirá como &lt;span style="font-style: italic;"&gt;splash screen&lt;/span&gt;, que por sua vez deverá estar nesse arquivo .JAR.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;code&gt;SplashScreen-Image: org/modelmat/resources/images/modelmat.gif&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rds0iv8pkSI/AAAAAAAAAbk/LEkDsjgt1OM/s1600-h/SplashScreen-ModelMat.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rds0iv8pkSI/AAAAAAAAAbk/LEkDsjgt1OM/s320/SplashScreen-ModelMat.png" alt="" id="BLOGGER_PHOTO_ID_5033674780107706658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;E não é só isso...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Utilizando &lt;a href="http://en.wikipedia.org/wiki/Abstract_Windowing_Toolkit"&gt;AWT&lt;/a&gt; ou &lt;a href="http://en.wikipedia.org/wiki/Swing_%28Java%29"&gt;Swing&lt;/a&gt; para implementar a &lt;span style="font-style: italic;"&gt;splash screen&lt;/span&gt;, a &lt;a href="http://rfiume.blogspot.com/2007/01/java-virtual-machine-jre-jdk-e-java.html"&gt;JVM&lt;/a&gt;, AWT, provavelmente Swing e talvez até bibliotecas de terceiros precisavam ser inicializadas para que a &lt;span style="font-style: italic;"&gt;splash&lt;/span&gt; aparecesse.&lt;br /&gt;&lt;br /&gt;Além da facilidade, a &lt;span style="font-style: italic;"&gt;splash screen&lt;/span&gt; no Java SE 6 irá aparecer muito antes porque não precisa esperar todo esse &lt;span style="font-style: italic;"&gt;startup&lt;/span&gt;.&lt;br /&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/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/search/label/Desktop%20Tips"&gt;Desktop Tips (Splash Screen, Tray Icon, Desktop API e outros)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/swingx.html"&gt;SwingX&lt;/a&gt;&lt;/li&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;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Fonte Utilizada:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/javase/6_desktop_features/#SplashScreens"&gt;New and Updated Desktop Features in Java SE 6, Part 1: Splash Screens&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-6669955573530013381?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/6669955573530013381/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=6669955573530013381&amp;isPopup=true' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6669955573530013381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6669955573530013381'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/splash-screen.html' title='Splash Screen'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KYeHnrXYwPg/Rds0iv8pkSI/AAAAAAAAAbk/LEkDsjgt1OM/s72-c/SplashScreen-ModelMat.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-4035796138113054920</id><published>2007-02-19T10:36:00.000-02:00</published><updated>2007-03-24T21:00:17.770-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><title type='text'>SwingX - JXCollapsiblePane</title><content type='html'>&lt;span style="font-weight: bold;"&gt;JXCollapsiblePane&lt;/span&gt; extende as funcionalidades de &lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/components/panel.html"&gt;JPanel&lt;/a&gt;, acrescentando a capacidade de retração / expansão de sua área de conteúdo, com animação e efeitos do tipo &lt;span style="font-style: italic;"&gt;fade-in / fade-out&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A &lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXCollapsiblePane.html"&gt;documentação&lt;/a&gt; do JXCollapsiblePane tem um exemplo para entender como utilizar JXCollapsiblePane. Os métodos importantes para seu manuseio são&lt;span class="fullpost"&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setAnimated()&lt;/span&gt; / &lt;span style="color: rgb(0, 0, 153);"&gt;isAnimated()&lt;/span&gt;, que controlam a animação fade-in / fade-out.&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;setCollapsed()&lt;/span&gt; / &lt;span style="color: rgb(0, 0, 153);"&gt;isCollapsed()&lt;/span&gt;,  que controlam a retração / expansão do painel.&lt;/li&gt;&lt;/ul&gt;JXCollapsiblePane conta com um &lt;span style="font-style: italic;"&gt;Action&lt;/span&gt; pronto para uso, que retrai / expande esse componente. Para obtê-lo use:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXCollapsiblePane &lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;collapsiblePane = new JX&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;CollapsiblePane();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Action action = collapsiblePane.getActionMap().get("toggle");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;JXCollapsiblePane in Action&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Na figura abaixo, o painel de listagem dos produtos está retraído.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RdS-nmefWmI/AAAAAAAAAY8/LV03xKPx9OU/s1600-h/JXCollapsiblePane.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RdS-nmefWmI/AAAAAAAAAY8/LV03xKPx9OU/s320/JXCollapsiblePane.png" alt="" id="BLOGGER_PHOTO_ID_5031856271232293474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Após clicar no botão de listagem, o painel começa se expandir.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdS-42efWoI/AAAAAAAAAZM/nZR26ZZdNgs/s1600-h/JXCollapsiblePane-Expanding.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RdS-42efWoI/AAAAAAAAAZM/nZR26ZZdNgs/s320/JXCollapsiblePane-Expanding.png" alt="" id="BLOGGER_PHOTO_ID_5031856567585036930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Finalmente, os "itens cadastrados" tornam-se visíveis.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_KYeHnrXYwPg/RdS-yWefWnI/AAAAAAAAAZE/dQE8Oh8jSRo/s1600-h/JXCollapsiblePane-Expanded.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_KYeHnrXYwPg/RdS-yWefWnI/AAAAAAAAAZE/dQE8Oh8jSRo/s320/JXCollapsiblePane-Expanded.png" alt="" id="BLOGGER_PHOTO_ID_5031856455915887218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja outros componentes SwingX em:&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;li&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html"&gt;The Java Tutorial - How to Use Actions&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Referência:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXCollapsiblePane.html"&gt;org.jdesktop.swingx.JXCollapsiblePane&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-4035796138113054920?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/4035796138113054920/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=4035796138113054920&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4035796138113054920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/4035796138113054920'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/swingx-jxcollapsiblepane-o-to-sonhado.html' title='SwingX - JXCollapsiblePane'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KYeHnrXYwPg/RdS-nmefWmI/AAAAAAAAAY8/LV03xKPx9OU/s72-c/JXCollapsiblePane.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-8343004297839638643</id><published>2007-02-16T04:46:00.000-02:00</published><updated>2007-05-07T17:52:21.590-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Desktop Tips'/><title type='text'>Do JGoodies para Você: Um Painel com Barra de Título Gradiente</title><content type='html'>Uma alternativa ao &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxtitledpanel.html"&gt;JXTitledPanel&lt;/a&gt;, componente SwingX, é o &lt;span style="font-weight: bold;"&gt;SimpleInternalFrame&lt;/span&gt; do &lt;a href="http://www.jgoodies.com/index.html"&gt;JGoodies&lt;/a&gt;.  Na figura abaixo, o aplicativo demo do JGoodies, &lt;a href="http://www.jgoodies.com/download/demos/skeleton-pro/skeleton-pro.jnlp"&gt;Skeleton Pro&lt;/a&gt;, faz uso de SimpleInternalFrame&lt;span class="fullpost"&gt;.&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.jgoodies.com/freeware/skeleton-pro/images/skeleton-pro.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.jgoodies.com/freeware/skeleton-pro/images/skeleton-pro.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;SimpleInternalFrame&lt;span style="color: rgb(204, 102, 0);"&gt; &lt;/span&gt;consiste numa área de conteúdo e uma área de título em cores degradê, com ícone e&lt;span style="color: rgb(204, 102, 0);"&gt; &lt;/span&gt;barra de ferramenta opcionais e borda do tipo &lt;span style="font-style: italic;"&gt;drop shadow&lt;/span&gt;.&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;A classe SimpleInternalFrame está no pacote &lt;span style="font-style: italic;"&gt;com.jgoodies.uif-lite.panel&lt;/span&gt;, encontrada na pasta src/examples/demo/ da distribuição Looks 2.0. Copie a classe no seu projeto, ou crie um arquivo JAR contendo a classe e &lt;a href="http://rfiume.blogspot.com/2007/01/adicionando-uma-biblioteca-ao-classpath.html"&gt;adicione-a ao classpath do aplicativo&lt;/a&gt;.&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;Vantagens&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As vantagens do SimpleInternalFrame sobre o JXTitlePanel são:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SimpleInternalFrame é licenciado sob &lt;a href="http://en.wikipedia.org/wiki/Berkeley_Software_Distribution"&gt;BSD&lt;/a&gt;, enquanto os componentes SwingX o são sob &lt;a href="http://rfiume.blogspot.com/2007/01/lgpl.html"&gt;LGPL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;SimpleInternalFrame funciona perfeitamente com o &lt;a href="http://rfiume.blogspot.com/2007/02/substance-look-and-feel.html"&gt;Substance Look and Feel&lt;/a&gt;, enquanto o JXTitledPanel não funciona&lt;/li&gt;&lt;li&gt;SimpleInternalFrame configura as cores de sua barra de título gradiente automaticamente, de acordo com o &lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel.html"&gt;look and feel&lt;/a&gt; utilizado pelo aplicativo; é preciso configurar manualmente as cores da barra de título do JXTitlePanel.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;A desvantagem é:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Difícil integração com a Matisse - o construtor de interfaces gráficas do NetBeans.&lt;br /&gt;&lt;/li&gt;&lt;/ul&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 style="font-weight: bold;"&gt;Referência:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javalobby.org/forums/thread.jspa?forumID=17&amp;amp;threadID=11031"&gt;Eclipse-like Panel: JGoodies SimpleInternalFrame&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-8343004297839638643?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/8343004297839638643/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=8343004297839638643&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8343004297839638643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/8343004297839638643'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/do-jgoodies-para-voc-um-painel-com.html' title='Do JGoodies para Você: Um Painel com Barra de Título Gradiente'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-6780209507523887924</id><published>2007-02-15T04:31:00.000-02:00</published><updated>2007-03-24T20:59:34.433-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><title type='text'>SwingX - JXTaskPaneContainer</title><content type='html'>&lt;span style="font-weight: bold;"&gt;JXTaskPaneContainer&lt;/span&gt; é feito sob medida para &lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxtaskpane-um-painel-de-tarefas.html"&gt;JXTaskPane's&lt;/a&gt; que, embora possam ser adicionados em qualquer container, possuem um &lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel.html"&gt;&lt;span style="font-style: italic;"&gt;look and feel &lt;/span&gt;&lt;/a&gt;mais parecido com o sistema operacional nativo quando estão sobre o JXTaskPaneContainer&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;É aconselhável que o JXTaskPaneContainer esteja contido num JScrollPane para que a barra de rolagem vertical apareça nos casos onde o JXTaskPaneContainer não possa ser completamente visível.&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;JXTaskPaneContainer possui seis &lt;span style="font-style: italic;"&gt;look and feel's&lt;/span&gt; diferentes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Metal&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Windows Classic&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Windows Luna&lt;/li&gt;&lt;li&gt;Windows Homestead&lt;/li&gt;&lt;li&gt;Windows Silver&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Glossy&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Veja o &lt;a href="https://jdnc-incubator.dev.java.net/documentation/l2fprod/jnlp/l2fprod.jnlp"&gt;demo&lt;/a&gt; do &lt;a href="http://swinglabs.org/"&gt;SwingLabs&lt;/a&gt; para melhor conhecer os seis tipos de L&amp;F's.&lt;br /&gt;&lt;br /&gt;Em alguns casos, é possível configurar o JXTaskPaneContainer programaticamente para alterar o &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; padrão.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Metal&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Adicione esse código na classe que contém o objeto JXTaskPaneContainer.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;LookAndFeelAddons.setAddon(MetalLookAndFeelAddons.class);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Se a versão da JVM for 5.0 ou superior...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;UIManager.getLookAndFeelDefaults().put(JXTaskPane.uiClassID,&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;"org.jdesktop.swingx.plaf.misc.GlossyTaskPaneUI");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/RcwvxmefWXI/AAAAAAAAAWE/Lu7NDq01VeI/s1600-h/JXTaskPaneContainer-Metal.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/RcwvxmefWXI/AAAAAAAAAWE/Lu7NDq01VeI/s320/JXTaskPaneContainer-Metal.png" alt="" id="BLOGGER_PHOTO_ID_5029447413054527858" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Windows Classic&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;/span&gt;Adicione esse código na classe que contém o objeto JXTaskPaneContainer.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;UIManager.put("win.xpstyle.name", null);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;LookAndFeelAddons.setAddon(WindowsClassicLookAndFeelAddons.class);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RcwyB2efWYI/AAAAAAAAAWM/LfqDfFemXTU/s1600-h/JXTaskPaneContainer-Windows-Classic.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RcwyB2efWYI/AAAAAAAAAWM/LfqDfFemXTU/s320/JXTaskPaneContainer-Windows-Classic.png" alt="" id="BLOGGER_PHOTO_ID_5029449891250657666" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Windows Luna&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Adicione esse código na clas... Bem, você já deve saber.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; UIManager.put("win.xpstyle.name", "luna");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;  LookAndFeelAddons.setAddon(WindowsLookAndFeelAddons.class);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Windows Homestead&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;UIManager.put("win.xpstyle.name", "homestead");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;LookAndFeelAddons.setAddon(WindowsLookAndFeelAddons.class);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Windows Silver&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;UIManager.put("win.xpstyle.name", "metallic");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; LookAndFeelAddons.setAddon(WindowsLookAndFeelAddons.class);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/RcwyK2efWZI/AAAAAAAAAWU/Q8iLiRN9g70/s1600-h/JXTaskPaneContainer-Windows-Metallic.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/RcwyK2efWZI/AAAAAAAAAWU/Q8iLiRN9g70/s320/JXTaskPaneContainer-Windows-Metallic.png" alt="" id="BLOGGER_PHOTO_ID_5029450045869480338" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Glossy&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;LookAndFeelAddons.setAddon(MacOSXLookAndFeelAddons.class);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;O Glossy não está disponível no SwingX 0.8.0. Se quiser fazer uso do &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; do Mac OS X, é preciso &lt;a href="http://rfiume.blogspot.com/2006/12/acesso-ao-repositrio-do-javanet-com-o.html"&gt;acessar o repositório do Java.net&lt;/a&gt;,  módulo &lt;span style="font-style: italic;"&gt;swingx&lt;/span&gt;, compilar, gerar o arquivo &lt;span style="font-style: italic;"&gt;jar&lt;/span&gt; e &lt;a href="http://rfiume.blogspot.com/2007/01/adicionando-uma-biblioteca-ao-classpath.html"&gt;adicioná-lo ao &lt;span style="font-style: italic;"&gt;classpath&lt;/span&gt; do aplicativo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja outros componentes SwingX em:&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;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxtaskpane-um-painel-de-tarefas.html"&gt;JXTaskPane&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&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://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXTaskPaneContainer.html"&gt;org.jdesktop.swingx.JXTaskPaneContainer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://swingx.dev.java.net/source/browse/swingx/"&gt;Código-fonte do SwingX&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-6780209507523887924?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/6780209507523887924/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=6780209507523887924&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6780209507523887924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/6780209507523887924'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/swingx-jxtaskpanecontainer-container.html' title='SwingX - JXTaskPaneContainer'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KYeHnrXYwPg/RcwvxmefWXI/AAAAAAAAAWE/Lu7NDq01VeI/s72-c/JXTaskPaneContainer-Metal.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-7421898499025401661</id><published>2007-02-14T00:20:00.000-02:00</published><updated>2007-03-24T17:31:42.158-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Look and Feel'/><title type='text'>Skin Look And Feel</title><content type='html'>Baseado na descrição no &lt;a href="http://skinlf.l2fprod.com/index.html"&gt;sítio&lt;/a&gt; do projeto,&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://skinlf.l2fprod.com/index.html"&gt;&lt;span style="font-weight: bold;"&gt;Skin Look And Feel&lt;/span&gt;&lt;/a&gt; permite à desenvolvedores Java escrever aplicativos &lt;span style="font-style: italic;"&gt;skinnable        &lt;/span&gt;[i.e. que trocam de &lt;span style="font-style: italic;"&gt;skins&lt;/span&gt;] utilizando o  &lt;a href="http://pt.wikipedia.org/wiki/Toolkit"&gt;toolkit&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Swing_%28Java%29"&gt;Swing&lt;/a&gt;. É capaz de carregar pacotes de temas (um conjunto de &lt;span style="font-style: italic;"&gt;skins&lt;/span&gt; &lt;a href="http://pt.wikipedia.org/wiki/GTK"&gt;GTK&lt;/a&gt; ou &lt;a href="http://pt.wikipedia.org/wiki/KDE"&gt;KDE&lt;/a&gt;) para incrementar &lt;a href="http://en.wikipedia.org/wiki/Widget_%28computing%29"&gt;widgets&lt;/a&gt; de uma GUI. Skin Look And Feel (aka SkinLF) também inclui NativeSkin para criar &lt;span style="font-style: italic;"&gt;irregular windows&lt;/span&gt;.&lt;/blockquote&gt;Requer ao menos &lt;a href="http://rfiume.blogspot.com/2007/01/java-virtual-machine-jre-jdk-e-java.html"&gt;JDK&lt;/a&gt; 1.3 e é distribuído sob a licença &lt;a href="http://www.ibiblio.org/maven/skinlf/licenses/license.php"&gt;Skin Look and Feel License&lt;/a&gt;, baseada na licença &lt;a href="http://www.apache.org/licenses/LICENSE-2.0"&gt;Apache License&lt;/a&gt;&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(204, 102, 0);"&gt;Themepack&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SkinLF permite aos desenvolvedores empacotar temas GTK e KDE num arquivo Zip chamado &lt;span style="font-style: italic;"&gt;themepack&lt;/span&gt;.&lt;br /&gt;Esse arquivo contém o tema GTK ou KDE e um &lt;span style="font-style: italic;"&gt;descriptor&lt;/span&gt; em XML. Há vários &lt;span style="font-style: italic;"&gt;themepacks&lt;/span&gt; disponíveis para download no &lt;a href="http://javootoo.l2fprod.com/plaf/skinlf/index.php"&gt;Javootoo&lt;/a&gt;. Teste alguns através desse &lt;a href="http://www.l2fprod.com/software/skinlf/jnlp/demo.jnlp"&gt;demo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para mais informações, veja &lt;a href="http://dev.l2fprod.com/tutorials/page5/tutorial-themepack.php"&gt;Understanding Theme Pack Format&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;SkinLF in Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Há duas formas de utilizar o SkinLF diferentes: alterar o &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; programaticamente e o modo &lt;a href="http://dev.l2fprod.com/tutorials/page2/tutorial-firstaid.php"&gt;&lt;span style="font-style: italic;"&gt;Skinit&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Faça o &lt;a href="http://dev.l2fprod.com/download/index.php"&gt;download&lt;/a&gt; do SkinLF, &lt;a href="http://rfiume.blogspot.com/2007/01/adicionando-uma-biblioteca-ao-classpath.html"&gt;adicione a biblioteca ao classpath do projeto&lt;/a&gt; e utilize o método &lt;span style="font-style: italic;"&gt;setLookAndFeel(LookAndFeel laf),&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;UIManager&lt;/span&gt;&lt;span style="font-style: italic;"&gt;, &lt;/span&gt;durante a execução de &lt;span style="font-style: italic;"&gt;main&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;para alterar o &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; programaticamente.&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;br /&gt;// Define o skin (i.e, o theme pack).&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Skin theSkinToUse = SkinLookAndFeel.loadThemePack(&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;ModelMat.class.getResourceAsStream("aquathemepack.zip"));&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;SkinLookAndFeel.setSkin(theSkinToUse);&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Define o look and feel.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;UIManager.setLookAndFeel(new SkinLookAndFeel());&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdCf_GefWgI/AAAAAAAAAX0/6l_rctJgpzY/s1600-h/ModelMat-Skin-Aqua.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_KYeHnrXYwPg/RdCf_GefWgI/AAAAAAAAAX0/6l_rctJgpzY/s320/ModelMat-Skin-Aqua.png" alt="" id="BLOGGER_PHOTO_ID_5030696690191915522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Conversores de Temas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SkinLF tem como um de seus objetivos adicionar suporte a novos &lt;span style="font-style: italic;"&gt;theme engines&lt;/span&gt; além do GTK e KDE nas próximas versões. Mas, nesse meio tempo, é possível converter um &lt;span style="font-style: italic;"&gt;Microsoft Visual Style&lt;/span&gt; para um &lt;span style="font-style: italic;"&gt;SkinLF themepack&lt;/span&gt; usando &lt;span style="font-style: italic;"&gt;converters&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Um conversor irá converter (sic) um &lt;span style="font-style: italic;"&gt;skin&lt;/span&gt; de formato específico para um &lt;span style="font-style: italic;"&gt;theme pack&lt;/span&gt; usando GTK e KDE &lt;span style="font-style: italic;"&gt;engines&lt;/span&gt;. Veja &lt;a href="http://dev.l2fprod.com/tutorials/page6/tutorial-msstyle.php"&gt;Converting a Microsoft Visual Style to a SkinLF themepack&lt;/a&gt; para entender como isso pode ser feito.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Native Skin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SkinLF provê aos desenvolvedores acesso à funcionalidades nativas do sistema operacional, como &lt;span style="font-style: italic;"&gt;always on top&lt;/span&gt;, transparência e &lt;span style="font-style: italic;"&gt;irregular windows&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Para informações adicionais, veja o tutorial &lt;a href="http://dev.l2fprod.com/tutorials/page4/tutorial-clock.php"&gt;A Clock using NativeSkin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Contribua Você Também!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SkinLF requer desenvolvedores e escritores técnicos para corrigir &lt;span style="font-style: italic;"&gt;bugs&lt;/span&gt;, criar documentação, entre outras tarefas. Para contribuir, registre-se no &lt;a href="http://java.net/"&gt;Java.net &lt;/a&gt;e junte-se ao projeto, ou participe da &lt;a href="https://skinlf.dev.java.net/servlets/ProjectMailingListList"&gt;lista de discussões&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Veja mais sobre &lt;span style="font-style: italic;"&gt;look and feel&lt;/span&gt; em:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel.html"&gt;Look and Feel - Introdução&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel-jgoodies-looks.html"&gt;JGoodies Look and Feel&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel-napkin.html"&gt;Napkin L&amp;F&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/02/substance-look-and-feel.html"&gt;Substance Look and Feel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/03/look-and-feel-voc-conhece-o-nimbus.html"&gt;Nimbus Look and Feel&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&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="https://skinlf.dev.java.net/"&gt;SkinLF (Java.net)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jroller.com/page/l2fprod?entry=differences_between_skinlf_and_synth"&gt;Differences Between SkinLF and Synth&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dev.l2fprod.com/converter/index.php"&gt;Theme Converter&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-7421898499025401661?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/7421898499025401661/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=7421898499025401661&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7421898499025401661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/7421898499025401661'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/skin-look-and-feel.html' title='Skin Look And Feel'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_KYeHnrXYwPg/RdCf_GefWgI/AAAAAAAAAX0/6l_rctJgpzY/s72-c/ModelMat-Skin-Aqua.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-3772292547131805063</id><published>2007-02-13T06:12:00.000-02:00</published><updated>2007-03-24T20:58:40.306-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><title type='text'>SwingX - JXTaskPane</title><content type='html'>Use &lt;span style="font-weight: bold;"&gt;JXTaskPane&lt;/span&gt; para agrupar um conjunto de componentes visuais relacionados com uma mesma tarefa. JXTaskPane fornece controle para expandir e retrair o painel de conteúdo.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rc0HuWefWeI/AAAAAAAAAXU/07r9_E-mWs8/s1600-h/JXTaskPane-Principal.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rc0HuWefWeI/AAAAAAAAAXU/07r9_E-mWs8/s200/JXTaskPane-Principal.png" alt="" id="BLOGGER_PHOTO_ID_5029684851731552738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Geralmente são agrupados num JXTaskPaneContainer&lt;span class="fullpost"&gt;. Consulte &lt;a href="http://rfiume.blogspot.com/2007/02/swingx-jxtaskpanecontainer-container.html"&gt;SwingX - JXTaskPaneContainer (A Container for Task Panels)&lt;/a&gt; para entender quais os benefícios de agrupar JXTaskPane's num JXTaskPaneContainer.&lt;br /&gt;&lt;br /&gt;JXTaskPane criará automaticamente &lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxhyperlink.html"&gt;&lt;span style="font-style: italic;"&gt;hyperlinks&lt;/span&gt;&lt;/a&gt; através do método &lt;span style="font-style: italic;"&gt;add(javax.swing.Action action)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;JXTaskPane in Action&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rc0K1WefWfI/AAAAAAAAAXo/zT9CCA-MUpU/s1600-h/JXTaskPane.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_KYeHnrXYwPg/Rc0K1WefWfI/AAAAAAAAAXo/zT9CCA-MUpU/s320/JXTaskPane.png" alt="" id="BLOGGER_PHOTO_ID_5029688270525520370" border="0" /&gt;&lt;/a&gt;Segue a porção de código relevante para criar os três JTaskPane's agrupados num JXTaskPaneContainer, como na figura ao lado.&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXTaskPaneContainer taskPaneContainer = new JXTaskPaneContainer();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXTaskPane tpPrincipal = new JXTaskPane();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXTaskPane tpCalendario = new JXTaskPane();&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;JXMonthView monthView = new JXMonthView();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JXTaskPane tpSearchUrl = new JXTaskPane();&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JLabel labelURL = new JLabel();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JTextField tfURL = new JTextField();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;JButton bGo = new JButton();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// DropShadowBorder faz parte da biblioteca SwingX.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;taskPaneContainer.setBorder(new DropShadowBorder());&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Define o título.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpPrincipal.setTitle("Principal");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Define o ícone.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpPrincipal.setIcon(newImageIcon(&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;getClass().getResource("/folder_home.png")));&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Adiciona JXHyperlink's através de subclasses de javax.swing.Action.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpPrincipal.add(new IrParaHome());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpPrincipal.add(new IrParaCadastroPedido());&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpPrincipal.add(new IrParaCadastroCompra());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Coloca tpPrincipal em taskPaneContainer.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;taskPaneContainer.add(tpPrincipal);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpCalendario.setTitle("Calendário");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Faz com que o JXTaskPane esteja retraído.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpCalendario.setExpanded(false);&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Adiona JXMonthView, também parte do conjunto de componentes SwingX.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpCalendario.add(monthView);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;taskPaneContainer.add(tpCalendario);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Apenas um indicador para o UI plugável pintar diferente a área de título do JXTaskPane.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpSearchUrl.setTitle("Pesquisar na Web");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tpSearchUrl.setSpecial(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; * Componentes labelURL, tfURL e bGo adicionados através da Matisse do NetBeans.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; * Isso mostra que ainda é possível trabalhar bem com a Matisse&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; * mesmo com componentes de terceiros.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;taskPaneContainer.add(tpSearchUrl);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;Action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Action's&lt;/span&gt; são interessantes quando mais de um componentes gráfico executa a mesma função, como pode acontecer com um item de menu e um botão da barra de ferramentas.&lt;br /&gt;&lt;br /&gt;Encapsulam num mesmo lugar informações como o texto do menu, ícone pequeno para o menu, ícone grande para a barra de ferramenta, &lt;span style="font-style: italic;"&gt;tool tip text&lt;/span&gt; e o estado do componente (ativado/desativado).&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-style: italic;"&gt;IrParaHome&lt;/span&gt; extende &lt;span style="font-style: italic;"&gt;AbstracAction &lt;/span&gt;&lt;span&gt;- a implementação padrão da interface&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Action&lt;/span&gt;. Dessa forma, é preciso apenas definir o método &lt;span style="font-style: italic;"&gt;actionPerformed() &lt;/span&gt;&lt;span&gt;em &lt;span style="font-style: italic;"&gt;IrParaHome&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Segue a classe &lt;span style="font-style: italic;"&gt;IrParaHome&lt;/span&gt;, utilizada no código acima.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class IrParaHome extends AbstractAction {&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;Texto que aparece no menu e no hyperlink.&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final String NAME = "Home";&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final String ACTION = "go_home";&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;// Tool tip text.&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;private static final String SHORT_DESCRIPTION = "Mostra a tela principal";&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;span style="color: rgb(0, 0, 153);"&gt;private static final Icon SMALL_ICON;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;static {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;SMALL_ICON = new ImageIcon(IrParaCadastroPedido.class.getResource(&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;"/simpletest/taskpane/home.png"));&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;public IrParaHome() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;super();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;putValue(Action.NAME, NAME);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;putValue(Action.SHORT_DESCRIPTION, SHORT_DESCRIPTION);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;putValue(Action.ACTION_COMMAND_KEY, ACTION);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;putValue(Action.SMALL_ICON, SMALL_ICON);&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;public void actionPerformed(ActionEvent e) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;span style="color: rgb(102, 102, 102);"&gt;// Lógica de navegação aqui.&lt;/span&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;span style="color: rgb(0, 0, 153);"&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="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/02/swingx-jxtaskpanecontainer-container.html"&gt;SwingX - JXTaskPaneContainer&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxhyperlink.html"&gt;SwingX - JXHyperlink&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rfiume.blogspot.com/2007/01/swingx-jxmonthview.html"&gt;SwingX - JXMonthView&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html"&gt;The Java Tutorial - How to Use Actions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Veja outros componentes SwingX em:&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;br /&gt;&lt;/li&gt;&lt;/ul&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://download.java.net/javadesktop/swinglabs/releases/0.8/docs/api/org/jdesktop/swingx/JXTaskPane.html"&gt;org.jdesktop.swingx.JXTaskPane&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-3772292547131805063?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/3772292547131805063/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=3772292547131805063&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3772292547131805063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/3772292547131805063'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/swingx-jxtaskpane-um-painel-de-tarefas.html' title='SwingX - JXTaskPane'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KYeHnrXYwPg/Rc0HuWefWeI/AAAAAAAAAXU/07r9_E-mWs8/s72-c/JXTaskPane-Principal.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-5859344573458910902</id><published>2007-02-10T02:20:00.000-02:00</published><updated>2007-03-24T15:22:01.158-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wonderland e Ciência'/><title type='text'>Gastando Bem o Dinheiro</title><content type='html'>Não é fácil angariar verbas para pesquisas científicas mesmo em países ricos, como os Estados Unidos, países membros da União Européia e Japão. Pesquisadores travam verdadeiras batalhas para arrecadar recursos; lançam livros, participam de palestras, conferências, reuniões com políticos e empresários.&lt;br /&gt;&lt;br /&gt;Os principais motivos para tanta dificuldade são a imprevisiblidade dos resultados e a enorme soma de dinheiro necessária para pesquisas de ponta. Algumas pesquisas precisam de uma quantia que ultrapassa a casa dos milhões de dólares, chegando aos bilhões. Um exemplo é o &lt;a href="http://public.web.cern.ch/Public/Welcome.html"&gt;CERN&lt;/a&gt; - enorme acelerador de partículas situado num túnel de vinte e sete quilômetros em Genebra. Os Estados Unidos planejavam há algum tempo construir um acelerador de partículas com uma circunferência de oitenta e três quilômetros, com um orçamento de, no mínimo, 6 bilhões de dólares&lt;span class="fullpost"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;E isso é gastar bem?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se em algum ponto no passado algum país muito rico e poderoso resolvesse financiar a invenção de um aparelho que pudesse transmitir imagens e sons a longas distâncias e outro que captasse essas imagens e sons (televisão) para entreter e informar seus espectadores, é mais provável que não houvesse resultado algum.&lt;br /&gt;&lt;br /&gt;No fim do século XIX foram apresentadas &lt;a href="http://en.wikipedia.org/wiki/Maxwell%27s_equations"&gt;teorias eletromagnéticas&lt;/a&gt; - &lt;a href="http://en.wikipedia.org/wiki/James_Clerk_Maxwell"&gt;Maxwell&lt;/a&gt; foi o grande responsável - que pouco mais tarde foram comprovadas. As aplicações tecnológicas dessas descobertas foram imensas. Apenas citando alguns exemplos, rádio, televisão, telefonia celular, Internet.&lt;br /&gt;&lt;br /&gt;Ao pesquisar ondas eletromagnéticas, Maxwell não planejava assistir televisão. Ele desejava entender mais sobre a natureza, seus fenômenos e mistérios. Aparelhos de raio X, rádio transmissão, radares, motores elétricos, todos esses aparelhos e muitos outros apareceram repentinamente; só puderam ser imaginados e criados após a teoria eletromagnética.&lt;br /&gt;&lt;br /&gt;Fato semelhante aconteceu com o computador (com transístores ao invés de válvulas), satélites, cristal líquido, aparelhos que transformam luz solar em energia, e muitos outros. Essas invenções apareceram graças a um novo ramo da física chamado &lt;a href="http://pt.wikipedia.org/wiki/Mec%C3%A2nica_qu%C3%A2ntica"&gt;Mecânica Quântica&lt;/a&gt;, responsável pelo estudo dos átomos e outras  partículas muito estranhas e muitíssimo pequenas (algumas dessas partículas receberam mesmo o nome de &lt;a href="http://mesonpi.cat.cbpf.br/desafios/folder_sumario_descricao.php?id=30&amp;folder=3"&gt;partículas estranhas&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;E nós (brasileiros) com isso?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alguém pode argumentar que nós não temos ao menos educação fundamental adequada, não há segurança, falta infra-estrutura e contamos com (&lt;span style="font-style: italic;"&gt;coloque o seu problema "preferido" aqui&lt;/span&gt;). Por que o Brasil, com tantos problemas pedindo atenção, lutando por verbas, deveria investir em ciência básica?&lt;br /&gt;&lt;br /&gt;Ciência básica não é luxo. Tecnologia de ponta provém da aplicação de conhecimentos recém-descobertos e geram mais divisas. Então, a questão é:&lt;br /&gt;&lt;blockquote&gt;O Brasil vai continuar exportando basicamente soja, café e outras &lt;a href="http://pt.wikipedia.org/wiki/Commodity"&gt;commodities&lt;/a&gt;, ou irá comercializar também produtos que envolvam nanotecnologia, softwares e outros que precisem de alto nível de conhecimento?&lt;/blockquote&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br /&gt;O Brasil é capaz de investir em pesquisa fundamental e ganhar com isso?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www2.petrobras.com.br/portal/frame.asp?pagina=/tecnologia/port/centro_pesquisasdapetrobrasapresentacao.asp&amp;lang=pt&amp;amp;area=tecnologia"&gt;Petrobras&lt;/a&gt;, &lt;a href="http://www.embrapa.br/"&gt;Embrapa&lt;/a&gt;  e (&lt;span style="font-style: italic;"&gt;coloque seu exemplo preferido aqui&lt;/span&gt;) já provaram que sim faz algum tempo.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32745412-5859344573458910902?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/5859344573458910902/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=5859344573458910902&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/5859344573458910902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/5859344573458910902'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/gastando-bem-o-dinheiro.html' title='Gastando Bem o Dinheiro'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-1448981822954643357</id><published>2007-02-09T00:37:00.000-02:00</published><updated>2007-03-24T17:34:36.007-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Look and Feel'/><title type='text'>Drop-Shadow Menu - Incremente os Menus de Seu Aplicativo</title><content type='html'>Um recurso interessante do&lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel-jgoodies-looks.html"&gt; JGoodies Looks&lt;/a&gt; é o &lt;span style="font-style: italic;"&gt;Drop-Shadow Menu&lt;/span&gt;. As imagens abaixo são do artigo &lt;a href="http://www.javalobby.org/java/forums/t18117.html"&gt;Swing: Enabling Menu Drop-Shadows with JGoodies&lt;/a&gt;. A primeira mostra o item &lt;span style="font-style: italic;"&gt;Project&lt;/span&gt; da barra de menu com a &lt;span style="font-style: italic;"&gt;drop-shadow border&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.javalobby.org/images/postings/rj/jgoodies_drop/2.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px;" src="http://www.javalobby.org/images/postings/rj/jgoodies_drop/2.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A segunda imagem mostra outro item da barra de menu, sem a &lt;span style="font-style: italic;"&gt;drop-shadow border &lt;/span&gt;do JGoodies.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.javalobby.org/images/postings/rj/jgoodies_drop/1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px;" src="http://www.javalobby.org/images/postings/rj/jgoodies_drop/1.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para fazer uso do &lt;span style="font-style: italic;"&gt;Drop-Shadow Menu&lt;/span&gt; é preciso apenas utilizar um dos &lt;a href="http://rfiume.blogspot.com/2007/01/look-and-feel-jgoodies-looks.html"&gt;&lt;span style="font-style: italic;"&gt;look and feels&lt;/span&gt; do JGoodies&lt;/a&gt; e ativar esse recurso por meio do código:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;com.jgoodies.looks.Options.setPopupDropShadowEnabled(true);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Isso afetará tanto os itens na barra de menu, quanto os menus &lt;span style="font-style: italic;"&gt;pop-up&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Para ter esse recurso ativado ao utilizar o &lt;a href="http://rfiume.blogspot.com/2007/02/substance-look-and-feel.html"&gt;Substance Look and Feel&lt;/a&gt;, utilize o código:&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;contrib.com.jgoodies.looks.Options.setPopupDropShadowEnabled(true);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referência:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.javalobby.org/java/forums/t18117.html"&gt;Swing: Enabling Menu Drop-Shadows with JGoodies&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-1448981822954643357?l=rfiume.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rfiume.blogspot.com/feeds/1448981822954643357/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32745412&amp;postID=1448981822954643357&amp;isPopup=true' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/1448981822954643357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32745412/posts/default/1448981822954643357'/><link rel='alternate' type='text/html' href='http://rfiume.blogspot.com/2007/02/drop-shadow-menu-incremente-os-menus-de.html' title='Drop-Shadow Menu - Incremente os Menus de Seu Aplicativo'/><author><name>Rafael Fiume</name><uri>http://www.blogger.com/profile/04730288057837528937</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32745412.post-5305715738236096711</id><published>2007-02-07T04:29:00.000-02:00</published><updated>2007-03-24T20:09:20.727-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SwingX'/><title type='text'>SwingX - JXTipOfTheDay</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rb9b2SW681I/AAAAAAAAASM/EV5UNyxndWE/s1600-h/JXTipOfTheDay.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_KYeHnrXYwPg/Rb9b2SW681I/AAAAAAAAASM/EV5UNyxndWE/s320/JXTipOfTheDay.png" alt="" id="BLOGGER_PHOTO_ID_5025836697367802706" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;JXTipOfTheDay&lt;/span&gt; é a implementação de uma técnica bastante comum para ajudar novos usuários a conhecer um aplicativo. Consiste num painel ou caixa de diálogo com dicas (&lt;span style="font-style: italic;"&gt;tips&lt;/span&gt;) para ajudar os usuários a descobrir recursos interessantes, aumentar sua produtividade e tirar o melhor proveito desse aplicativo.&lt;br /&gt;&lt;br /&gt;Geralmente, conta com a opção de mostrar ou não a dica do dia - do inglês &lt;span style="font-style: italic;"&gt;tip of the day&lt;/span&gt; - a cada inicialização do software.&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Os &lt;span style="font-style: italic;"&gt;tips&lt;/span&gt; podem ser definidos direto no código-fonte do software (&lt;a href="http://en.wikipedia.org/wiki/Hard_coding"&gt;hard-code&lt;/a&gt;), ou através de um arquivo de propriedade.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;JXTipOfTheDay in Action (1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-style: italic;"&gt;JXTipOfTheDayTest&lt;/span&gt; mostra uma caixa de diálogo com as dicas definidas diretamente no código-fonte.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public class JXTipOfTheDayTest {&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;private static JXTipOfTheDay tipOfTheDay;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;private JXTipOfTheDayTest() {&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;super();&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;tipOfTheDay = new JXTipOfTheDay(loadModel());&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;private TipOfTheDayModel loadModel() {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;final List tips = Arrays.asList(&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;new DefaultTip("Tip1", "Alguma dica aqui!"),&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;new DefaultTip("Tip2", "Outra dica..."),&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;new DefaultTip("Tip3", "Última... acho que já é o suficiente."));&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;return new DefaultTipOfTheDayModel(tips);&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;public static void main(String args[]) {&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;new JXTipOfTheDayTest();&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&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;span style="color: rgb(0, 0, 153);"&gt;tipOfTheDay.showDialog(null);&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;.....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&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;JXTipOfTheDay in Action (2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A melhor opção pode ser definir &lt;span style="font-style: italic;"&gt;tips&lt;/span&gt; num arquivo de propriedade.&lt;br /&gt;&lt;br /&gt;A classe &lt;span style="font-style: italic;"&gt;TipOfTheDay&lt;/span&gt; abaixo procura pelas dicas no arquivo &lt;span style="font-style: italic;"&gt;tip.properties&lt;/span&gt;, armazena a escolha do usuário para mostrar ou não o diálogo na próxima inicialização do aplicativo em &lt;span style="font-style: italic;"&gt;Preferences&lt;/span&gt; e mostra o diálogo &lt;span style="font-style: italic;"&gt;Tip of the Day&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;* Creates the Tip of the Day dialog.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;* @author Rafael Fiume&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;public final class TipOfTheDay {&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;private static JXTipOfTheDay tipOfTheDay;&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;private TipOfTheDay() {&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;super();&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;public static void show(final Component parentComponent) {&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;final Preferences userPreferences = Preferences.userRoot().node("ModelMat");&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;create().showDialog(parentComponent, userPreferences);&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;span style="color: rgb(0, 0, 153);"&gt;}&lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;public static void show(final Component parentComponent, final boolean force) {&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;final JXTipOfTheDay tip = create();&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;final Preferences userPreferences = Preferences.userRoot().node("ModelMat"); &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;if (force) {&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;span style="color: rgb(0, 0, 153);"&gt;tip.forceShowOnStartup(userPreferences);&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;span style="color: rgb(255, 255, 255);"&gt;..........&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;tip.showDialog(parentComponent, userPreferences, force);&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;span style="color: rgb(0, 0, 153);"&gt;} &lt;/span&gt;&lt;br /&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;span style="color: rgb(0, 0, 153);"&gt;private static JXTipOfTheDay create() {&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;if (tipOfTheDay == null) { &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;span style="color: rgb(0, 0, 153);"&gt;final Properties prop = new Properties();&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;span style="color: rgb(0, 0, 153);"&gt;final InputStream input = TipOfTheDay.class.&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;getResourceAsStream("/org/modelmat/gui/helper/tip.properties");&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;span style="color: rgb(0, 0, 153);"&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;prop.load(input); &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;span style="color: rgb(0, 0, 153);"&gt;} catch (IOException 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;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;return null;&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;span style="color: rgb(0, 0, 153);"&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;span style="color: rgb(0, 0, 153);"&gt;final TipOfTheDayModel model = TipLoader.load(prop);&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;span style="color: rgb(0, 0, 153);"&gt;tipOfTheDay = new JXTipOfTheDay(model); &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;span style="color: rgb(0, 0, 153);"&gt;return tipOfTheDay;&lt;/span&gt;
