<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8555172601608452792</atom:id><lastBuildDate>Fri, 28 Mar 2025 06:28:28 +0000</lastBuildDate><category>Java</category><category>Impressionante</category><category>SWT</category><category>javax.swing</category><category>Conversa pra boi dormir</category><category>ubuntu</category><category>Algoritmos</category><category>Eclipse</category><category>Firebird</category><category>Notícias</category><category>google</category><category>javascript</category><category>Cheat Sheets</category><category>Gadgets</category><category>Gnome</category><category>Linux</category><category>Quick Reference Guides</category><category>Runtime</category><category>SEO</category><category>SVN</category><category>Subversion</category><category>Swing</category><category>TV</category><category>Thread</category><category>UIManager</category><category>Web</category><category>containerlistener</category><category>emoticons para blogger</category><category>gtalk</category><category>internet</category><category>jar</category><category>java.lang</category><category>java.text</category><category>java.util</category><category>jsp</category><category>keyEvent</category><category>keyeventlistener</category><category>netbeans</category><category>pgadmin</category><category>shutdown</category><category>talk</category><category>windows</category><title>Preclog</title><description>Isso não é um blog, mas poderia ser. &#xa;Meh...</description><link>http://preclog.blogspot.com/</link><managingEditor>noreply@blogger.com (Preco)</managingEditor><generator>Blogger</generator><openSearch:totalResults>67</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-4987034712269916255</guid><pubDate>Thu, 12 Aug 2010 13:43:00 +0000</pubDate><atom:updated>2010-08-12T10:50:46.970-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">pgadmin</category><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>PgAdmin relocation error no Ubuntu</title><description>Hoje, ao tentar abrir o PgAdmin, percebi que a tela de boas vindas aparecia e sumia rapidamente. Ao executar &lt;span style=&quot;font-weight: bold;&quot;&gt;pgadmin3&lt;/span&gt; no terminal, veio a seguinte mensagem de erro:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;pgadmin3: relocation error: pgadmin3: symbol _ZN21wxMemoryFSHandlerBase19AddFileWithMimeTypeERK8wxStringPKvjS2_, version WXU_2.8 not defined in file libwx_baseu-2.8.so.0 with link time reference&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pesquisando por aí (ou melhor, &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/pgadmin3/+bug/610975/comments/9&quot;&gt;neste fórum&lt;/a&gt;), achei a seguinte solução:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Abra o terminal e digite:&lt;/li&gt;&lt;li style=&quot;font-weight: bold;&quot;&gt;apt-get source pgadmin3&lt;/li&gt;&lt;li style=&quot;font-weight: bold;&quot;&gt;sudo apt-get install debhelper libpq-dev libwxgtk2.8-dev libxml2-dev libxslt1-dev autotools-dev&lt;/li&gt;&lt;li style=&quot;font-weight: bold;&quot;&gt;cd pgadmin3-1.10.2&lt;/li&gt;&lt;li style=&quot;font-weight: bold;&quot;&gt;dpkg-buildpackage&lt;/li&gt;&lt;li&gt;Vá tomar um café, isso demora.&lt;/li&gt;&lt;li style=&quot;font-weight: bold;&quot;&gt;sudo dpkg -i ../pgadmin3_1.10.2-1_i386.deb&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;E pronto, agora o seu PgAdmin agora estará funcionando novamente \o/ (bem, pelo menos o meu está ;) )</description><link>http://preclog.blogspot.com/2010/08/pgadmin-relocation-error-no-ubuntu.html</link><author>noreply@blogger.com (Preco)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-3565915585000487794</guid><pubDate>Fri, 05 Mar 2010 16:51:00 +0000</pubDate><atom:updated>2010-03-05T14:15:27.800-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">jar</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">netbeans</category><title>Criando Jar no Netbeans sem a pasta lib</title><description>Olá, povo&lt;br /&gt;&lt;br /&gt;Às vezes é ruim utilizar o build do NetBeans para gerar arquivos Jar, uma vez que ele não cria apenas um arquivo, e sim o jar da sua aplicação e uma pasta chamada &quot;lib&quot;, contendo os outros .jar que sua aplicação necessita pra rodar. Em alguns casos, principalmente na hora de colocar o sistema em produção, é desejável que o jar gerado contenha em si tudo o que precisa pra funcionar, sem depender de arquivos externos.&lt;br /&gt;&lt;br /&gt;Para criar um arquivo Jar único, basta seguir estes passos:&lt;br /&gt;&lt;br /&gt;1) Mude para a visão de visualização de arquivos;&lt;br /&gt;2) Localize (e abra ;) o arquivo &lt;span style=&quot;font-style:italic;&quot;&gt;build.xml&lt;/span&gt;;&lt;br /&gt;3) Insira o seguinte trecho de código no final do arquivo, &lt;span style=&quot;font-weight:bold;&quot;&gt;antes&lt;/span&gt; da tag &amp;lt;/project&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;br /&gt;&amp;lt;target name=&quot;package-for-store&quot; depends=&quot;jar&quot;&amp;gt;&lt;br /&gt;        &amp;lt;property name=&quot;store.jar.name&quot; value=&quot;NOME_DO_SEU_PROJETO&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;!-- don&#39;t edit below this line --&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;property name=&quot;store.dir&quot; value=&quot;store&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;property name=&quot;store.jar&quot; value=&quot;${store.dir}/${store.jar.name}.jar&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;echo message=&quot;Packaging ${application.title} into a single JAR at ${store.jar}&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;delete dir=&quot;${store.dir}&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;mkdir dir=&quot;${store.dir}&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;jar destfile=&quot;${store.dir}/temp_final.jar&quot; filesetmanifest=&quot;skip&quot;&amp;gt;&lt;br /&gt;            &amp;lt;zipgroupfileset dir=&quot;dist&quot; includes=&quot;*.jar&quot;/&amp;gt;&lt;br /&gt;            &amp;lt;zipgroupfileset dir=&quot;dist/lib&quot; includes=&quot;*.jar&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;            &amp;lt;manifest&amp;gt;&lt;br /&gt;                &amp;lt;attribute name=&quot;Main-Class&quot; value=&quot;${main.class}&quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/manifest&amp;gt;&lt;br /&gt;        &amp;lt;/jar&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;zip destfile=&quot;${store.jar}&quot;&amp;gt;&lt;br /&gt;            &amp;lt;zipfileset src=&quot;${store.dir}/temp_final.jar&quot;&lt;br /&gt;            excludes=&quot;META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/zip&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;delete file=&quot;${store.dir}/temp_final.jar&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4) Troque, na segunda linha, a string &quot;NOME_DO_SEU_PROJETO&quot; para o nome do seu projeto (que está na segunda linha do &quot;build.xml&quot;; Salve o arquivo;&lt;br /&gt;5) Selecione a opção &quot;Clean and rebuild&quot; (Limpar e construir). Certifique-se que o Netbeans criou a pasta &quot;dist&quot;, contendo o jar da sua aplicação e a pasta &quot;lib&quot;;&lt;br /&gt;6) Clique com o botão direito sobre o arquivo &quot;build.xml&quot;, selecione a opção &quot;Run target&quot; (executar destino), &quot;Other targets&quot; (Outros destinos) e a seguir &quot;package-for-store&quot;.&lt;br /&gt;&lt;br /&gt;Se tudo der certo (rezar é bom nessas horas), o NetBeans irá gerar uma pasta chamada &quot;store&quot;, contendo um único arquivo Jar bonitinho, fofo, meigo e pronto pra ser distribuído por aí :D&lt;br /&gt;&lt;br /&gt;É isso, té o/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://java.sun.com/developer/technicalArticles/java_warehouse/single_jar/&quot;&gt;Fonte&lt;/a&gt;</description><link>http://preclog.blogspot.com/2010/03/criando-jar-no-netbeans-sem-pasta-lib.html</link><author>noreply@blogger.com (Preco)</author><thr:total>16</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-7071256015393333033</guid><pubDate>Fri, 12 Feb 2010 18:52:00 +0000</pubDate><atom:updated>2010-03-02T13:36:20.276-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">containerlistener</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">javax.swing</category><category domain="http://www.blogger.com/atom/ns#">keyEvent</category><category domain="http://www.blogger.com/atom/ns#">keyeventlistener</category><title>KeyListener global no Java</title><description>Quem já fez controle de aplicações via teclado em Java/Swing sabe o quanto é chato tratar eventos de teclado: Tem que adicionar KeyListener em TODOS os componentes, porque se o componente que tiver o foco não tiver o listener, nada acontece.&lt;br /&gt;&lt;br /&gt;A solução pra isso? Adicionar KeyListeners nos componentes e em seus filhos, recursivamente! Eis como:&lt;br /&gt;&lt;br /&gt;1) Criamos a seguinte função no nosso JFrame (Como ele se baseia em Component, essa dica funciona com todas as classes que herdam dela, como JDialog, JPanel, etc):&lt;br /&gt;&lt;br /&gt;&lt;pre name=&#39;code&#39; class=&#39;Java&#39;&gt;&lt;br /&gt;private void addKeyAndContainerListenerRecursively(Component c) {&lt;br /&gt;    try {&lt;br /&gt;        c.addKeyListener(this);&lt;br /&gt;        if (c instanceof Container) {&lt;br /&gt;            Container cont = (Container) c;&lt;br /&gt;            cont.addContainerListener(this);&lt;br /&gt;            Component[] children = cont.getComponents();&lt;br /&gt;            for (int i = 0; i &lt; children.length; i++) {&lt;br /&gt;                addKeyAndContainerListenerRecursively(children[i]);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;        //Anuncie Aqui&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) Fazemos o JFrame implementar dois Listeners, o KeyListener e o ContainerListener:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&#39;code&#39; class=&#39;Java&#39;&gt;&lt;br /&gt;public class MeuJFrameLegal extends JFrame implements KeyListener, ContainerListener {&lt;br /&gt;//...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3) Temos que implementar as seguintes funções: &lt;br /&gt;&lt;br /&gt;&lt;pre name=&#39;code&#39; class=&#39;Java&#39;&gt;&lt;br /&gt;public void keyTyped(KeyEvent e) {}&lt;br /&gt;public void keyPressed(KeyEvent e) {}&lt;br /&gt;public void keyReleased(KeyEvent e) {}&lt;br /&gt;public void componentAdded(ContainerEvent e) {}&lt;br /&gt;public void componentRemoved(ContainerEvent e) {}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4) Na função keyPressed, colocamos nosso código legal e mágico:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&#39;code&#39; class=&#39;Java&#39;&gt;&lt;br /&gt;public void keyPressed(KeyEvent e) {&lt;br /&gt;    switch (e.getKeyCode()) {&lt;br /&gt;        case KeyEvent.VK_F1:&lt;br /&gt;            System.out.println(&quot;Parabéns, você pressionou F1&quot;);&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5) E pronto! Agora basta chamar a função &lt;strong&gt;addKeyAndContainerListenerRecursively&lt;/strong&gt; no final do seu método de inicialização da parte gráfica (aquele que a gente adiciona os componentes ao Componente).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;&quot;Mas tio Preco, pra que serve o ContainerListener???&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O ContainerListener serve pro seguinte: Digamos que sua janela chame outra janela, e você quer que as funções que você atribuiu às teclas na janela pai também estejam disponíveis na janela filha. Então você faz o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&#39;code&#39; class=&#39;Java&#39;&gt;&lt;br /&gt;public void componentAdded(ContainerEvent e) {&lt;br /&gt;    addKeyAndContainerListenerRecursively(e.getContainer());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E pronto (de novo)! Agora todas as janelas que a janela pai chamar &quot;herdarão&quot; o Listener \o/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;É isso, té o/&lt;br /&gt;&lt;br /&gt;(Fonte: &lt;a href=&quot;http://www.javaworld.com/javaworld/javatips/jw-javatip69.html?page=2&quot;&gt;Java World&lt;/a&gt;)</description><link>http://preclog.blogspot.com/2010/02/keyeventlistener-global-no-java.html</link><author>noreply@blogger.com (Preco)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-1009119084400105649</guid><pubDate>Tue, 02 Feb 2010 13:51:00 +0000</pubDate><atom:updated>2010-02-02T11:54:57.498-02:00</atom:updated><title>Alterando senha do firebird windows vista e windows 7</title><description>Estava com problema para alterar a senha do SYSDBA no firebird no windows 7.&lt;br /&gt;&lt;br /&gt;Dava o seguinte erro ao executar o gsec como explicado nesse artigo do perereco: http://preclog.blogspot.com/2008/03/trocar-senha-do-sysdba-no-firebird.html&lt;br /&gt;&lt;br /&gt;O erro:&lt;br /&gt;&lt;br /&gt;Cannot attach to services manager&lt;br /&gt;user name and password are required while attaching to the services manager&lt;br /&gt;unable to open database&lt;br /&gt;&lt;br /&gt;A solução:&lt;br /&gt;&lt;br /&gt;colocar o parametro &lt;span&gt;&lt;strong class=&quot;command&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;-database &quot;localhost:C:\Program                                                                Files\Firebird\Firebird_2_0\security2.fdb&quot; no comando e voila&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;</description><link>http://preclog.blogspot.com/2010/02/alterando-senha-do-firebird-windows.html</link><author>noreply@blogger.com (Guilherme)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-8790606187412484506</guid><pubDate>Tue, 24 Nov 2009 11:23:00 +0000</pubDate><atom:updated>2009-12-16T10:39:09.899-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Gnome</category><category domain="http://www.blogger.com/atom/ns#">Subversion</category><category domain="http://www.blogger.com/atom/ns#">SVN</category><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>Problemas com o Subversion no Netbeans dentro do Ubuntu</title><description>Às vezes, quando se está usando a ferramenta do &lt;strong&gt;Subversion (SVN)&lt;/strong&gt; embutida no Netbeans, aparece a seguinte mensagem:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&quot;GNOME Keyring is locked and we are non-interactive&quot;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;E isso quer dizer o quê? Quer dizer que o &lt;strong&gt;Gnome&lt;/strong&gt; do &lt;strong&gt;Ubuntu&lt;/strong&gt; utilizou a ferramenta de chaveiros dele para armazenar a senha do SVN. E o SVN acha o chaveiro do Gnome feio, chato e bobo, e por isso os dois não se conversam :(&lt;br /&gt;&lt;br /&gt;Pra resolver isso, edite o arquivo &lt;strong&gt;&quot;~/.subversion/config&quot;&lt;/strong&gt; (abra o terminal e digite &quot;nano ~/.subversion/config&quot;), adicionando logo abaixo do marcador &lt;strong&gt;&quot;[auth]&quot;&lt;/strong&gt; a seguinte linha:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;password-stores =&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;... E pronto! Agora é só reiniciar a bagaça e sair pro abraço \o/&lt;br /&gt;&lt;br /&gt;(reiniciar a bagaça = reiniciar a sessão ¬¬)&lt;br /&gt;&lt;br /&gt;Té o/</description><link>http://preclog.blogspot.com/2009/11/problemas-com-o-subversion-no-netbeans.html</link><author>noreply@blogger.com (Preco)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-4468864435379545550</guid><pubDate>Wed, 09 Sep 2009 19:48:00 +0000</pubDate><atom:updated>2009-09-09T16:57:17.409-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>Remover beep chato no Ubuntu</title><description>É meio chato ficar escutando um &lt;span style=&quot;font-style: italic;&quot;&gt;beep&lt;/span&gt; no buzzer, cada vez que você aperta uma tecla &quot;backspace&quot; a mais, ou tenta salvar algo que já está salvo. Para desabilitar o buzzer no Ubuntu, basta colocar o speaker do pc na lista negra do &lt;span style=&quot;font-style: italic;&quot;&gt;modprobe&lt;/span&gt;, assim:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;eu@eu:~$ &lt;span style=&quot;font-weight: bold;&quot;&gt;echo &quot;blacklist pcspkr&quot; | sudo tee -a /etc/modprobe.d/blacklist&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;...e pronto. Fim do barulho chato.&lt;br /&gt;&lt;br /&gt;É necessário reiniciar o Ubuntu, ou recarregar o &lt;span style=&quot;font-style: italic;&quot;&gt;modprobe&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;eu@eu:~$ &lt;/code&gt;&lt;code style=&quot;font-weight: bold;&quot;&gt;sudo modprobe -r pcspkr&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Abraços \o/&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;(Fonte: &lt;a href=&quot;http://strabes.wordpress.com&quot;&gt;Alex S.&lt;/a&gt;)&lt;/span&gt;</description><link>http://preclog.blogspot.com/2009/09/remover-beep-chato-no-ubuntu.html</link><author>noreply@blogger.com (Preco)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-5667024807400837688</guid><pubDate>Wed, 01 Jul 2009 14:25:00 +0000</pubDate><atom:updated>2009-07-01T11:51:59.887-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Runtime</category><category domain="http://www.blogger.com/atom/ns#">shutdown</category><category domain="http://www.blogger.com/atom/ns#">Thread</category><title>Como encerrar sua aplicação Java</title><description>Existem diversas formar de encerrar sua aplicação. E às vezes é preciso que algo seja feito &lt;span style=&quot;font-weight: bold;&quot;&gt;antes&lt;/span&gt; que isso aconteça, seja pra consistir dados, seja pra mostrar uma mensagenzinha de tchau pro usuário (Sim, isso é tosco. Não façam isso.). Muita gente usa o evento &lt;span style=&quot;font-weight: bold;&quot;&gt;windowClosing&lt;/span&gt; do AWT na janela principal do programa. No entanto, existe um método mais eficiente (e garantido) de fazer isso.&lt;br /&gt;&lt;br /&gt;A Máquina Virtual do Java (JVM) se desliga de dois jeitos diferentes: Do jeito normal e bonitinho &lt;span style=&quot;font-weight: bold;&quot;&gt;System.exit();&lt;/span&gt; (ou quando a última Thread ativa do programa termina sua execução) OU do modo &lt;span style=&quot;font-weight: bold;&quot;&gt;abrupto&lt;/span&gt; (abrupto é uma palavra que dá medo), quando o usuário pressiona Ctrl+C no console (ou prompt), ou quando o usuário taca o dedo no botão Power, desligando o Sistema Operacional.&lt;br /&gt;&lt;br /&gt;O &lt;span style=&quot;font-weight: bold;&quot;&gt;Runtime&lt;/span&gt; da JVM possui um método chamado &lt;span style=&quot;font-weight: bold;&quot;&gt;addShutdownHook(Thread t)&lt;/span&gt;, que, resumindo, vai fazer o seguinte: A Thread &lt;span style=&quot;font-weight: bold;&quot;&gt;t&lt;/span&gt; vai ser registrada no Runtime, mas não vai ser executada. Vai ficar lá, paradinha. Daí, antes de a JVM ser encerrada, ela acorda a Thread t, e a Thread t executa seu método &lt;span style=&quot;font-weight: bold;&quot;&gt;run()&lt;/span&gt;, antes do juízo final :)&lt;br /&gt;&lt;br /&gt;Para evitar que sua aplicação termine sem que determinado processamento necessário seja feito, basta fazer o seguinte:&lt;br /&gt;&lt;br /&gt;1) Criar uma classe, herdando de Thread. Dentro dessa classe, no método &lt;span style=&quot;font-weight: bold;&quot;&gt;run()&lt;/span&gt;, deverá haver o código que você quer processar anter da finalização.&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;private class ShutdownInterceptor extends Thread {&lt;br /&gt;   public void run() {&lt;br /&gt;       //Aqui você diz adeus.&lt;br /&gt;       System.out.println(&quot;Por que você me abandona? Sentirei saudades.&quot;);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2) Dentro de sua aplicação, insira o seguinte código, indicando à JVM que você quer colocar sua classe bonitinha no shutdownHook:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;ShutdownInterceptor shutdownInterceptor = new ShutdownInterceptor();&lt;br /&gt;Runtime.getRuntime().addShutdownHook(shutdownInterceptor); // &lt;- Mágica &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E pronto! Agora, quando seu sistema for finalizado, o sistema fará uma chantagem emocional com o usuário, obrigando-o moralmente a reiniciar sua aplicação e viver com ela pra sempre.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[]&#39;s&lt;br /&gt;&lt;br /&gt;Fontes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://twit88.com/blog/2007/09/27/do-a-graceful-shutdown-of-your-java-application-when-ctr-c-kill/&quot;&gt;Twit88&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29&quot;&gt;API&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.onjava.com/pub/a/onjava/2003/03/26/shutdownhook.html&quot;&gt;O&#39;Reilly&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>http://preclog.blogspot.com/2009/07/como-encerrar-sua-aplicacao-java.html</link><author>noreply@blogger.com (Preco)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-6150911052740613959</guid><pubDate>Wed, 10 Sep 2008 20:51:00 +0000</pubDate><atom:updated>2008-09-10T17:58:28.558-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">java.text</category><title>Trocando caracteres especiais no Java</title><description>Oi povo.&lt;br /&gt;&lt;br /&gt;Já vi muita gambiarra envolvendo replace e tals, pra trocar caracteres especiais no Java (fazer isso &quot;Tralalá&quot; virar isso &quot;Tralala&quot;). Daí vi esse código e achei mais bonitinho.. pelo menos não envolve 3 arrays, um vetor e um comentário do tipo /* Revisar depois */&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;public static String formatString(String s) {&lt;br /&gt;    String temp = Normalizer.normalize(s, java.text.Normalizer.Form.NFD);&lt;br /&gt;    return temp.replaceAll(&quot;[^\\p{ASCII}]&quot;,&quot;&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Abraço, povo o/</description><link>http://preclog.blogspot.com/2008/09/trocando-caracteres-especiais-no-java.html</link><author>noreply@blogger.com (Preco)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-982177773023197198</guid><pubDate>Wed, 03 Sep 2008 14:22:00 +0000</pubDate><atom:updated>2008-09-03T11:54:04.608-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">javax.swing</category><title>Disparando eventos no JTextField</title><description>Oi povo,&lt;br /&gt;&lt;br /&gt;Muitas vezes, você precisa validar algum campo, que depende do conteúdo digitado em um JTextField (ou qualquer componente que use Document). Por exemplo: Quando você solicita ao usuário a digitação de um código para que apareça a descrição de um produto na tela.&lt;br /&gt;Muita gente usa o KeyListener pra isso, mas ele é disparado antes do caracter ser colocado no JTextField, daí ele não pega o texto digitado por inteiro.&lt;br /&gt;&lt;br /&gt;A solução pra isso é usar o bom e velho DocumentListener! \o/&lt;br /&gt;&lt;br /&gt;Exemplo: busca produto pelo código digitado&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;JTextField textField = new JTextField();&lt;br /&gt;textField.getDocument().addDocumentListener(new DocumentListener(){&lt;br /&gt;    public void changedUpdate(javax.swing.event.DocumentEvent e) {&lt;br /&gt;        // Anuncie aqui! Viu como funciona?&lt;br /&gt;    }&lt;br /&gt;    public void insertUpdate(DocumentEvent e) {&lt;br /&gt;        buscaProdutoPorCodigo(textField.getText());&lt;br /&gt;    }&lt;br /&gt;    public void removeUpdate(DocumentEvent e) {&lt;br /&gt;        buscaProdutoPorCodigo(textField.getText());&lt;br /&gt;    }&lt;br /&gt;    public void buscaProdutoPorCodigo(String codigoStr){&lt;br /&gt;        try{&lt;br /&gt;            int codigo = Integer.parseInt(codigoStr);&lt;br /&gt;            // busca o produto no banco;&lt;br /&gt;            // pega o produto e exibe no lugar certo;&lt;br /&gt;        } catch (NumberFormatException nfex) {&lt;br /&gt;            // exibe mensagem dizendo que o código é inválido.&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Explicando: &lt;br /&gt;O DocumentListener é um listener disparado toda vez que o texto do componente é alterado. Daí tem 3 métodos que tem q ser implementados: O insert, o changed e o remove. &lt;br /&gt;O insert é disparado quando algum texto é inserido no componente. &lt;br /&gt;O remove é disparado quando algum texto é removido do componente. &lt;br /&gt;E o changed só é disparado quando o estilo do texto muda (isso só é aplicável com componentes que implementam StyledDocument, como o JTextPane. Não é aplicável ao JTextField, portanto ali no código ele tá só fazendo figuração =D ).&lt;br /&gt;&lt;br /&gt;Té mais, povo o/</description><link>http://preclog.blogspot.com/2008/09/disparando-eventos-no-jtextfield.html</link><author>noreply@blogger.com (Preco)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-5281066830799645795</guid><pubDate>Tue, 24 Jun 2008 13:36:00 +0000</pubDate><atom:updated>2008-06-24T10:58:16.960-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">UIManager</category><title>Como alterar a fonte padrão do Java</title><description>Por padrão, a fonte padrão dos componentes do Java é a fonte padrão do Look and Feel que está sendo utilizado. Mas dá pra mudar isso \o/&lt;br /&gt;Eis como:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&#39;code&#39; class=&#39;java&#39;&gt;&lt;br /&gt;public static void setUIFont (Font f){&lt;br /&gt;Enumeration&amp;lt;Object&amp;gt; keys = UIManager.getDefaults().keys();&lt;br /&gt;while (keys.hasMoreElements()) {&lt;br /&gt;    Object key = keys.nextElement();&lt;br /&gt;    Object value = UIManager.get (key);&lt;br /&gt;    if (value instanceof Font)&lt;br /&gt;        UIManager.put (key, f);&lt;br /&gt;    }&lt;br /&gt;} &lt;br /&gt;...&lt;br /&gt;//Dentro do main...&lt;br /&gt;setUIFont(new Font(&quot;Dialog&quot;, Font.BOLD, 14));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Em suma, ele vai percorrer todos os elementos do UIManager, e alterar a fonte de um por um...&lt;br /&gt;&lt;br /&gt;Dá pra alterar a fonte de um componente em particular:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&#39;code&#39; class=&#39;java:nocontrols&#39;&gt;&lt;br /&gt;UIManager.put(&quot;Label.font&quot;, new Font(&quot;Serif&quot;,Font.ITALIC,12));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Peguei daqui &lt;a href=&quot;http://www.rgagnon.com/javadetails/java-0335.html&quot;&gt;Real How To&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;o/ Té mais!</description><link>http://preclog.blogspot.com/2008/06/como-alterar-fonte-padro-do-java.html</link><author>noreply@blogger.com (Preco)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-5688075388299802472</guid><pubDate>Fri, 06 Jun 2008 16:24:00 +0000</pubDate><atom:updated>2009-01-29T15:09:32.337-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Cheat Sheets</category><category domain="http://www.blogger.com/atom/ns#">Quick Reference Guides</category><title>Cheat Sheets</title><description>Pra quem não conhece, C. S. são guias de referência, geralmente em uma única página, que servem para o profissional ter acesso ao conteúdo de um determinado assunto sem ter que ficar fuçando manuais e internet pra ver como ele é escrito. Servem principalmente para lembrar a sintaxe de algum comando.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Um dos melhores sites para C. S. e Quick reference guides é o &lt;a href=&quot;http://www.ilovejackdaniels.com/&quot;&gt;I Love Jack Daniels&lt;/a&gt;, do Dave Child. Ele tem C. S. pra diversas linguagens de programação, recomendadíssimo \o/&lt;br /&gt;&lt;br /&gt;Aqui vai uma lista com vários Cheat Sheets para download, em formato PDF:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Algebra.pdf&quot;&gt;Algebra - Paul Dawkins&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Apache.pdf&quot;&gt;Apache Quick Reference Card - Andrew Ford&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-ASPeVBScript.pdf&quot;&gt;ASP e VBScript - Dave Child&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-AssemblyWin32.pdf&quot;&gt;Assembly (Win32) - Peter Kankowski&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-CANSI.pdf&quot;&gt;C - Joseph H. Silverman&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Ce.NET.pdf&quot;&gt;C# e .NET - ?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-C.pdf&quot;&gt;C++ - Dream in Code&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-CaracteresHTML.pdf&quot;&gt;Caracteres HTML - Dave Child&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-ColdFusion.pdf&quot;&gt;ColdFusion - Peter Freitag&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-ComandosUnix.pdf&quot;&gt;Comandos UNIX - FOSSwire&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-CVS.pdf&quot;&gt;CVS (Controle de versão) -  Laurent Grégoire&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Debian.pdf&quot;&gt;Debian - W.  Borgert&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Delphi.pdf&quot;&gt;Delphi - Explain That!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Django.pdf&quot;&gt;Django - Mercury Tide&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Eclipse.pdf&quot;&gt;Eclipse (IDE) - Carsten Ullrich&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-ExpressesRegulares.pdf&quot;&gt;Expressões regulares - Dave Child&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-HTML.pdf&quot;&gt;HTML - Dave Child&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Java.pdf&quot;&gt;Java - Janeg.ca&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Java2.pdf&quot;&gt;Java 2 - Pinnacle Software Solutions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Java3.pdf&quot;&gt;Java 3 -  Jialong He&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Javascript.pdf&quot;&gt;JavaScript - Dave Child&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-JSP.pdf&quot;&gt;JSP - Sun&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-JSTL.pdf&quot;&gt;JSTL - Bill Siggelkow&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-LUA.pdf&quot;&gt;LUA - SoulKiller&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Microformats.pdf&quot;&gt;Microformats - Dave Child&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-MySQL.pdf&quot;&gt;MySQL - Dave Child&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Oracle.pdf&quot;&gt;Oracle - Michael Eliasz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Perl.pdf&quot;&gt;Perl - John Bokma&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-VariveispredefinidasPerl.pdf&quot;&gt;Perl (variáveis predefinidas) - Peteris Krumins&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-PHP.pdf&quot;&gt;PHP - Dave Child&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-PEARMDB2.pdf&quot;&gt;PHP PEAR MDB2 - &lt;span class=&quot;a&quot;&gt;codeschmie.de&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-PostgreSQL.pdf&quot;&gt;PostgreSQL - Alberton.info&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Python.pdf&quot;&gt;Python - Laurent Pointal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Ruby.pdf&quot;&gt;Ruby - Cenophobie&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-SEO.pdf&quot;&gt;SEO (Search Engine Optimization) - SeoMoz&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-ServiosGoogle.pdf&quot;&gt;Serviços Google - Adelaider&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Shellscript.pdf&quot;&gt;Shell script - Michael Oliveri&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Smalltalk.pdf&quot;&gt;Smalltalk - Bern University&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Solaris.pdf&quot;&gt;Solaris - Jialong He&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-STL.pdf&quot;&gt;STL - Yotam Medini&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-Subversion.pdf&quot;&gt;SVN (controle de versão) - Lucas Baltes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-UML.pdf&quot;&gt;UML (Linguagem de modelagem) -  Laurent Grégoire&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-VI.pdf&quot;&gt;VI (editor de texto) - HP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://perereco.googlepages.com/CheatSheet-XML.pdf&quot;&gt;XML - Mulberry Technologies&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Se alguém quiser mais algum Cheat Sheet, ou não entender alguma coisa, só entrar em contato, que tamos aê o/&lt;br /&gt;&lt;br /&gt;Todos os Cheat Sheets daqui são gratuitos e estão hospedados no mesmo lugar, pra não depender de servidores alheios para disponibilidade... Se você gostou e quer hospedar no seu blog/site, link-me, por favor ;)&lt;br /&gt;&lt;br /&gt;Té mais o/</description><link>http://preclog.blogspot.com/2008/06/cheat-sheets.html</link><author>noreply@blogger.com (Preco)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-2953596729042386700</guid><pubDate>Wed, 02 Apr 2008 18:50:00 +0000</pubDate><atom:updated>2010-05-17T22:21:49.874-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">emoticons para blogger</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><title>Emoticons para Blogger e Blogspot</title><description>Tá, passei um trabalhinho pra fazer isso, mas desenvolvi um JavaScript pra colocar emoticons em blogs do Blogger/Blogspot \o/&lt;br /&gt;&lt;br /&gt;&lt;s&gt;&lt;/s&gt;&lt;span style=&quot;color: rgb(102, 0, 0);&quot;&gt;***&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Edit: Pra quem quiser usar o emoticon no próprio blog, tem que fazer assim:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Vá em Layout/Editar HTML, e cole o seguinte trecho de código &lt;span style=&quot;font-weight: bold;&quot;&gt;antes&lt;/span&gt; de &lt;span style=&quot;font-weight: bold; color: rgb(102, 0, 0);&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;:&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;script language=&#39;javascript&#39; src=&#39;http://sites.google.com/site/perereco/emoticons.js&#39; type=&#39;text/javascript&#39;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Daí, ali no &amp;lt;body&amp;gt;, troque por:&lt;br /&gt;&amp;lt;body onload=&#39;emoticon()&#39;&amp;gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Pra usar um emoticon, basta colocar o sinal desejado entre colchetes duplos:&lt;br /&gt;&lt;blockquote&gt;[[sinal]]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Vamos à lista:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;relogio : [[relogio]]&lt;/li&gt;&lt;li&gt;paleta : [[paleta]]&lt;/li&gt;&lt;li&gt;som: [[som]]&lt;/li&gt;&lt;li&gt;voltar: [[voltar]]&lt;/li&gt;&lt;li&gt;estrela: [[estrela]]&lt;/li&gt;&lt;li&gt;mundo: [[mundo]]&lt;/li&gt;&lt;li&gt;cancelar: [[cancelar]]&lt;/li&gt;&lt;li&gt;ok : [[ok]]&lt;/li&gt;&lt;li&gt;8) : [[8)]]&lt;/li&gt;&lt;li&gt;$) : [[$)]]&lt;/li&gt;&lt;li&gt;;P : [[;P]]&lt;/li&gt;&lt;li&gt;ideia : [[ideia]]&lt;/li&gt;&lt;li&gt;casa : [[casa]]&lt;/li&gt;&lt;li&gt;baixo : [[baixo]]&lt;/li&gt;&lt;li&gt;taca : [[taca]]&lt;/li&gt;&lt;li&gt;foto : [[foto]]&lt;/li&gt;&lt;li&gt;zangado : [[zangado]]&lt;/li&gt;&lt;li&gt;^^ : [[^^]]&lt;/li&gt;&lt;li&gt;:O : [[:O]]&lt;/li&gt;&lt;li&gt;D: : [[D:]]&lt;/li&gt;&lt;li&gt;;) : [[;)]]&lt;/li&gt;&lt;li&gt;:S : [[:S]]&lt;/li&gt;&lt;li&gt;:I : [[:I]]&lt;/li&gt;&lt;li&gt;:P : [[:P]]&lt;/li&gt;&lt;li&gt;8 : [[8]]&lt;/li&gt;&lt;li&gt;L : [[L]]&lt;/li&gt;&lt;li&gt;:D : [[:D]]&lt;/li&gt;&lt;li&gt;espantado : [[espantado]]&lt;/li&gt;&lt;li&gt;:( : [[:(]]&lt;/li&gt;&lt;li&gt;:) : [[:)]]&lt;/li&gt;&lt;li&gt;raio : [[raio]]&lt;/li&gt;&lt;li&gt;chave: [[chave]]&lt;/li&gt;&lt;li&gt;msn: [[msn]]&lt;/li&gt;&lt;li&gt;msn2: [[msn2]]&lt;/li&gt;&lt;li&gt;telefone: [[telefone]]&lt;/li&gt;&lt;li&gt;pizza: [[pizza]]&lt;/li&gt;&lt;li&gt;presente: [[presente]]&lt;/li&gt;&lt;li&gt;U : [[U]]&lt;/li&gt;&lt;li&gt;cima: [[cima]]&lt;/li&gt;&lt;li&gt;banana [[banana]]&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Por fim, só pra constar, os ícones usados foram feitos pelos membros da equipe CrystalXp, e podem ser utilizados em qualquer blog, desde que não tenha fins lucrativos. [[:)]]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;***EDIT:&lt;br /&gt;&lt;br /&gt;Antes realmente não estava funcionando, porque estava muito pesado, agora eu mudei o arquivo javascript - ele tem apenas 5kb -. Portanto, ignorem os comentários &quot;Ah, tentei aqui mas não deu&quot; [[:P]]&lt;/span&gt;</description><link>http://preclog.blogspot.com/2008/04/emoticons.html</link><author>noreply@blogger.com (Preco)</author><thr:total>35</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-3949422356033209012</guid><pubDate>Mon, 31 Mar 2008 13:45:00 +0000</pubDate><atom:updated>2010-02-09T08:44:54.539-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Firebird</category><category domain="http://www.blogger.com/atom/ns#">windows</category><title>Trocar senha do SYSDBA no Firebird</title><description>Isso serve pra todos os usuários, mas o SYSDBA é o mais fodão e tals..&lt;br /&gt;&lt;br /&gt;Então vamo lá. Primeiro, a gente vai na pasta &quot;bin&quot; do firebird:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;color: rgb(0, 102, 0);&quot;&gt;C:&amp;gt&lt;/span&gt; cd &lt;/span&gt;C:\Arquivos de programas\Firebird\Firebird_2_0\bin&lt;br /&gt;&lt;br /&gt;Agora a gente executa o arquivo gsec.exe, passando como parâmetro o nome de usuário e a senha atual:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;color: rgb(0, 102, 0);&quot;&gt;C:\Arquivos de programas\Firebird\Firebird_2_0\bin&amp;gt&lt;/span&gt; gsec -user SYSDBA -password masterkey&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Daí, dentro do gsec, é só mudar a senha, com o comando:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;color: rgb(0, 102, 0);&quot;&gt;GSEC&amp;gt&lt;/span&gt; modi sysdba -pw senha_nova&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E sair:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 102, 0); font-weight: bold;&quot;&gt;GSEC&amp;gt&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;quit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;\o/ Té mais&lt;br /&gt;&lt;br /&gt;Caso você use &lt;strong&gt;Windows Vista&lt;/strong&gt; ou &lt;strong&gt;Windows 7&lt;/strong&gt;, &lt;del&gt;troque de sistema operacional&lt;/del&gt;, leia este artigo aqui: &lt;a href=&quot;http://preclog.blogspot.com/2010/02/alterando-senha-do-firebird-windows.html&quot;&gt;Alterando senha do Firebird no Windows Vista e Windows 7&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Obs.: Peguei &lt;a href=&quot;http://mail.firebase.com.br/pipermail/lista_firebase.com.br/2005-September/019424.html&quot;&gt;daqui&lt;/a&gt;.</description><link>http://preclog.blogspot.com/2008/03/trocar-senha-do-sysdba-no-firebird.html</link><author>noreply@blogger.com (Preco)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-8594124857135480415</guid><pubDate>Mon, 17 Dec 2007 15:22:00 +0000</pubDate><atom:updated>2007-12-17T13:59:21.557-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">jsp</category><title>Combos dinâmicos no JSP</title><description>Depois de muito penar, descobri como fazer combobox dinâmicas para JSP.&lt;br /&gt;No exemplo, eu quero que um combo, chamado &#39;cidade&#39; exiba as cidades contidas no banco, de acordo com o estado que eu selecionar na combo &#39;uf&#39;.&lt;br /&gt;&lt;br /&gt;1º passo: Criar uma página jsp, que faça uma busca na tabela &#39;cidade&#39;, passando como parâmetro (preferencialmente via get) o código da uf:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;try{&lt;br /&gt;   int codigoUf = Integer.parseInt(request.getParameter(&quot;codigo&quot;).toString());&lt;br /&gt;   List lista = Busca.listaCidades(codigoUf);&lt;br /&gt;   out.print(&quot;[&quot;);&lt;br /&gt;   for(int i = 0; i &lt; lista.size(); i++){&lt;br /&gt;      if (i != 0) out.print(&quot;, &quot;); &lt;br /&gt;      out.print(&quot;&#39;&quot; + lista.get(i).getNome() + &quot;&#39;&quot;);  &lt;br /&gt;   }&lt;br /&gt;   out.print(&quot;]&quot;);&lt;br /&gt;   conexao.close();&lt;br /&gt;} catch (NumberFormatException e){}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;obs.: Se o java imprimisse a lista diretamente, ficaria no formato &quot;[ item, item, item ]&quot;. Mas o javascript, pelo menos aqui, não reconheceu esse formato. Por isso, eu fiz essa mini gambiarra, para que a saída seja &quot;[ &#39;item&#39;, &#39;item&#39;, &#39;item&#39; ]&quot;, como no PHP.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2º passo: Agora, no HTML, basta colocar o seguinte atributo na tag select:&lt;br /&gt;&lt;br /&gt;onchange=&quot;buscaCidade(this.options[this.selectedIndex].value)&quot;&lt;br /&gt;&lt;br /&gt;3º passo: Criar o javascript:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;function buscaCidade(tuf){&lt;br /&gt;   try{&lt;br /&gt;      xmlhttp = new XMLHttpRequest();&lt;br /&gt;   } catch(e1) {&lt;br /&gt;      try{&lt;br /&gt;         xmlhttp = new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);&lt;br /&gt;      }catch(e2){&lt;br /&gt;         try{&lt;br /&gt;            xmlhttp = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);&lt;br /&gt;         }catch(e3){&lt;br /&gt;            xmlhttp = false; //Viva a padronização dos browsers&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   //limpa a combobox&lt;br /&gt;   var c = document.getElementById(&quot;cidade&quot;)&lt;br /&gt;   while( c.options.length &gt; 0) c.options[0] = null&lt;br /&gt;   c.options[0] = new Option(&quot; -- Aguarde ... -- &quot;,&quot; -- Aguarde ... -- &quot;)&lt;br /&gt;&lt;br /&gt;    //Monta a url com a uf&lt;br /&gt;   xmlhttp.open(&quot;GET&quot;, &quot;buscacidade.jsp?codigo=&quot; + tuf, true);&lt;br /&gt;   xmlhttp.onreadystatechange=function() {&lt;br /&gt;      if (xmlhttp.readyState==4){&lt;br /&gt;         var c = document.getElementById(&quot;cidade&quot;)&lt;br /&gt;         while(c.options.length &gt; 0) c.options[0] = null&lt;br /&gt;         //Transforma a lista de cidades JSON em Javascript&lt;br /&gt;         var aCidades = eval((xmlhttp.responseText))&lt;br /&gt;         //popula o select com a lista de cidades obtida&lt;br /&gt;         for(var i = 0; i &lt; aCidades.length; i++){&lt;br /&gt;            aCidades[i] = unescape(aCidades[i])&lt;br /&gt;            c.options[c.options.length] = new Option(aCidades[i],  aCidades[i])&lt;br /&gt;         }&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   xmlhttp.send(null)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Segundo meus cálculos, agora deve funcionar... Para testar, crie dois combos (uf e cidade), e popule um banco =]&lt;br /&gt;&lt;br /&gt;Observações:&lt;br /&gt;&lt;br /&gt;1) De repente, você pode precisar utilizar o código da cidade juntamente com o nome, para efetuar cadastros e tals. No exemplo de cima, o jsp só busca o nome da cidade. Pra fazer ele buscar também o código, concatene ele com o nome da cidade, utilizando um caracter bem estranho para separá-los:&lt;br /&gt;&lt;br /&gt;out.print(&quot;&#39;&quot; + lista.get(i).getCodigo() + &quot;#&quot; + lista.get(i).getNome() + &quot;&#39;&quot;);&lt;br /&gt;&lt;br /&gt;Daí no .js você coloca:&lt;br /&gt;&lt;br /&gt;var str = aCidades[i].split(&quot;#&quot;);&lt;br /&gt;c.options[c.options.length] = new Option(str[1],  str[0])&lt;br /&gt;&lt;br /&gt;Onde str[0] (código) será o value do select, e str[1] (nome) será o valor exibido na combo.&lt;br /&gt;&lt;br /&gt;2) De repente também, você precise utilizar este javascript em mais de uma combo. Para isso, é só passar o nome do combo que você quer carregar via parâmetro:&lt;br /&gt;&lt;br /&gt;onchange=&quot;doBusca(this.options[this.selectedIndex].value, &#39;cidade&#39;)&quot;&lt;br /&gt;&lt;br /&gt;E alterar o javascript pra receber esse parâmetro.&lt;br /&gt;&lt;br /&gt;3) Peguei esse código &lt;a href=&quot;http://elcio.com.br/ajax/combos/&quot; target=&quot;blank&quot;&gt;daqui&lt;/a&gt;, e adaptei um pouco =D.&lt;br /&gt;&lt;br /&gt;É isso, té mais o/</description><link>http://preclog.blogspot.com/2007/12/combos-dinmicos-no-jsp.html</link><author>noreply@blogger.com (Preco)</author><thr:total>10</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-8738860501124593441</guid><pubDate>Fri, 07 Dec 2007 16:15:00 +0000</pubDate><atom:updated>2007-12-07T14:20:45.970-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><title>Arredondando valores double</title><description>Tava dando uma olhada aqui, achei um codigozinho bem legal pra arredondar doubles...&lt;br /&gt;É bem simples, só informar o double e o número de casas decimais que se quer arredondar:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;public static double arredondaValor(double valor, int nrCasasDecimais) {&lt;br /&gt;   BigDecimal bd = new BigDecimal(valor);&lt;br /&gt;   bd = bd.setScale(nrCasasDecimais,BigDecimal.ROUND_HALF_UP);&lt;br /&gt;   return bd.doubleValue();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Roubei o código do Charbel =]&lt;br /&gt;&lt;br /&gt;Té mais o/</description><link>http://preclog.blogspot.com/2007/12/arredondando-valores-double.html</link><author>noreply@blogger.com (Preco)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-365969910285611582</guid><pubDate>Mon, 03 Dec 2007 15:34:00 +0000</pubDate><atom:updated>2007-12-03T13:39:05.331-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Impressionante</category><title>Curiosidade</title><description>Por acaso tava programando uma coisa, e me deparei com um possível bug do Windows (bugs do Windows são legais).&lt;br /&gt;&lt;br /&gt;Criem um arquivo qualquer, texto, imagem, planilha, etc., e tentem salvar este arquivo com o nome &quot;aux&quot;. (no WinXp)&lt;br /&gt;Funciona também na hora de tentar renomear um arquivo qualquer.&lt;br /&gt;&lt;br /&gt;Estranho não?&lt;br /&gt;&lt;br /&gt;bush hid the facts&lt;br /&gt;(piada &quot;interna&quot;)&lt;br /&gt;&lt;br /&gt;Abraços o/</description><link>http://preclog.blogspot.com/2007/12/curiosidade.html</link><author>noreply@blogger.com (Preco)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-6833245173575708752</guid><pubDate>Tue, 27 Nov 2007 11:33:00 +0000</pubDate><atom:updated>2007-11-27T09:37:23.270-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Swing</category><category domain="http://www.blogger.com/atom/ns#">SWT</category><title>O grande livrão verde do SWT</title><description>Eu tava procurando coisas sobre SWT na internet.. Tem muita coisa legal, e muita coisa espalhada, além do grande guia do site do eclipse.&lt;br /&gt;Daí eu tava pensando, vou criar um grande livrão verde, ensinando aos usuários de Swing como portar as aplicações pra SWT sem maiores dificuldades, relacionando cada item do Swing ao seu correspondente em SWT.&lt;br /&gt;&lt;br /&gt;Deve ficar pronto até o dia 15.&lt;br /&gt;&lt;br /&gt;Té mais  o/</description><link>http://preclog.blogspot.com/2007/11/o-grande-livro-verde-do-swt.html</link><author>noreply@blogger.com (Preco)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-2130568342931026950</guid><pubDate>Mon, 19 Nov 2007 18:35:00 +0000</pubDate><atom:updated>2007-11-19T16:42:29.070-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">SWT</category><title>Exibindo (e dimensionando) uma imagem no SWT</title><description>Existe um monte de jeito de fazer isso, esse aqui é o mais fofinho... Ele exibe a imagem dentro de um Canvas, e toda vez que ele precisa repintar a imagem, ele dimensiona de acordo com o tamanho do &quot;container&quot; (composite) pai.&lt;br /&gt;&lt;br /&gt;Eis o código:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;final Composite composite = new Composite(shell, SWT.NONE);&lt;br /&gt;final Image image = SWTResourceManager.getImage(PrincipalSWT.class, &quot;/com/trabalho/imgs/imagem.jpg&quot;);&lt;br /&gt;final int width = image.getBounds().width;&lt;br /&gt;final int height = image.getBounds().height;&lt;br /&gt; &lt;br /&gt;Canvas canvas = new Canvas(composite, SWT.NONE);&lt;br /&gt;canvas.addPaintListener(new PaintListener() {&lt;br /&gt;   public void paintControl(PaintEvent e) {&lt;br /&gt;       e.gc.drawImage( image, 0, 0, width, height, 0, 0,&lt;br /&gt;           (int) composite.getSize().x, (int)composite.getSize().y );&lt;br /&gt;   }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Peguei o código e adaptei &lt;a href=&quot;http://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html&quot;&gt;daqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por hoje, é isso...&lt;br /&gt;Té mais o/</description><link>http://preclog.blogspot.com/2007/11/exibindo-e-dimensionando-uma-imagem-no.html</link><author>noreply@blogger.com (Preco)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-3737348565111933275</guid><pubDate>Fri, 16 Nov 2007 10:30:00 +0000</pubDate><atom:updated>2007-11-16T08:48:26.085-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Firebird</category><title>Autoincrement no Firebird</title><description>Uma das coisas chatas de usar o Firebird é que ele não tem o campo autoincrement (ou pelo menos não tinha até essa postagem). Isso é particularmente chato, porque o autoincrement &lt;span style=&quot;font-weight: bold;&quot;&gt;é&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;&lt;/span&gt; legal, e facilita a vida do programador.&lt;br /&gt;&lt;br /&gt;Tá, vamos aos códigos.&lt;br /&gt;&lt;br /&gt;Primeiro, deve-se criar um Generator. Um generator é um gerador de números que o banco de dados usa pra fazer o controle dessas coisas.&lt;br /&gt;&lt;br /&gt;Importante: Se houver mais de um campo autoincrement no banco de dados, será necessária a criação de um generator pra cada um.&lt;br /&gt;&lt;br /&gt;Suponhamos que queira o campo &quot;codigo&quot; da tabela &quot;aluno&quot; seja autoincrement. Primeiro cria-se o gerador &quot;gen_cod_aluno&quot;:&lt;br /&gt;&lt;br /&gt;CREATE GENERATOR &lt;span style=&quot;font-weight: bold;&quot;&gt;gen_cod_aluno&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;Agora deve-ser criar uma trigger para que esse gerador seja incrementado cada vez que o usuário tentar inserir algum valor no banco de dados:&lt;br /&gt;&lt;br /&gt;CREATE TRIGGER FOR &lt;span style=&quot;font-weight: bold;&quot;&gt;aluno&lt;/span&gt;&lt;br /&gt;ACTIVE BEFORE INSERT POSITION 0 AS&lt;br /&gt;BEGIN&lt;br /&gt;NEW.&lt;span style=&quot;font-weight: bold;&quot;&gt;codigo&lt;/span&gt; = GEN_ID(&lt;span style=&quot;font-weight: bold;&quot;&gt;gen_cod_aluno&lt;/span&gt;,1);&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;Traduzindo, criou-se uma trigger para a tabela aluno, que será ativada antes que um registro seja inserido, atribuindo ao campo &quot;codigo&quot; o valor armazenado em &quot;gen_cod_aluno&quot;, somado a 1.&lt;br /&gt;&lt;br /&gt;De novo, pra cada campo autoincrement, uma trigger e um generator.&lt;br /&gt;&lt;br /&gt;Té mais o/</description><link>http://preclog.blogspot.com/2007/11/autoincrement-no-firebird.html</link><author>noreply@blogger.com (Preco)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-2702660366251314373</guid><pubDate>Tue, 13 Nov 2007 13:11:00 +0000</pubDate><atom:updated>2007-11-13T11:24:30.269-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">SWT</category><title>Retirando a seleção em uma tabela no SWT</title><description>Hoje, quando eu tava mexendo com uma Table no SWT, percebi que quando a pessoa clica em um item, esse item fica selecionado até que o usuário clique em outro item. Isso pode ser útil pra alguém, mas acho mais legal que o item continue selecionado até que o usuário clique em outro componente, ou quando o usuário clicar em uma linha vazia da tabela. &lt;br /&gt;&lt;br /&gt;Pra resolver isso, tem essa gambiarrinha aqui ó:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;Table table = new Table(shell, SWT.FULL_SELECTION&lt;br /&gt;  | SWT.BORDER);&lt;br /&gt;&lt;br /&gt;table.addMouseListener(new MouseAdapter() {&lt;br /&gt;    public void mouseDown(final MouseEvent arg0) {&lt;br /&gt;        if (table.getItem(new Point(arg0.x, arg0.y)) == null) {&lt;br /&gt;            //Se o usuário clica em uma linha vazia&lt;br /&gt;            table.deselectAll();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;table.addFocusListener(new FocusAdapter() {&lt;br /&gt;    public void focusLost(final FocusEvent arg0) {&lt;br /&gt;        //Se o usuário clica em outro componente&lt;br /&gt;        table.deselectAll();&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Era isso, Té mais o/</description><link>http://preclog.blogspot.com/2007/11/retirando-seleo-em-uma-tabela-no-swt.html</link><author>noreply@blogger.com (Preco)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-6869368349364514657</guid><pubDate>Mon, 12 Nov 2007 18:44:00 +0000</pubDate><atom:updated>2007-11-12T17:11:19.320-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">SWT</category><title>Multithreading com SWT</title><description>Antes de mais nada, um pequeno comentário de um usuário de Swing, em relação ao SWT:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Ô coisa complicada do demo!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Tá. Desespero de lado, vamos ao que interessa: Acessando elementos gráficos do SWT através de uma outra thread.&lt;br /&gt;&lt;br /&gt;Vamos dizer que eu tenho um programa, que tem que monitorar o banco de dados, de 5 em 5 segundos, e colocar o valor de um campo em um Text (o equivalente SWT ao JTextField).&lt;br /&gt;Primeiro, criamos o Text:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols:nogutter&quot;&gt;&lt;br /&gt;Text campoText = new Text(composite, SWT.BORDER);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Beleza. Agora, se a gente tenta acessar ele através de uma outra Thread, o maldito &quot;Invalid Thread access&quot; aparece, indicando que a gente tem que mudar de estratégia.&lt;br /&gt;&lt;br /&gt;O que deve ser feito? Criar uma Thread mais ou menos assim:&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;&lt;br /&gt;final Thread t = new Thread(){&lt;br /&gt;  public void run(){&lt;br /&gt;    while(true){&lt;br /&gt;        Display display = shell.getDisplay();&lt;br /&gt;        if(display == null || display.isDisposed()) return;&lt;br /&gt;        display.asyncExec(new Runnable()  { //Início do Runnable&lt;br /&gt;            public void run() {&lt;br /&gt;                String str = pegaCampoDaTabelaTal();&lt;br /&gt;                campoText.setText(str);&lt;br /&gt;            }&lt;br /&gt;        }); //Fim do Runnable&lt;br /&gt;        try { // Tenta dormir (FORA do Runnable)&lt;br /&gt;            sleep(5000); // 5 segundos&lt;br /&gt;        } catch (InterruptedException e) {}&lt;br /&gt;    } // Fim do while&lt;br /&gt;  } //Fim do método run&lt;br /&gt;}; // Fim da Thread&lt;br /&gt;t.start(); // Inicia a Thread \o/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Com o trecho de código acima, é possível acessar campoText através da Thread t, sem dor, só alegria!&lt;br /&gt;&lt;br /&gt;Um pequeno parênteses: Existe uma diferença bem grande entre os métodos &lt;span style=&quot;font-weight:bold;&quot;&gt;asyncExec()&lt;/span&gt; e &lt;span style=&quot;font-weight:bold;&quot;&gt;syncExec()&lt;/span&gt;.&lt;br /&gt;O primeiro é executado pela segunda Thread sem que a primeira Thread (a principal) seja notificada. Já o segundo vai suspender a thread principal até que o segundo Runnable (linha 6) seja finalizada. Como no nosso caso, é mais interessante que o programa continue lépido e fagueiro.&lt;br /&gt;&lt;br /&gt;Té mais o/</description><link>http://preclog.blogspot.com/2007/11/multithreading-com-swt.html</link><author>noreply@blogger.com (Preco)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-8883148615435782561</guid><pubDate>Mon, 05 Nov 2007 13:46:00 +0000</pubDate><atom:updated>2010-02-24T10:32:33.743-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">gtalk</category><category domain="http://www.blogger.com/atom/ns#">talk</category><title>Negrito e itálico no Google Talk</title><description>Eu sei que muita gente sabe, e acha que é banal, mas muita gente não sabe que dá pra escrever em negrito e itálico no GTalk. Eu e o Highlander descobrimos o código meio que no susto (o negrito eu descobri por sorte; o itálico, o Highlander descobriu por tentativa e erro).&lt;br /&gt;&lt;br /&gt;Negrito: Escreva a frase entre &lt;span style=&quot;color: rgb(153, 0, 0);&quot;&gt;*&lt;/span&gt;.&lt;br /&gt;Exemplo: *Texto* = &lt;span style=&quot;font-weight: bold;&quot;&gt;Texto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Itálico: Escreva a frase entre &lt;span style=&quot;color: rgb(153, 0, 0);&quot;&gt;_&lt;/span&gt;.&lt;br /&gt;Exemplo: _Texto_ = &lt;span style=&quot;font-style: italic;&quot;&gt;Texto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Edit: Agora existe também o riscado (tachado). Basta escrever a frase entre &lt;span style=&quot;color: rgb(153, 0, 0);&quot;&gt;-&lt;/span&gt;.&lt;br /&gt;Exemplo: -Texto- = &lt;del&gt;Texto&lt;/del&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Espero que mudem a vida de vocês como mudou a minha... :P&lt;br /&gt;&lt;br /&gt;Té mais o/</description><link>http://preclog.blogspot.com/2007/11/negrito-e-itlico-no-google-talk.html</link><author>noreply@blogger.com (Preco)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-7379831853551939712</guid><pubDate>Sat, 03 Nov 2007 14:41:00 +0000</pubDate><atom:updated>2007-11-03T13:00:05.245-02:00</atom:updated><title>Meme - Livro das revelações [Parte II ]</title><description>Bom ja que fui desafiado e meu blog se auto-destroiu-se a si próprio, postarei aqui o desafio.&lt;br /&gt;&lt;br /&gt;Também encontrei um problema semelhante ao do preco ao pegar o livro mais proximo, o livro mais proximo na página 161 tinha apenas uma frase e era &quot;anotações&quot; era um guia prático de dreamweaver o_O enfim, ai peguei o que tava embaixo dele e la vai:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;quote&gt;Você não pode levá-lo dessa vida, de modo que é melhor se dar os parabéns por um trabalho bem-feito.&lt;/quote&gt;&lt;br /&gt;&lt;br /&gt;do livro Mulheres boazinhas não enriquecem de Lois P. Frankel&lt;br /&gt;&lt;br /&gt;ta, eu sei que é parece desculpa, mas, o livro é da minha mãe!!&lt;br /&gt;;)</description><link>http://preclog.blogspot.com/2007/11/meme-livro-das-revelaes-parte-ii.html</link><author>noreply@blogger.com (Guilherme)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-2547881208479656987</guid><pubDate>Fri, 02 Nov 2007 17:01:00 +0000</pubDate><atom:updated>2007-11-02T15:16:10.891-02:00</atom:updated><title>Meme - Livro das revelações</title><description>AHuhauhahua &lt;br /&gt;O &lt;a href=&quot;http://www.sacolaodigital.blogspot.com/&quot;&gt;Sacolão&lt;/a&gt; me convidou pra um meme. Mais ou menos assim:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;1. Pegar o livro mais próximo.&lt;br /&gt;2. Abrir na página 161;&lt;br /&gt;3. Procurar a 5ª frase completa;&lt;br /&gt;4. Colocar a frase no blog;&lt;br /&gt;5. Sem escolher a melhor frase nem o melhor livro (usar o mais próximo);&lt;br /&gt;6. Passar o desafio a cinco pessoas.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Tá, vamo lá.&lt;br /&gt;Os dois livros mais próximos daqui do pc &lt;span style=&quot;font-weight:bold;&quot;&gt;não&lt;/span&gt; tinham 161 páginas, então acho que eles não contam como livros mais próximos. Daí eu fui na prateleira dos livros e peguei o que estava relativamente mais próximo, usando um cálculo Bayesiano que demorou 2 dias e meio. O resultado premiou o livro &quot;Os segredos da mente milionária&quot;, do T. Harv Eker. A frase foi a seguinte:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Quando identificar tais pensamentos, comece a substituí-los de forma consciente por outros que o fortaleçam.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Confesso que não é a frase mais marcante do livro, mas regras são regras.&lt;br /&gt;&lt;br /&gt;Agora repasso o meme (memes têm um quê de corrente, não?) para os amigos:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://natalia-m.blogspot.com&quot;&gt;Mor&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://guilherme.vandresen.com.br/&quot;&gt;Guilherme&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.siriloko.blogspot.com/&quot;&gt;Niler&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://putanhaca.blogspot.com/&quot;&gt;Tabexa&lt;/a&gt;</description><link>http://preclog.blogspot.com/2007/11/meme-livro-das-revelaes.html</link><author>noreply@blogger.com (Preco)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8555172601608452792.post-6208690211440492899</guid><pubDate>Tue, 30 Oct 2007 22:35:00 +0000</pubDate><atom:updated>2008-11-13T09:16:05.942-02:00</atom:updated><title>O novo cachorro</title><description>Habemus chocolate!&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1f8b9VlFT4nIfiLD2e_mtfiOM6ifMOTtkZ29pGSDdkyXpk8MFj9FBbWB797fpXONp75lEzsOE5M7PFajxks0Hx14YrnwV1V7jQg_dQZag1g6ZbbCt5Gjz5eWuMftk_8I2MA_86f-ZKQ/s1600-h/P1030668.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1f8b9VlFT4nIfiLD2e_mtfiOM6ifMOTtkZ29pGSDdkyXpk8MFj9FBbWB797fpXONp75lEzsOE5M7PFajxks0Hx14YrnwV1V7jQg_dQZag1g6ZbbCt5Gjz5eWuMftk_8I2MA_86f-ZKQ/s320/P1030668.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5127262597140921394&quot; /&gt;&lt;/a&gt;</description><link>http://preclog.blogspot.com/2007/10/o-novo-cachorro.html</link><author>noreply@blogger.com (Preco)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1f8b9VlFT4nIfiLD2e_mtfiOM6ifMOTtkZ29pGSDdkyXpk8MFj9FBbWB797fpXONp75lEzsOE5M7PFajxks0Hx14YrnwV1V7jQg_dQZag1g6ZbbCt5Gjz5eWuMftk_8I2MA_86f-ZKQ/s72-c/P1030668.JPG" height="72" width="72"/><thr:total>3</thr:total></item></channel></rss>