quinta-feira, 12 de agosto de 2010

PgAdmin relocation error no Ubuntu

Hoje, ao tentar abrir o PgAdmin, percebi que a tela de boas vindas aparecia e sumia rapidamente. Ao executar pgadmin3 no terminal, veio a seguinte mensagem de erro:

pgadmin3: relocation error: pgadmin3: symbol _ZN21wxMemoryFSHandlerBase19AddFileWithMimeTypeERK8wxStringPKvjS2_, version WXU_2.8 not defined in file libwx_baseu-2.8.so.0 with link time reference


Pesquisando por aí (ou melhor, neste fórum), achei a seguinte solução:

  1. Abra o terminal e digite:
  2. apt-get source pgadmin3
  3. sudo apt-get install debhelper libpq-dev libwxgtk2.8-dev libxml2-dev libxslt1-dev autotools-dev
  4. cd pgadmin3-1.10.2
  5. dpkg-buildpackage
  6. Vá tomar um café, isso demora.
  7. sudo dpkg -i ../pgadmin3_1.10.2-1_i386.deb

E pronto, agora o seu PgAdmin agora estará funcionando novamente \o/ (bem, pelo menos o meu está ;) )

sexta-feira, 5 de março de 2010

Criando Jar no Netbeans sem a pasta lib

Olá, povo

À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 "lib", 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.

Para criar um arquivo Jar único, basta seguir estes passos:

1) Mude para a visão de visualização de arquivos;
2) Localize (e abra ;) o arquivo build.xml;
3) Insira o seguinte trecho de código no final do arquivo, antes da tag </project>


<target name="package-for-store" depends="jar">
<property name="store.jar.name" value="NOME_DO_SEU_PROJETO"/>


<!-- don't edit below this line -->

<property name="store.dir" value="store"/>
<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

<echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

<delete dir="${store.dir}"/>
<mkdir dir="${store.dir}"/>

<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
<zipgroupfileset dir="dist" includes="*.jar"/>
<zipgroupfileset dir="dist/lib" includes="*.jar"/>

<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>

<zip destfile="${store.jar}">
<zipfileset src="${store.dir}/temp_final.jar"
excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
</zip>

<delete file="${store.dir}/temp_final.jar"/>

</target>


4) Troque, na segunda linha, a string "NOME_DO_SEU_PROJETO" para o nome do seu projeto (que está na segunda linha do "build.xml"; Salve o arquivo;
5) Selecione a opção "Clean and rebuild" (Limpar e construir). Certifique-se que o Netbeans criou a pasta "dist", contendo o jar da sua aplicação e a pasta "lib";
6) Clique com o botão direito sobre o arquivo "build.xml", selecione a opção "Run target" (executar destino), "Other targets" (Outros destinos) e a seguir "package-for-store".

Se tudo der certo (rezar é bom nessas horas), o NetBeans irá gerar uma pasta chamada "store", contendo um único arquivo Jar bonitinho, fofo, meigo e pronto pra ser distribuído por aí :D

É isso, té o/


Fonte

sexta-feira, 12 de fevereiro de 2010

KeyListener global no Java

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.

A solução pra isso? Adicionar KeyListeners nos componentes e em seus filhos, recursivamente! Eis como:

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):


private void addKeyAndContainerListenerRecursively(Component c) {
try {
c.addKeyListener(this);
if (c instanceof Container) {
Container cont = (Container) c;
cont.addContainerListener(this);
Component[] children = cont.getComponents();
for (int i = 0; i < children.length; i++) {
addKeyAndContainerListenerRecursively(children[i]);
}
}
} catch (Exception e) {
//Anuncie Aqui
}
}



2) Fazemos o JFrame implementar dois Listeners, o KeyListener e o ContainerListener:


public class MeuJFrameLegal extends JFrame implements KeyListener, ContainerListener {
//...
}


3) Temos que implementar as seguintes funções:


public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public void componentAdded(ContainerEvent e) {}
public void componentRemoved(ContainerEvent e) {}


4) Na função keyPressed, colocamos nosso código legal e mágico:


public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_F1:
System.out.println("Parabéns, você pressionou F1");
break;
}
}


5) E pronto! Agora basta chamar a função addKeyAndContainerListenerRecursively no final do seu método de inicialização da parte gráfica (aquele que a gente adiciona os componentes ao Componente).


"Mas tio Preco, pra que serve o ContainerListener???"

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:


public void componentAdded(ContainerEvent e) {
addKeyAndContainerListenerRecursively(e.getContainer());
}


E pronto (de novo)! Agora todas as janelas que a janela pai chamar "herdarão" o Listener \o/



É isso, té o/

(Fonte: Java World)

terça-feira, 2 de fevereiro de 2010

Alterando senha do firebird windows vista e windows 7

Estava com problema para alterar a senha do SYSDBA no firebird no windows 7.

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

O erro:

Cannot attach to services manager
user name and password are required while attaching to the services manager
unable to open database

A solução:

colocar o parametro -database "localhost:C:\Program Files\Firebird\Firebird_2_0\security2.fdb" no comando e voila




terça-feira, 24 de novembro de 2009

Problemas com o Subversion no Netbeans dentro do Ubuntu

Às vezes, quando se está usando a ferramenta do Subversion (SVN) embutida no Netbeans, aparece a seguinte mensagem:

"GNOME Keyring is locked and we are non-interactive"

E isso quer dizer o quê? Quer dizer que o Gnome do Ubuntu 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 :(

Pra resolver isso, edite o arquivo "~/.subversion/config" (abra o terminal e digite "nano ~/.subversion/config"), adicionando logo abaixo do marcador "[auth]" a seguinte linha:

password-stores =


... E pronto! Agora é só reiniciar a bagaça e sair pro abraço \o/

(reiniciar a bagaça = reiniciar a sessão ¬¬)

Té o/

quarta-feira, 9 de setembro de 2009

Remover beep chato no Ubuntu

É meio chato ficar escutando um beep no buzzer, cada vez que você aperta uma tecla "backspace" 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 modprobe, assim:

eu@eu:~$ echo "blacklist pcspkr" | sudo tee -a /etc/modprobe.d/blacklist

...e pronto. Fim do barulho chato.

É necessário reiniciar o Ubuntu, ou recarregar o modprobe:

eu@eu:~$ sudo modprobe -r pcspkr

Abraços \o/

(Fonte: Alex S.)

quarta-feira, 1 de julho de 2009

Como encerrar sua aplicação Java

Existem diversas formar de encerrar sua aplicação. E às vezes é preciso que algo seja feito antes 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 windowClosing do AWT na janela principal do programa. No entanto, existe um método mais eficiente (e garantido) de fazer isso.

A Máquina Virtual do Java (JVM) se desliga de dois jeitos diferentes: Do jeito normal e bonitinho System.exit(); (ou quando a última Thread ativa do programa termina sua execução) OU do modo abrupto (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.

O Runtime da JVM possui um método chamado addShutdownHook(Thread t), que, resumindo, vai fazer o seguinte: A Thread t 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 run(), antes do juízo final :)

Para evitar que sua aplicação termine sem que determinado processamento necessário seja feito, basta fazer o seguinte:

1) Criar uma classe, herdando de Thread. Dentro dessa classe, no método run(), deverá haver o código que você quer processar anter da finalização.


private class ShutdownInterceptor extends Thread {
public void run() {
//Aqui você diz adeus.
System.out.println("Por que você me abandona? Sentirei saudades.");
}
}


2) Dentro de sua aplicação, insira o seguinte código, indicando à JVM que você quer colocar sua classe bonitinha no shutdownHook:


ShutdownInterceptor shutdownInterceptor = new ShutdownInterceptor();
Runtime.getRuntime().addShutdownHook(shutdownInterceptor); // <- Mágica


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.


[]'s

Fontes:

quarta-feira, 10 de setembro de 2008

Trocando caracteres especiais no Java

Oi povo.

Já vi muita gambiarra envolvendo replace e tals, pra trocar caracteres especiais no Java (fazer isso "Tralalá" virar isso "Tralala"). 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 */


public static String formatString(String s) {
String temp = Normalizer.normalize(s, java.text.Normalizer.Form.NFD);
return temp.replaceAll("[^\\p{ASCII}]","");
}


Abraço, povo o/

quarta-feira, 3 de setembro de 2008

Disparando eventos no JTextField

Oi povo,

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.
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.

A solução pra isso é usar o bom e velho DocumentListener! \o/

Exemplo: busca produto pelo código digitado


JTextField textField = new JTextField();
textField.getDocument().addDocumentListener(new DocumentListener(){
public void changedUpdate(javax.swing.event.DocumentEvent e) {
// Anuncie aqui! Viu como funciona?
}
public void insertUpdate(DocumentEvent e) {
buscaProdutoPorCodigo(textField.getText());
}
public void removeUpdate(DocumentEvent e) {
buscaProdutoPorCodigo(textField.getText());
}
public void buscaProdutoPorCodigo(String codigoStr){
try{
int codigo = Integer.parseInt(codigoStr);
// busca o produto no banco;
// pega o produto e exibe no lugar certo;
} catch (NumberFormatException nfex) {
// exibe mensagem dizendo que o código é inválido.
}
}
});


Explicando:
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.
O insert é disparado quando algum texto é inserido no componente.
O remove é disparado quando algum texto é removido do componente.
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 ).

Té mais, povo o/

terça-feira, 24 de junho de 2008

Como alterar a fonte padrão do Java

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/
Eis como:


public static void setUIFont (Font f){
Enumeration<Object> keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get (key);
if (value instanceof Font)
UIManager.put (key, f);
}
}
...
//Dentro do main...
setUIFont(new Font("Dialog", Font.BOLD, 14));


Em suma, ele vai percorrer todos os elementos do UIManager, e alterar a fonte de um por um...

Dá pra alterar a fonte de um componente em particular:


UIManager.put("Label.font", new Font("Serif",Font.ITALIC,12));


Peguei daqui Real How To

o/ Té mais!