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