Dialog에서 ESC 키 이벤트 수신

모든 컨트롤에 초점을 맞출 때 ESC 버튼이나 다른 키 이벤트가 발생할 때 이 창을 닫거나 다른 이벤트를 활성화하는 JDialogJDialog를 직접 사용할 때ddKeyListener 방법으로 키보드 이벤트에 대한 감청을 추가하면 현재 ESC 이벤트를 감청할 수 없습니다.여기에는 JDialog가 부모 클래스를 덮어쓰는 createRootPane () 방법을 계승하고 키보드 ESC에 대한 감청을 추가합니다.물론 다른 키보드에 대한 감청도 가능하다.
예제 코드는 다음과 같습니다.
package com.michaelx.swing.dlg;

import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;

/**
 *@author mengke
 *@email [email protected]
 *@version 1.0
 *@date  2011-10-22  12:23:36
 *@project myswing
 */
public  class EscapeDialog extends JDialog {
	
	private static final long serialVersionUID = 1L;

	public EscapeDialog(Dialog d){
		super(d);
	}
	
	public EscapeDialog(Window w){
		super(w);
	}
	
	
	/**
	 *  。 ESCAPE 
	 */
	@Override
	protected JRootPane createRootPane(){
		KeyStroke  stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0);
		JRootPane rootPane = new JRootPane();
		rootPane.registerKeyboardAction(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				escapeKeyProc();
			}
		},stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);

		return rootPane;
	}
	
	/**
	 *  ESCAPE 。 , 。
	 */
	protected  void escapeKeyProc(){
		setVisible(false);
	}
	
	public static void main(String[] args){
		EscapeDialog dlg = new EscapeDialog(null);
		dlg.setSize(new Dimension(200,300));
		dlg.setVisible(true);
	}

}

좋은 웹페이지 즐겨찾기