1. 程式人生 > >Dialog裡監聽ESC按鍵事件

Dialog裡監聽ESC按鍵事件

一個JDialog,焦點在任何控制元件上的時候,當ESC按鍵或其他鍵事件發生時,想關閉這個視窗,或者啟用別的事件的方法。在直接用JDialog時,用addKeyListener方法新增對鍵盤事件的監聽,發現現不能監聽到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); } }