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!
[quote=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) {
}
}
[/quote]
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…
import java.awt.FlowLayout;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class janela extends JFrame implements KeyListener {
public janela() {
this.setLayout(new FlowLayout());
addKeyListener(this);
setSize(200, 200);
}
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();
}
}
if (ek.getKeyCode() == KeyEvent.VK_F1) {
JOptionPane.showMessageDialog(null, "vc pediu ajuda?");
}
if (ek.getKeyCode() == KeyEvent.VK_F5) {
int a = 2;
int b = 7;
double d = Math.sqrt((b - a) + (a * 2));
JOptionPane.showMessageDialog(null, a * 9 + 45 * b / 2 * d);
}
}
public void keyTyped(KeyEvent ek) {
}
public void keyReleased(KeyEvent ek) {
}
}
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.
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:
public final void eventosTeclado() {
// TECLAS DE ATALHO
EventQueue queue = new EventQueue() {
@Override
protected void dispatchEvent(AWTEvent event) {
super.dispatchEvent(event);
String a[];
String tecla[];
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])) {
case 112: //F1
// new ListaProdutos1(fabricaDeEntidades, gerenciador).setVisible(true);
break;
case 113: //F2
if (modelo.getRowCount() != 0) {
new Finalizador(fabricaDeEntidades, gerenciador).setVisible(true);
}
break;
case 114: //F3
excluirProduto();
break;
case 115: //F4
cancelarVenda();
break;
case 116: //F5
break;
case 117: //F6
break;
case 118: //F7
break;
case 119: //F8
break;
case 120: //F9
break;
case 121: //F10g
break;
case 122: //F11
break;
case 123: //F12
break;
case 27: //ESC
sairTela();
break;
default:
break;
}
}
}
}
};
Toolkit.getDefaultToolkit().getSystemEventQueue().push(queue);
}
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
public static void KeyPressed(KeyEvent ek){
if(ek.getKeyCode()==KeyEvent.VK_F1){
new ListaProdutos1(fabricaDeEntidades, gerenciador).setVisible(true);
}
}
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.