Tenho um frame, que tem um painel, ao qual tem tres botões. Como colocar um evento "global", que funcione mesmo com o foco em outro componente. Vejamos:
Um desses três botões, no caso o terceiro, tem a função de encerrar o programa, ou o frame. Quando o frame está em execução o focu é colocado no primeiro botao do painel, onde so consigo colocar um evento pra esse botao, ou seja, teria que colocar os eventos dos três botões nos três botões, mas precisamente um evento de pressionar uma tecla e executar a ação, pressionando ESC para encerrar o frame por exemplo, que seria o evento do terceiro botão.
Como faço para colocar um evento que seja executado independentemente de onde esteja o focu? Mesmo se o focu estiver no primeiro botao e eu pressionar ESC executar o evento relativo ao terceiro botao, ou seja, como colocar eventos que sejam executados em qualquer componente do frame ou painel? Sem ter q colocar esses eventos em cada componente... Obrigado!
Olá colega Zakim! Me parece que vc não entendeu a minha necessidade… Eu consigo colocar eventos em componentes, mas eu quero colocar eventos que serão executados independentemente de em qual componente eu esteja. Uma tecla de atalho para encerrar o programa por exemplo, quero que funcione em qualquer lugar que eu esteja, ou em qualquer componente, mas obvio que sem colocar esse evento em cada componente. Valeu pela ajuda!
Caro colega fabiofalci, ainda sou meio iniciante mas fui pesquisando na API e entendi um pouco o seu código. Implementei e funcionou mais ou menos, apesar de que cada tecla ou o mouse disparava o evento varias vezes . Pelo que entendi coloca-se um evento na janela, que tipo que intercepta o evento do componente. O problema é que preciso filtrar por tecla, tipo se pressionar f1 executa isso, ou se pressionar f2 executa aquilo, ou se pressionar esc encerra. Só que me parece com esse tipo de evento não tem como fazer isso…? Tipo como é usado no KeyEvent:
Caro Colega Zakim,
Obrigado pela ajuda! Mas me parece não ser exatamente o que quero. Pelo que entendi vc me forneceu uma maneira de acessar o método referente aos eventos de qualquer lugar, através de herança. Porém eu continuo tendo que colocar eventos em todos os componentes…
Eu tenho um frame, que tem um painel, ao qual tem tres botões. O botao1 e o botao2, fazem tarefas especificas, o botao3 encerra o programa. O botao1 usa a tecla f1 para atalho, o botao 2 a f2 e o botao 3 a esc.
Quando o frame esta executando, o focu vai automaticamente para o botao1. E se eu quiser teclar esc e sair do programa? lembrando que o focu esta no botao1. Eu posso colocar o evento relacionado no botao1. Entao eu terei q colocar todos os eventos em todos os botoes!!
O que eu quero é colocar somente o evento relativo a cada botao respectivo, por exemplo, o botao1 vai escutar a tecla de atalho que executa a acao referente a ele, mas se eu teclar esc com o focu nele, tem q encerrar o programa, que é a açao referente ao botao3. Entao precisa-se de um evento que seja “disparado” indepentemente de em qual componente, nesse caso os botoes, que esteja.
Como eu já disse, pode dar um jeitinho, é só colocar todos os eventos em todos os botoes, que nesse caso sao só 3. Mas se pegarmos algum com 20 componentes? Vai querer colocar em todos? Não seria eficaz…
Pode fazer outra gambiarra tbm, é só nao permitir o focu pros botoes, e colocar o evento no painel, mas ai nao tem como acessar a tarefa através do enter… Obrigado! Alguma ajuda?
por padrão, você quer que o ESC seja para sair e o ENTER para outra coisa e assim por diante …
Então uma das opções que pensei foi criar templates que ja vem com este evento definido!
Então quando você criar uma tela de cadastro por exemplo, você vai utilizar esse template que ja vem os eventos basicos como padrão!
Crie um template com todos os componentes em comum de suas telas.
Poderá criar a sua propria frame o dialog tbm(Seus próprios componentes swing)! Dessa forma quando vc cria uma tela que herde o seu dialog ou frame, o evento ja vem adicionado na superclasse!
Colega Zakim,
O problema não é criar os mesmos eventos em varios frames, eu só usarei um frame com esses eventos, mas sim criar eventos que sejam disparados independentemente de em qual componente do frame ao qual esteja com o focu.
Imagine um frame com 20 componentes, 10 textfield e 10 botoes. Eu quero teclar esc nesse frame e encerrar o programa, independentemente de em qual componente esteja com o focu, lembrando que se colocar um evento, de escuta de tecla por exemplo, em um componente especifico, obvio que ele só será disparado se esse componente estiver com o focu. Agora vai se colocar o evento que escuta se a tecla foi pressionada em cada um dos 20 componentes? Colocar 20 eventos? Nao dá…
O problema é colocar um evento que seja “disparado” toda vez que eu teclar esc no frame, com o focu em qualquer um dos 20 componentes do frame. Ok!? Alguma ajuda? Obrigado!
O que quiz dizer é para vc criar o seu proprio componente swing que nasce com esse evento!
Então, quando você criar uma tela que estenda a sua tela, vc tera o evento nativo!
Ex:
public class MinhaTela extends JFrame implements keyListener{
public MinhaTela(){
addKeyListener(this); //mais o menos isso ai
}
//crie todos os eventos que serao nativos de seu frame
}
utilizando o seu componente :
public class TelaCadastro extends MinhaTela{
//pronto, vc tem uma tela com eventos nativos.... independente de qualquer coisa ou numero de botoes!
//ela ira responder ao evento da superclasse MinhaTela
}
Tem como vc criar o seu componente e adicionar ele a paleta do netbeans! De uma pesquisa sobre isso que tudo será mais facil!
Mark_Ameba,
Funciona, mas não consigo filtrar o evento por teclas, ou seja, qualquer tecla pressionada dispara o evento, inclusive o tab. Tem q ser uma tecla especifica, tipo o esc encerra o programa. Alguma ajuda em como fazer isso? Obrigado!
Olá Zakim! Implementei a sua ideia mas nao deu certo…
[code]import java.awt.event.*;
public class frame1 extends javax.swing.JFrame implements KeyListener{
public frame1() {
addKeyListener(this);
}
public void keyReleased(java.awt.event.KeyEvent e){
System.out.println("Released");
}
public void keyPressed(KeyEvent e){
System.out.println("Pressed");
}
public void keyTyped(KeyEvent e){
System.out.println("Typed");
}
}
public class frame2 extends frame1 {
public static void main(String args[]) {
new frame2().setVisible(true);
}
}[/code]
Se nao incluir nenhum componente no frame2, dispara os eventos do teclado, lembrando que dessa forma o focu esta no frame.
Mas se incluir algum componente nesse frame, nao dispara, uma vez que o focu vai pra esse componente...
Eu fiz algo errado? Obrigado!
Alguém tem alguma ajuda? Obrigado!