Fechar frame e desabilitar eventos

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)

Obrigado!

tente com isso:

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_EXIT);

[quote=yhhik]tente com isso:

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_EXIT); [/quote]

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!

coloca seu código que tem algo errado.

fiz um um rápido aqui e tá funcionando.
da uma olhada:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


public class telaPrincipal extends JFrame{
	
	public telaPrincipal(){
		
		this.setLayout(new FlowLayout());
		JButton botao=new JButton("opá");
		botao.addActionListener(
		new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				new janela().setVisible(true);
			}
		}
		
		);
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.add(botao);
		this.setSize(200,200);
	}
	
	public static void main(String[] args) {
	
		new telaPrincipal().setVisible(true);
	}

	
}
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
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();
			}
		}
	}

	public void keyTyped(KeyEvent ek) {
	}

	public void keyReleased(KeyEvent ek) {
	}

}

[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…

então colega veja:

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);
    }

colega não conheço esse AWTEvent.
pensei que estava usando KeyEvent

é so instanciar a classe:

[code]public class telaPrincipal extends JFrame{

public telaPrincipal(){
	
	this.setLayout(new FlowLayout());
	JButton botao=new JButton("opá");
	botao.addActionListener(
	new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			
			new janela().setVisible(true);//--------------estou abrindo frame janela
		}
	}
	
	);
	
	this.add(botao);
	this.setSize(200,200);
}

public static void main(String[] args) {

	new telaPrincipal().setVisible(true);
}

}[/code]

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.

Se você quer criar teclas de atalho, o jeito correto é com o ActionMap e KeyMap:
http://www.guj.com.br/java/47289-actionlistener-x-keylistener#258583

Os listeners não servem para esse caso, pois eles só disparam no componente que tem o foco.

Aqui tem mais um exemplo do uso desses caras:
http://www.guj.com.br/java/140986-como-acionar-os-bots-de-uma-calculadora-atrav-do-teclado

[quote=ViniGodoy]Aqui tem mais um exemplo do uso desses caras:
http://www.guj.com.br/java/140986-como-acionar-os-bots-de-uma-calculadora-atrav-do-teclado[/quote]

legal vini, mas como pego o f1,f2…usando isso?? ví lá q vc pegou os numericos de cima e os do teclado numerico…

E valeu pela ajuda!

Exatamente do mesmo jeito. Ao invés de passar “1” no getKeyStroke, passe “F1”