tag:blogger.com,1999:blog-58731007938646097722024-03-08T06:59:48.557-03:00NetBeando...Dicas sobre NetBeans, Java, J2EE, J2SE, J2ME e MySQL.Unknownnoreply@blogger.comBlogger28125tag:blogger.com,1999:blog-5873100793864609772.post-28993971333837512862012-02-25T10:48:00.001-02:002012-02-25T10:48:31.018-02:00Integrando ambiente de desenvolvimento do Android ao Netbeans 7+Se você precisa desenvolver um aplicativo para Android através da IDE Netbeans 7+, siga os passos descritos nesta página <a href="http://www.nbandroid.org/p/installation.html">http://www.nbandroid.org/p/installation.html</a><br />
<br />
Provavelmente você deve ter pesquisado no Google como fazer isso e o resultado era de que não se conseguia ativar o plugin por que o endereço do Kenai estava errado, pois bem, você pode seguir qualquer dica que foi listada pelo Google, basta que ao invés de utilizar a url do Kenai especificada neles, utilize essa <a href="http://kenai.com/projects/nbandroid/downloads/download/updatecenter/updates.xml" style="background-color: white; color: #999999; font-family: Georgia, serif; font-size: 13px; line-height: 20px; text-align: left; text-decoration: none;">http://kenai.com/projects/nbandroid/downloads/download/updatecenter/updates.xml</a><br />
<br />
É isso.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-58321461109240836212011-03-31T14:45:00.001-03:002011-04-01T10:34:01.035-03:00Ativando o plugin JAX-RPC no Netbeans 6.9Se você precisa invocar serviços da web definidos por um arquivo WSDL no Netbeans 6.9 pode ter recebido uma mensagem para instalar o plugin JAX-RPC, mas ao procurar o plugin ele não é listado, para inserir na lista de plugins siga os passos abaixo:<br />
<br />
1) Acesse o menu Ferramentas -> Plugins<br />
2) Acesse a aba Configurações<br />
3) Clique no botão "Adicionar" e preencha no campo nome "Netbeans dev" e no campo URL "http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/nbms/updates.xml.gz"<br />
4) Clique em OK<br />
<br />
Pronto, o plugin JAX-RPC já será listado na aba de plugins disponíveis.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5873100793864609772.post-65109797138694552011-02-22T17:26:00.001-03:002011-02-22T17:27:49.919-03:00UML no NetBeans 6.9Você procurou nos plugins do NetBeans 6.9 a ferramenta UML para criar diagramas de casos de uso, atividade, estado, etc... e não encontrou? Não pense que você ficou louco, realmente eles não existem mais, mas por sorte a solução é bem simples, apenas faça o download dos arquivos que estão neste link <a href="http://dlc.sun.com.edgesuite.net/netbeans/updates/6.7.1/uc/final/beta/modules/uml6/">http://dlc.sun.com.edgesuite.net/netbeans/updates/6.7.1/uc/final/beta/modules/uml6/</a>, abra o NetBeans e siga os passos abaixo:<br />
<br />
1) Ferramentas->Plugins->Baixados<br />
2) Clique no botão "adicionar"<br />
3) Selecione todos os arquivos .nbm que você fez o download do link acima<br />
4) Siga os passos da instalação<br />
5) Após concluir a instalação dos plugins feche o NetBeans e abra novamente<br />
6) Pronto, agora criar um novo projeto do tipo UMLUnknownnoreply@blogger.com1tag:blogger.com,1999:blog-5873100793864609772.post-41852368912261827412011-01-19T16:02:00.000-02:002011-01-19T16:02:37.052-02:00Netbeans 6.9.1 problemas com combobox no UbuntuDepois de muito tempo acabei instalando a última versão disponível do Netbeans, a 6.9.1 e pra minha surpresa os mesmos problemas que ocorriam com relação a abertura de combobox da própria IDE na versão 6.0 continuam nesta versão, eu já tinha postado uma dica para abrir o Netbeans com um LookAndFeel diferente do que vem como padrão, resolve o problema, mas a dica anterior tratava-se de alterar a linha de comando do atalho que faz a chamada para abrir o Netbeans, agora a proposta é um pouco diferente, vou alterar o arquivo de configuração desta versão, pra fazer isso edite o arquivo netbeans.conf localizado (no meu caso) em /usr/local/netbeans-6.9.1/etc, encontre uma linha semelhante a essa:<br />
<br />
<br />
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true"<br />
<br />
E adicione antes da última áspa (") o seguinte texto:<br />
<br />
<br />
Feita a alteração o conteúdo final é:<br />
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true --laf javax.swing.plaf.metal.MetalLookAndFeel -J-Dswing.aatext=true -J-Dswing.metalTheme=ocean"<br />
<br />
Pronto, agora você já pode clicar no atalho do Netbeans que ele será aberto com o LookAndFeel que você informou neste arquivo de configuracão.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-36280171054717756592010-05-21T09:41:00.004-03:002010-06-05T20:29:01.410-03:00OFF-TOPIC: Ubuntu 10.4 + Motorola Backflip (MB300) + 3G + modem (tethering sem root)Recentemente adquiri o telefone Motorola Backflip com sistema operacional Android 1.5.<br />
<br />
Utilizo regularmente o meu plano de dados 3G para navegar não só nos aparelhos celulares que possuo, mas também utilizo os aparelhos servindo de modem para o meu notebook com sistema operacional Ubuntu (atualmente com a versão 10.04), bom, nunca imaginei que a dor de cabeça seria tão grande pra conseguir fazer um sistema baseado em Linux (Android) instalado no aparelho celular servir de modem para conexão 3G, visto que absolutamente todos os aparelhos que eu pluguei no Ubuntu desde a versão 9.04 (ou 8.10 não me lembro direito) ele automaticamente era reconhecido como modem 3G e já me disponibilizava a opção de conexão imediatamente... mas com o Android 1.5 foi diferente, hoje foi lançada a versão 2.2 do Android prometendo disponibilizar a conexão 3G facilmente através da criação de um hotspot pelo aparelho... legal... mas por enquanto na 1.5 nativamente não funciona isso. Depois de muita pesquisa e achar que eu teria que "rootear" o aparelho com menos de 1 semana de vida, eis que surgiu a solução através da criação de uma VPN entre o celular e o notebook. Na verdade encontrei uma dica parecida de uma pessoa que fez isso com um Mac Book e o Backflip, não me lembro mais do link, embora muitas coisas fossem incompatíveis, algumas delas até funcionaram pra mim, mas no final faltaram pacotes relacionados entre o Mac e o Linux, então partindo daí acabei chegando nesta solução....<br />
<br />
A "mágica" se faz através do AziLink. Testei no meu notebook com Ubuntu 10.04 e no notebook de um amigo com Windows 7, funcionaram perfeitamente.<br />
<br />
Vamos lá:<br />
<br />
No celular: <br />
<br />
1) Instale a última versão do AziLink, o link <br />
<a href="http://code.google.com/p/azilink/">http://code.google.com/p/azilink</a> está nesta página, ou se você tem um plano de dados ilimitado acesse diretamente com o seu celular e baixe por este endereço <a href="http://azilink.googlecode.com/files/azilink-2.0.2.apk">http://azilink.googlecode.com/files/azilink-2.0.2.apk</a>, essa é a versão que estou usando.<br />
<br />
2) Habilite a "Depuração USB" em Menu -> Configurações -> Aplicativos -> Desenvolvimento<br />
<br />
No computador (todos os comandos descritos abaixo são para o Linux, mas pra quem utiliza Windows existem as formas compatíveis claro... click... click rsrsrsrsrs):<br />
<br />
1) Faça o download e instale o Android SDK: <br />
wget http://developer.android.com/sdk/download.html?v=android-sdk_r05-linux_86.tgz<br />
tar -xvf android-sdk_r05-linux_86.tgz <br />
cd android-sdk-linux_86/<br />
tools/android update sdk<br />
<br />
2) Esse passo os utilizadores de Windows podem pular, na verdade quem utiliza Windows precisa acessar o site do MOTODEV e baixar um driver que já reconhece o aparelho quando você plugar ele na USB, mas pra quem usa Linux precisa criar o arquivo /etc/udev/rules.d/90-android.rules com o seguinte conteudo:<br />
<br />
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", MODE="0666"<br />
<br />
3) Instale o OpenVPN 2.1 (não pode ser com versões anteriores):<br />
sudo apt-get install openvpn<br />
<br />
4) Crie um arquivo no diretório {de instalação do Android SDK}/tools com o nome azilink.ovpn e com o seguinte conteúdo:<br />
<br />
dev tun<br />
<br />
remote 127.0.0.1 41927 tcp-client<br />
ifconfig 192.168.56.2 192.168.56.1<br />
route 0.0.0.0 128.0.0.0<br />
route 128.0.0.0 128.0.0.0<br />
socket-flags TCP_NODELAY<br />
keepalive 10 30<br />
dhcp-option DNS 192.168.56.1<br />
<br />
<br />
4) Pra eu não ter que ficar digitando um monte de comandos cada vez que vou utilizar essa conexão 3G acabei fazendo um shell script pra automatizar um pouco o processo (ainda não fiz o .bat pro meu amigo que utiliza Windows 7, mas assim que fizer eu disponibilizo aqui também), criei um arquivo no meu diretório home e chamei de android3GConnect.sh, com o seguinte conteúdo:<br />
<br />
#######################################################<br />
cd /home/je/.android-sdk-linux_86/tools<br />
sudo echo "nameserver 192.168.56.1" >> /etc/resolv.conf<br />
sudo ./adb kill-server<br />
sudo ./adb start-server<br />
./adb devices<br />
./adb forward tcp:41927 tcp:41927<br />
sudo openvpn --script-security 2 --config azilink.ovpn<br />
#######################################################<br />
<br />
Explicando o que pode ser diferente no seu caso:<br />
/home/je/.android-sdk-linux_86/tools : <br />
esse é o meu diretório de instalação do Android SDK, mude conforme necessário para você<br />
<br />
sudo echo "nameserver 192.168.56.1" >> /etc/resolv.conf:<br />
Usuários do Windows não precisam disso<br />
<br />
<br />
5) Dê permissão de execução para esse script com o comando:<br />
chmod +x android3GConnect.sh<br />
<br />
6) Pra eu não ter que ficar abrindo o Terminal e digitar o comando pra executar esse arquivo cada vez que vou utilizar a conexão 3G, acabei criando um atalho na minha barra de tarefas, se você optar por fazer isso (no Ubuntu), clique com o botão direito sobre a barra de tarefas (painel) e selecione a opção "Adicionar ao painel..." -> Lançador de Aplicativo Personalizado, no campo "Tipo" você precisa selecionar a opção "Aplicativo no terminal", caso contrário você não vai conseguir parar de rodar esse script sem ter que reiniciar o computador, e no campo comando insira: gksu {caminho do diretorio onde salvou o shell script}/android3GConnect.sh<br />
<br />
7) Agora pra economizar uma meia dúzia de comandos... reinicie ambos equipamentos (celular e computador)<br />
<br />
8) Bom, feito isto, ao religar o celular, abra o programa AziLink e marque a opção "Service active", o Status será alterado para "Waiting for connection..."<br />
<br />
<br />
9) Neste momento clique no link criado para chamar aquele shell script, ou se você for masoquista o suficiente e não criou o script abra um terminal e digite aqueles comandos do passo 4<br />
<br />
10) Espere até aparecer a mensagem "Initialization Sequence Completed", se ela aparecer está tudo ok, o Status no AziLink no celular deve ter sido alterado para "Connected to host" e você já pode navegar, caso contrário... ou você esqueceu de alguma coisa desta dica ou eu pulei algum passo....<br />
<br />
OBS: <br />
<br />
1) Se você não quiser ter problemas com DNS's etc...etc... é melhor desativar a sua conexão wifi, caso contrário ela pode encontrar uma rede disponível e trocar o servidor de DNS automaticamente, daí bau bau conexão...<br />
<br />
2) No caso dos usuários do Windows 7, já que não tem como utilizar o comando "sudo" ou o "gksu" no atalho do painel, abram o terminal como "ADMINISTRADOR" pra executar os comandos do passo 4<br />
<br />
3) Quando você se encher o saco de navegar, pra cancelar a execução do script basta dar um CTRL+C na janela do Terminal de comando que está executando o shell script e encerrar a execução...<br />
<br />
Bom proveito.<br />
<br />
[]'sUnknownnoreply@blogger.com2tag:blogger.com,1999:blog-5873100793864609772.post-19548956685830082502010-04-29T17:34:00.003-03:002010-06-05T20:29:28.451-03:00Netbeans 8: Classe principal do projeto não encontrada (no Main classes found)Você já se deparou com a mensagem ao tentar compilar, de que não existe classe principal no seu projeto? Mas você tem certeza de que existe a classe até porque na última vez que você compilou ela estava lá e funcionando? E mesmo que você acesse as propriedades do projeto o Netbeans não identifica que existe uma classe principal.<br />
<br />
Bom, esse me parece um problema do Netbeans 6.8 (pelo menos comigo nunca aconteceu isso antes e sou usuário desde a versão 5.0), para resolver o problema basta que você limpe o cache que o Netbeans cria no seu computador.<br />
<br />
No meu caso, como sou usuário de linux (Ubuntu), basta apagar a pasta /home/{meu usuário}/.netbeans/6.8/var/cache<br />
<br />
Pronto! Agora basta abrir novamente o Netbeans, carregar o projeto e tudo voltou a funcionar normalmente.Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-5873100793864609772.post-49112459702952604322010-02-20T08:36:00.001-02:002010-06-05T20:30:39.312-03:00JTable - excluir linhasSeguindo o modelo do post anterior (JTable - inserir linhas), para excluir linhas selecionadas de um JTable basta:<br />
<br />
<br />
int[] l = projetos.getSelectedRows();<br />
DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();<br />
for (int i = (l.length - 1); i >= 0; --i) {<br />
dtm.removeRow(l[i]);//remove todas as linhas selecionadas<br />
}<br />
<br />
<br />
Mumu....Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-5873100793864609772.post-52831857774051773522010-02-20T08:34:00.000-02:002010-06-05T20:30:47.402-03:00JTable - inserir linhasDepois que você inserir o JTable no seu projeto para inserir linhas basta:<br />
<br />
1) Recuperar o tablemodel do jtable e fazer um cast para um DefaultTableModel:<br />
DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();<br />
<br />
2) Inserir a nova linha no "dtm":<br />
dtm.addRow(new Object[]{"", "", "", ""}); // um "" para cada coluna que existir<br />
<br />
Fácil não?!?Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5873100793864609772.post-72162815323074297562009-10-16T04:35:00.001-03:002010-06-05T20:31:15.016-03:00MySQL: salvando resultado de select em arquivoVocê alguma vez já precisou salvar o resultado de um select feito no banco de dados para um arquivo para enviar a alguém?<br />
<br />
O comando abaixo faz exatamente isso...<br />
<br />
SELECT campo1, campo2 FROM tabela WHERE campoN="XYZ" INTO OUTFILE '/tmp/nome_arquivo.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';<br />
<br />
<br />
Entendendo o comando:<br />
<br />
SELECT, FROM, WHERE: sem comentários, se você não sabe o que significa isso então nem continue lendo rsrsrsrsrs<br />
<br />
INTO OUTFILE: path e nome do arquivo que será gerado<br />
FIELDS TERMINATED BY: é o separador dos campos, no exemplo acima é a vírgula<br />
ENCLOSED BY: os campos serão colocados entre o caractér definido neste parâmetro, no caso do exemplo são áspas duplas<br />
LINES TERMINATED BY: quebra de linha (enter)<br />
<br />
<br />
<br />
<br />
[]'sUnknownnoreply@blogger.com1tag:blogger.com,1999:blog-5873100793864609772.post-84063465543008042082009-10-12T19:10:00.000-03:002010-06-05T20:45:01.313-03:00Preparatório para Certificação SCJP (Sun Certified Java Programmer)Se você está interessado em tirar uma certificação java (SCJP) esse site pode lhe interessar:<br />
<br />
<a href="http://www.javaead.com.br/">http://www.javaead.com.br</a><br />
<br />
Nele você encontrará material de estudo, forum e chat.<br />
<br />
[]'sUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-79831722955650702692009-10-11T08:43:00.000-03:002009-10-11T08:43:16.274-03:00Ajudar não custa nada...Sou usuário do Ubuntu desde a versão 7.xx e gosto muito desse sistema operacional, embora não seja adepto a instalar jogos no meu notebook acho importante que se tenha um programa como o que foi desenvolvido para instalação de jogos, então uma forcinha não custa nada...<br />
<br />
<span style="color: red; font-size: 130%; font-weight: bold;">"</span>Promoção ajude o <a href="http://www.ubuntugames.org/">ubuntu games</a> a se manter no ar e concorra a 3 camisas do blog <a href="http://defendendoolinux.blogspot.com/">defendendoolinux</a> no dia 30/10, para participar é simples copie e cole todo esse texto entre aspas, preservando a formatação html no seu blog e deixe um comentario nesse <a href="http://defendendoolinux.blogspot.com/2009/10/promocao-ajude-o-ubuntu-games-se-manter.html">link</a> com o link para a sua postagem. Além disso o <a href="http://defendendoolinux.blogspot.com/">defendendoolinux</a> fará uma doação em dinheiro ao projeto.<span style="color: red; font-size: 130%; font-weight: bold;">"</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-27144508588969573102009-09-02T17:37:00.003-03:002010-06-05T20:33:31.299-03:00JPA e "last_insert_id"Você já passou pelo problema de inserir um registro em uma tabela e logo a seguir precisar desse código pra relacionar com outra tabela (por exemplo....) e o seu objeto de persistência não retornar esse código?<br />
<br />
Então seus problemas acabaram.... na classe da sua entidade, mais precisamente no campo que identifica a chave primária (autoincrement) da tabela, basta você inserir:<br />
<br />
@GeneratedValue(strategy=GenerationType.IDENTITY)<br />
<br />
Por exemplo:<br />
<br />
@Id<br />
@GeneratedValue(strategy=GenerationType.IDENTITY)<br />
@Column(name = "codigo", nullable = false)<br />
private Integer codigo;<br />
<br />
Depois disso, após a chamada do commit você poderá chamar o método que retorna o código criado para o objeto, essa dica por retirada do endereço:<br />
<br />
http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Identity_sequencing<br />
<br />
<br />
T+Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-55018486177298414042009-08-11T13:45:00.004-03:002010-06-05T20:31:46.666-03:00Icone para uma aplicação J2MEOpa... to vivo ainda... :-)<br />
<br />
Terminei um sistema de venda/ cancelamento de venda via celular utilizando um plano de dados da operadora de celular, e achei que o software merecia um ícone pra quando o usuário fosse acessá-lo, os passos pra fazer isso é o seguinte:<br />
<br />
1) Abra o seu projeto no Netbeans (meio óbvio...)<br />
2) Deixe a aba "Projetos" aberta<br />
3) Arraste a imagem para dentro do PACOTE do seu projeto, pra facilitar jogue pra dentro do mesmo pacote dos códigos fonte, o tamanho deve ser 12x12 , 15x15, vai depender do tipo de celular... e tem que ser PNG (na verdade não testei com outros formatos)<br />
4) Clique com o botão direito sobre o projeto e selecione a opção PROPRIEDADES<br />
5) Selecione a categoria "Descritor de aplicativos"<br />
6) Clique no botão "Adicionar"<br />
7) Preencha as propriedades:<br />
Nome: MIDlet-Icon<br />
Valor: /[nome_do_pacote]/[nome_da_imagem]<br />
<br />
É isso aí...<br />
<br />
Se alguém precisar e não conseguiu compreender me avisa que eu coloco as imagens.<br />
<br />
[]'sUnknownnoreply@blogger.com3tag:blogger.com,1999:blog-5873100793864609772.post-69777333848020716562009-03-25T15:16:00.004-03:002010-06-05T20:32:07.813-03:00Código java compilado?Sempre pensei na facilidade de decompilação de um arquivo jar criado em java, buscando uma solução pra isso acabei encontrado o gcj que compila um código java criando um executável sem chance de ser decompilado (ou pelo menos muuuuuuito mais difícil do que o jar), veja um exemplo:<br />
<br />
HelloWorld.java:<br />
<br />
public class HelloWorld {<br />
public static void main(String [] args) {<br />
System.out.println("Teste com java compilado para codigo nativo$<br />
}<br />
}<br />
<br />
<br />
Basta compilar assim (claro que o gcj tem que estar previamente instalado):<br />
gcj --main=HelloWorld -o HelloWorld HelloWorld.java<br />
<br />
<br />
Com isso será criado o arquivo HelloWorld com permissão de execução (no caso do Linux) e para executá-lo:<br />
./HelloWorld<br />
<br />
Seria interessante poder utilizar diretamente no NetBeans, pois geralmente um projeto em java não se limita a uma única classe e penso eu que se estiver dentro do NetBeans ele mesmo vai criar as condições necessárias para utilizar o gcj sem muito esforço, então encontrei a página http://wiki.netbeans.org/FaqGcj mas ainda não deu tempo de testar pra ver se realmente funciona.<br />
<br />
T+Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5873100793864609772.post-43860782718483949962009-03-06T09:13:00.006-03:002010-06-05T20:42:41.880-03:00Broken pipe: A SOLUÇÃO CORRETANão vou negar... quebrei muito a cabeça com esse problema em um sistema que recebe conexões via socket, o problema se dava quando ficava muito tempo se receber conexões, eis que acabava gerando o erro "Broken pipe"... e nada mais funcionava, a minha primeira tentativa (com sucesso) mas não muito elegante, pois poderia acarretar em outros problemas está no post:<br /><a href="http://netbeando.blogspot.com/2008/06/broken-pipe-conexo-com-socket-no-banco.html">http://netbeando.blogspot.com/2008/06/broken-pipe-conexo-com-socket-no-banco.html</a><br /><br />Bom, agora apresento a solução mais elegante...<br /><br />1) Para criar um pool de conexões com o banco, inclua no seu projeto a biblioteca c3p0 e faça a conexão dessa forma:<br /><br />ComboPooledDataSource cpds = new ComboPooledDataSource();<br />cpds.setDriverClass("com.mysql.jdbc.Driver");<br />cpds.setJdbcUrl("jdbc:mysql://localhost:3306/nome_base_dados");<br />cpds.setUser("usuario_banco");<br />cpds.setPassword("senha_usuario_banco");<br />cpds.setMinPoolSize(5);<br />cpds.setAcquireIncrement(5);<br />cpds.setMaxPoolSize(20);<br />cpds.setIdleConnectionTestPeriod(60);<br />cpds.setMaxStatements(0);<br />cpds.setInitialPoolSize(3);<br />cpds.setPreferredTestQuery("select 1");<br />cpds.setCheckoutTimeout(1000);<br /> <br />con = cpds.getConnection();<br /><br />Essas foram as configurações que eu utilizei para testes no meu tipo de sistema, pesquise sobre o c3p0 e veja quais serão as que se adaptam melhor ao seu problema.<br /><br />2) Por último, mas não menos importante, sete a propriedade do socket (server) que recebe as conexões do cliente:<br /><br />private static Socket conexao;<br />.<br />.<br />.<br />public static void main(String[] args) {<br />.<br />.<br />.<br /><span style="font-weight: bold;"> conexao.setKeepAlive(true);<br />.<br />.<br />.<br /></span>}<span style="font-weight: bold;"><br /><br /><br /></span>Fazendo esses 2 itens resolveu completamente o problema.<br /><br />Espero que ajude a você também...<br /><span style="font-weight: bold;"></span>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5873100793864609772.post-66334424229162176562008-06-05T07:04:00.007-03:002010-06-05T20:42:41.881-03:00Broken pipe na conexão com socket no banco de dadosBom, pra não perder o histórico do blog (já que realmente não costumo postar muito) vou deixar a solução digamos meio que "gambearristica" encontrada abaixo, mas que me resolveu o problema no momento e vou criar outro tópico sobre esse mesmo assunto, pois consegui resolver o problema de forma efetiva sem alterar qualquer configuração no banco de dados, a solução (ao meu ver mais correta) está nesse link: <a href="http://netbeando.blogspot.com/2009/03/broken-pipe-solucao-correta.html">http://netbeando.blogspot.com/2009/03/broken-pipe-solucao-correta.html<br /></a><br />Mas caso ela não resolva o seu problema, parta para algo mais radical como a solução abaixo:<br /><br />Fiquei muito tempo tentando descobrir como resolver um problema que ocorria todos os dias em um sistema que ficava aguardando conexões de clientes através de um socket, o problema é que como as conexões eram esporádicas, ou seja, ficavam as vezes mais de 10 horas sem receber conexão alguma e no momento que algum cliente tentava se conectar depois deste período de inatividade ocorria o erro no socket com a mensagem "broken pipe", bom, tentei resolver de várias formas, mas infelizmente por uma série de motivos a única forma que resolveu efetivamente foi aumentando o timeout do próprio banco de dados. No meu caso eu estou utilizando o mysql, então se você acessar o prompt do mysql e digitar:<br /><br />show variables<br /><br />Serão mostradas todas as variáveis utilizadas por esse banco de dados, a que realmente interessa é a:<br /><br />wait_timeout<br /><br />Inicialmente essa variável está definida para 28800 , li sobre o assunto e me parece que definindo como ZERO as conexões do banco de dados ficam sem timeout, acabei não optando por essa opção, simplesmente aumentei esse timeout para que ficasse a minha conexão ativa por mais de 12h mesmo sem inatividade, resolveu 100% o problema.<br /><br />Bom, agora você deve estar se perguntando como alterar o conteúdo desta variável, no meu caso, como o sistema operacional que esta instalado o sistema é um Linux, bastou acessar o arquivo /etc/mysql/my.cnf , editar com um editor de textos qualquer e trocar o valor da variável... claro tive que reiniciar o mysql depois.<br /><br />T+Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-4436025374604252502008-05-31T08:37:00.005-03:002010-06-05T20:43:28.096-03:00JPA x Alterações (externas) na base de dadosQuebrei a cabeça muito tempo por um problema que estava acontecendo em um sistema que utiliza JPA para conexão com o banco de dados, o que ocorria era o seguinte, existem 2 sistemas separados que conectam na mesma base de dados e fazem alterações, o problema era que um não conseguia visualizar as alterações do outro, ou seja, digamos que um dos sistema seja para autorização de vendas e verifique o saldo de determinado cartão e o outro sistema a cada mês retornava o limite de crédito para esse cartão assim ele continuaria comprando normalmente no novo mês, o caso é que o sistema que autoriza as vendas não conseguia vizualiar a alteração de restituição do saldo feita pelo outro sistema, então o cartão embora tivesse saldo, pro sistema de autorização continuava sem... depois eu notei acontecia o mesmo problema se eu alterasse os registros diretamente no banco de dados, os sistemas não conseguiam fazer os selects e trazer os dados atualizados.... eis a solução adotada:<br /><br />Nas classes das entidades mapeadas, bastou incluir um novo parâmetro nas namedqueries, coloquei em negrito esse novo parâmetro, veja como ficou um pedaço do código por exemplo:<br /><br />@Entity<br />@Table(name = "cartoes")<br />@NamedQueries({@NamedQuery(name = "Cartoes.findByCodigo", query = "SELECT f FROM Cartoes c WHERE c.codigo = :codigo", <span style="font-weight: bold;">hints=@QueryHint(name="toplink.refresh", value="true")</span>), @NamedQuery(...})<br /><br />public class Cartoes implements Serializable {...<br /><br />Notou o "<span style="font-weight: bold;">hints=@QueryHint(name="toplink.refresh", value="true")</span>"? Simples não?<br /><br />Porém, se você utilizou o createquery na "mão" poderia usar assim, por exemplo:<br /><br />Query query = this.entityManager.createQuery("SELECT c FROM EmpresasProdutos c WHERE c.empresa.codigo = :empresa AND c.tipo=:produto")<span style="font-weight: bold;">.setHint("toplink.refresh", "true")</span>;<br /><br />T+Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-16273613774374581452008-02-26T17:11:00.003-03:002010-06-05T20:32:45.115-03:00NetBeans 6.0.1 - Herança visualFinalmente existe a possibilidade de se conseguir fazer herança visual (dos forms) no NetBeans, não estou me referendo aos usuais templates que todos acabam mencionando... estou falando de herança mesmo, aquela que o Delphi oferece, ou seja, você cria um formulário padrão e depois herda as características deste formulário para outros, e quando você alterar o formulário padrão essas alterações são espelhadas nos seus "filhos", coisa que os templates não conseguem fazer.<br />
<br />
Bom, segui fielmente o que contém nesse link <a href="http://wiki.netbeans.org/FaqFormExtendingForms">http://wiki.netbeans.org/FaqFormExtendingForms</a><br />
<br />
Mas pra tentar simplificar vou colocar os passos abaixo:<br />
<br />
1) Crie um novo projeto<br />
2) Crie um formulário que será o nosso padrão, pode ser um JFrame por exemplo, de o nome de BaseForm para ele e insira um método que retorne o JPanel vazio como um container, como no exemplo abaixo:<br />
<br />
public Container getJPanel1() {<br />
return jPanel1;<br />
}<br />
<br />
3) Insira os componentes que serão modelos para todos os formulários filhos<br />
4) Insira um JPanel e deixe ele totalmente vazio<br />
5) Você vai precisar criar uma classe chamada BaseFormBeanInfo e que o extends dela seja de SimpleBeanInfo, como no exemplo abaixo:<br />
<br />
public class BaseFormBeanInfo extends java.beans.SimpleBeanInfo {<br />
//public final static Class beanClass = BaseForm.class;<br />
private BeanDescriptor beanDescriptor;<br />
<br />
public BaseFormBeanInfo() {<br />
super();<br />
}<br />
<br />
@Override<br />
public BeanDescriptor getBeanDescriptor() {<br />
if (beanDescriptor == null) {<br />
// BaseForm é o formulário padrão<br />
beanDescriptor = new BeanDescriptor(BaseForm.class);<br />
// getJPanel1 é o nome do método que retorna o JPanel vazio que está no BaseForm<br />
beanDescriptor.setValue("containerDelegate", "getJPanel1"); // g<br />
}<br />
return beanDescriptor;<br />
}<br />
}<br />
<br />
ATENÇÃO: O nome BaseFormBeanInfo não é por acaso, tem que seguir esse padrão, caso o seu formulário padrão se chamasse PadraoForm a classe BeanInfo iria se chamar PadraoFormBeanInfo.<br />
<br />
6) Compile o projeto<br />
7) Vamos criar o formulário filho a partir do BaseForm, para isso crie um formulário do tipo "Formulário Bean" (BeanForm) e quando for solicitada qual é a superclasse informe "BaseForm" (sem as áspas é claro).<br />
8) Pronto! Mas como nem tudo são flores, o que você vai visualizar no seu formulário filho é justamente aquele JPanel que foi inserido vazio na superclasse, é nele que você vai inserir os seus novos componentes, etc...<br />
<br />
Agora você deve estar se perguntando... mas se eu tenho um botão de ok no BaseForm e quero mudar o seu modo de funcionamento, como poderia alterar no meu formulário herdado o código definido no BaseForm? Muito simples, no evento de click do botão no BaseForm você poderia colocar a chamada de um método seu, por exemplo:<br />
<br />
cliqueOk();<br />
<br />
Esse método você deve declarar como sendo protected dessa forma você redefine ele na sua classe herdada e ele passa a executar o código novo, caso contrário ele executa o código que foi definido na superclasse.<br />
<br />
Se preferir faça download do projeto de exemplo <a href="http://www.hitechbrasil.com.br/downloads/je/HerancaVisual.zip">aqui</a>.<br />
<br />
[]´sUnknownnoreply@blogger.com10tag:blogger.com,1999:blog-5873100793864609772.post-5976480932412223682008-01-08T09:56:00.000-02:002010-06-05T20:33:07.977-03:00DropDown List com lista fixa não edita registroBom, acredito ter encontrado um bug no NetBeans 6.0, ou então não consegui configurar corretamente o meu dropdown em um projeto web, ao utiliza-lo com uma lista fixa de opção (não como FK de outra tabela) como por exemplo para controle de status de registros (A - Ativo, B - Bloqueado, etc...), ao se alterar a opção de um registro que já está cadastrado ele não cria o evento de alteração/edição do registro que está posicionado na tabela, ou seja, mesmo executando o código para salvar o registro o mesmo não é atualizado. Para resolver esse problema cliquei com o botão direito sobre o dropdown do meu formulário e selecionei a opção "Edit Event Handler" e inseri o código abaixo:<br /><br />getSession1().getClientesDataProvider().setValue("status", getSession1().getClientesDataProvider().getCursorRow(), event.getNewValue().toString());<br /><br />Esse código força a alteração do registro inserindo no campo status o valor selecionado no dropdown.<br /><br />T+Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-44307083069767920552008-01-05T09:15:00.000-02:002010-06-05T20:33:07.977-03:00Selecionando um item em um dropDown List em uma página JSPDigamos que você esteja querendo adicionar com dropDown com algumas opções para que o usuário selecione em alguma página de cadastro, por exemplo para controlar o status de um determinado cliente, então após criar a página JSP e inserir os objetos de acesso ao banco de dados, basta inserir o dropdown na página, clicar com o botão da direita sobre ele e configurar as opções default, feito isso clique novamente com o botão direito sobre o dropdown e selecione a opção Property Bindings..., nessa opção deverá ser selecionado 2 itens, o primeiro é o "items" que deve ser relacionado com a propriedade options do dropdown e a outra é a "selected" que deverá ser relacionada com o campo do rowset que deverá fazer o relacionamento.<br /><br />Pronto, assim quando você estiver utilizando a página JSP para editar um cadastro já inserido no banco de dados, o dropdown estará com o item corretamente selecionado.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-27846582644922348422007-12-06T20:20:00.000-02:002010-06-05T20:33:07.978-03:00Chamar um programa externoPara fazer a chamada de um programa faça assim:<br /><br />// Chama o firefox e passa como parâmetro uma página inicial<br /> try {<br /> Runtime.getRuntime().exec("firefox http://netbeando.blogspot.com");<br /> } catch (IOException ex) {<br /> System.out.println("Erro!"); <br /> }<br /><br />Bom, pelo menos fazendo assim no Linux funciona :-)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-17850090706354302062007-12-06T14:47:00.000-02:002010-06-05T20:43:45.012-03:00Maneira simples de adicionar ano(s) em uma dataUma forma bem simples de adicionar "n" anos a uma data é utilizando a rotina abaixo de uma classe estática, por exemplo:<br /><br /><br />// Classe estática<br /><span style="font-family:courier new;">public class Utilitarios {</span><br /><span style="font-family:courier new;"> public static Date addYears(Date date, int years) {</span><br /><span style="font-family:courier new;"> Calendar newDate = Calendar.getInstance();</span><br /><span style="font-family:courier new;"> newDate.setTime(date);</span><br /><span style="font-family:courier new;"> newDate.add(Calendar.YEAR, years);</span><br /><span style="font-family:courier new;"> return newDate.getTime();</span><br /><span style="font-family:courier new;"> }</span><br /><span style="font-family:courier new;">}</span><br /><br />E a utilização dentro de uma classe sua fica algo do tipo:<br /><br />Utilitarios.addYears(new Date(), 5);<br /><br />Dessa forma foram adicionados 5 anos na data de hoje.<br /><br />[]´sUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-21971125857039866342007-12-06T01:50:00.000-02:002010-06-05T20:44:53.454-03:00NetBeans 6.0 (versão final, até a próxima...)No dia 03/12/2007 foi liberada a versão 6.0 do NetBeans, finalmente, estava esperando por ela desde o início do ano... como a paciência foi pouca acabei utilizando as betas e as releases candidates, com alguns pequenos bugs mas sem maiores problemas.<br /><br />Acabei de baixar essa versão e instalar, o instalador (desde a RC 1) ficou realmente muito bom, agora você pode baixar a versão full e instalar apenas o que utiliza realmente e se futuramente precisar utilizar outro pacote basta executar novamente o instalador e selecionar o pacote necessário.<br /><br />No meu caso ele já reconheceu que o Glassfish estava instalado e não reinstalou, perfeito.<br /><br />De resto, tudo funcionando a contento, abri os meus projetos nessa versão e todos foram executados sem problemas.<br /><br />Agora é só aproveitar o bean binding que tá show de bola.<br /><br />Uma coisa interessante é que utilizo o NetBeans no Ubuntu 7.10, na RC 1 e RC 2 ocorreram vários problemas em telas que possuiam JCombobox, no site netbeans.org existia um chamado aberto informando do problema, mas pelo que eu me lembro o técnico informou que era relacionado apenas com o Ubuntu e que não se tratava de um problema específico do NetBeans, bom, não sei se eles acabaram arrumando no NetBeans mesmo julgando que o problema não era com eles, só sei que agora está funcionando sem problemas. Nas RC1 e RC2 para contornar esse problema eu acabei executando o NetBeans com o parâmetro "--ui javax.swing.plaf.metal.MetalLookAndFeel", isso faz com que seja mudada a aparência da IDE, resolveu o problema dos JCombobox nessas versões, agora, acabei deixando esse parâmetro na chamada do NetBeans porque me acostumei com o visual :-) acho até que melhorou a quantidade de informações que se consegue visualizar na tela, pois me parece que a fonte utilizada é menor.<br /><br />T+Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5873100793864609772.post-76817816642870179392007-12-01T23:07:00.000-02:002010-06-05T20:43:05.225-03:00Mensagem: detached entity passed to persistEssa mensagem estava ocorrendo em um formulário utilizando JPA TopLink, sempre que eu tentava inserir um segundo registro em sequencia, procurando por uma solução encontrei a seguinte:<br /><br />http://javanotepad.blogspot.com/2007/05/ive-found-bug-in-hibernate.html<br /><br />Se você está com preguiça de ler eu vou resumir :-)<br /><br />O problema ocorre porque após ocorrer algum problema ao tentar salvar o registro o sistema tenta persistir o mesmo objeto persistido anteriormente, pra mim resolveu inserindo a linha que está em negrito:<br /><br /> Funcionarios f = new admconvenios.Funcionarios();<br /> entityManager.persist(f);<br /> <span style="font-weight:bold;">f.setCodigo(null); </span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5873100793864609772.post-27415390616432173272007-11-30T09:57:00.001-02:002010-06-05T20:35:03.374-03:00Criar formulário com Jtable populado de uma classe com JPA1.Criar o Jframe (ou similar)<br /> 2.Inserir o Jtable<br /> 3.Inserir o componente EntityManager<br /> 4.Inserir o componente Query, relacionar com o EntityManager inserido anteriormente e preencher a propriedade query com o select no formato jpa, exemplo: SELECT c FROM Clientes c<br /> 5.Inserir o componente List e relacionar com o componente Query, marque também a propriedade Observable como true<br /> 6.Selecione a opção Bind/Elements do Jtable (clicando com o botão direito sobre o componente)<br /> 7.Na opção Bind Source relacione com o componente List e clique no botão Ok<br /> 8.Clique novamente com o botão direito sobre o Jtable e selecione a opção Table Contents, na guia Table Model com a opção Bound selecionada, relacione o campo Bind Source com o componente List<br /> 9.Acesse a guia Columns e adicione as colunas necessárias, informando no campo Expression da seguinte forma, exemplo: ${codigo} ou ${nomeCompleto}, o nome do campo segue o mesmo padrão utilizado pelo JPA, clique no botão Close.<br /><br />E caso você ainda não saiba, pode dar um get dos dados persistidos assim:<br /><br />int codigo = ((Clientes)list1.get(jTable1.getSelectedRow())).getCodigo();<br />String nomeCompleto = ((Clientes)list1.get(jTable1.getSelectedRow())).getNomeCompleto();Unknownnoreply@blogger.com9