Fechar Janela JFrame através de combinação de teclas

Olá,
eu possuo uma aplicação que possui inúmeras janelas e gostaria de saber como utilizar uma combinação de teclas para fechar somente a janela na frente do usuário no momento (por exemplo, CTRL_MASK + VK_W).
Seria como um keystroke que tem para os jmenuitens, mas não encontrei nada na web após exaustiva pesquisa.
Alguém, por favor, sabe como fazer isso? Tem como associar esse tipo de evento a um JFrame?

Agradecido.

Boa Noite
Para a combinação de teclas veja este link.
http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

Espero que ajude!

Olá, andei fazendo pesquisas e encontrei a solução. Agradeço quem buscou ajudar e compartilho a solução com os demais do grupo.
Atenciosamente.

[code]import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

/**
*

  • @author Modificado por Bulhufas. Copiado e modificado de exemplo na internet.

  • @version 09/05/2011
    */
    public class Exemplo extends JFrame {

    private static final long serialVersionUID = 54518510L;
    private StringBuilder ACAO_OK = new StringBuilder(“Acao OK”);
    private StringBuilder ACAO_CANCELAR = new StringBuilder(“Acao CANCELAR”);
    private StringBuilder ACAO_AJUDA = new StringBuilder(“Acao AJUDA”);
    private StringBuilder ACAO_FECHAR = new StringBuilder(“Acao FECHAR”);

    /**
    *
    */
    public Exemplo() {
    Action okAction = new MessageAction(“OK”, ACAO_OK.toString());
    Action cancelAction = new MessageAction(“Cancelar”, ACAO_CANCELAR.toString());
    Action helpAction = new MessageAction(“Ajuda”, ACAO_AJUDA.toString());
    Action closeAction = new MessageAction(“Fechar”, ACAO_FECHAR.toString());
    JButton okButton = new JButton(okAction);
    Container container = getContentPane();
    container.setLayout(new FlowLayout());
    container.add(new JTextField(25));
    container.add(okButton);
    container.add(new JButton(cancelAction));
    getRootPane().setDefaultButton(okButton);
    getRootPane().getActionMap().put(“ok”, okAction);
    getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), “ok”);
    getRootPane().getActionMap().put(“close”, closeAction);
    getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_MASK), “close”);
    getRootPane().getActionMap().put(“cancel”, cancelAction);
    getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), “cancel”);
    getRootPane().getActionMap().put(“help”, helpAction);
    getRootPane().getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), “help”);
    setSize(600, 500);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    /**
    *
    */
    private class MessageAction extends AbstractAction {

     private static final long serialVersionUID = 51891315L;
     private String mensagem;
    
     MessageAction(String name, String msg) {
         putValue(NAME, name);
         mensagem = msg;
     }
    
     /**
      *
      * @param evt
      */
     @Override
     public void actionPerformed(ActionEvent evt) {
         if (mensagem.equalsIgnoreCase(ACAO_OK.toString())) {
             doOKAction();
         } else if (mensagem.equalsIgnoreCase(ACAO_FECHAR.toString())) {
             doFecharAction();
         } else if (mensagem.equalsIgnoreCase(ACAO_CANCELAR.toString())) {
             doCancelarAction();
         } else if (mensagem.equalsIgnoreCase(ACAO_AJUDA.toString())) {
             doAjudaAction();
         }
     }
    

    }

    /**
    *
    */
    private void doOKAction() {
    JOptionPane.showMessageDialog(Exemplo.this, “ACAO OK”);
    }

    /**
    *
    */
    private void doAjudaAction() {
    JOptionPane.showMessageDialog(Exemplo.this, “ACAO AJUDA”);
    }

    /**
    *
    */
    private void doFecharAction() {
    JOptionPane.showMessageDialog(Exemplo.this, “ACAO FECHAR”);
    dispose();
    }

    /**
    *
    */
    private void doCancelarAction() {
    JOptionPane.showMessageDialog(Exemplo.this, “ACAO CANCELAR”);
    }

    /**
    *

    • @param args
      */
      public static void main(String… args) {
      new Exemplo().setVisible(true);
      }
      }[/code]