Olá galera!
Quando fecho meu frame com dispose(), os eventos ainda continuam funcionando. Eu fiz um método q identifica as teclas F1,F2…,F12. funciona beleza, mas quando fecho a tela (no caso é uma tela de vendas), os eventos ainda são acionados quando a tela esta fechada, se apertar f2 por exemplo, ainda chama a lista q coloquei pra chamar, etc…
Alguem sabe como resolver isso?
pensei em : identificar se a janela esta aberta, a aí chamar o evento…(mas não cosegui)
fechar a janela de outra maneira sem sr o dispose(mas não vira)
Deu não brother…esse evento eu to usando como se fosse um botão fechar, só q é chamado por uma tecla…esse q vc passou é das propriedades do frame, o proprio netbeans tem isso…Valeus!
yhhik
coloca seu código que tem algo errado.
fiz um um rápido aqui e tá funcionando.
da uma olhada:
importjava.awt.FlowLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyListener;importjava.awt.event.KeyEvent;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JOptionPane;publicclassjanelaextendsJFrameimplementsKeyListener{publicjanela(){this.setLayout(newFlowLayout());addKeyListener(this);setSize(200,200);}publicvoidkeyPressed(KeyEventek){if(ek.getKeyCode()==KeyEvent.VK_F9){intselectedOption=JOptionPane.showConfirmDialog(this,"Deseja Sair Realmente?","Atenção",JOptionPane.YES_NO_OPTION);if(selectedOption==JOptionPane.YES_OPTION){dispose();}}}publicvoidkeyTyped(KeyEventek){}publicvoidkeyReleased(KeyEventek){}}
nathanRayden
yhhik:
coloca seu código que tem algo errado.
fiz um um rápido aqui e tá funcionando.
da uma olhada:
public void keyPressed(KeyEvent ek) {
if (ek.getKeyCode() == KeyEvent.VK_F9) {
int selectedOption = JOptionPane.showConfirmDialog(this,
"Deseja Sair Realmente?", "Atenção",
JOptionPane.YES_NO_OPTION);
if (selectedOption == JOptionPane.YES_OPTION) {
dispose();
}
}
}
public void keyTyped(KeyEvent ek) {
}
public void keyReleased(KeyEvent ek) {
}
}
isso, o q to fazendo é como essa parte do seu código…o cenario é o seguinte: tem um menu, q chama a tela de venda na barra de menu…aí ao chamar a tela de venda e usar, depois fecho ela. aí fica só o menu aberto…mas se aperto as teclas ‘F’, os eventos q coloquei nelas ainda funcionam…to fechando a tela com closeOparatiob tb…desse jeito mesmo…
yhhik
então colega veja:
importjava.awt.FlowLayout;importjava.awt.event.KeyListener;importjava.awt.event.KeyEvent;importjavax.swing.JFrame;importjavax.swing.JOptionPane;publicclassjanelaextendsJFrameimplementsKeyListener{publicjanela(){this.setLayout(newFlowLayout());addKeyListener(this);setSize(200,200);}publicvoidkeyPressed(KeyEventek){if(ek.getKeyCode()==KeyEvent.VK_F9){intselectedOption=JOptionPane.showConfirmDialog(this,"Deseja Sair Realmente?","Atenção",JOptionPane.YES_NO_OPTION);if(selectedOption==JOptionPane.YES_OPTION){dispose();}}if(ek.getKeyCode()==KeyEvent.VK_F1){JOptionPane.showMessageDialog(null,"vc pediu ajuda?");}if(ek.getKeyCode()==KeyEvent.VK_F5){inta=2;intb=7;doubled=Math.sqrt((b-a)+(a*2));JOptionPane.showMessageDialog(null,a*9+45*b/2*d);}}publicvoidkeyTyped(KeyEventek){}publicvoidkeyReleased(KeyEventek){}}
o mesmo exemplo de antes … só que agora tem três eventos diferentes em três teclas f1, f5 e f9.
quando fecho a janela com o dispose os eventos tbm desaparecem.
se vc fechar e apertar as teclas na outra tela nao vai acontecer nada.
deve ter algo errado no seu codigo.
nathanRayden
gostei do jeito q fez… mas como chamo esse método no construtor? q parametro eu passo pra ele? dah dando erro pra chamar aki…
O jeito q eu tava fazendo:
publicfinalvoideventosTeclado(){// TECLAS DE ATALHOEventQueuequeue=newEventQueue(){@OverrideprotectedvoiddispatchEvent(AWTEventevent){super.dispatchEvent(event);Stringa[];Stringtecla[];if(!event.paramString().equals("")){if(event.paramString().substring(0,5).equals("KEY_P")){a=event.paramString().split(",");tecla=a[1].split("=");switch(Integer.parseInt(tecla[1])){case112://F1// new ListaProdutos1(fabricaDeEntidades, gerenciador).setVisible(true);break;case113://F2if(modelo.getRowCount()!=0){newFinalizador(fabricaDeEntidades,gerenciador).setVisible(true);}break;case114://F3excluirProduto();break;case115://F4cancelarVenda();break;case116://F5break;case117://F6break;case118://F7break;case119://F8break;case120://F9break;case121://F10gbreak;case122://F11break;case123://F12break;case27://ESCsairTela();break;default:break;}}}}};Toolkit.getDefaultToolkit().getSystemEventQueue().push(queue);}
yhhik
colega não conheço esse AWTEvent.
pensei que estava usando KeyEvent
então, estou usando awt, não keyevent pq não estou dando esse evento a um botão…com o awt, onde eu estiver na tela, mesmo q assim q abir, se eu apertar f1 ele vai chamar minha janela…
fiz assim como vc falou, mas não funcionou lembrando q estou usando o netbeans
O seu problema está justamente em usar o System Event Queue.
O método que você mostrou é amplo demais, e captura absolutamente todos os eventos do Swing.