关于设置swing快捷键的问题,一般我们设置快捷键都是XXXBtn.setMnemonic(KeyEvent.VK_G);
之类,把XXXBtn的快捷键设为ALT+G,但我想把这个按钮的快捷键设为Esc时,用XXXBtn.setMnemonic(KeyEvent.VK_ESCAPE);时,直接按ESC好像没效果,如果按下ALT+ESC又会把程序切换成其它程序,请问如何把一个按钮的快捷键设为ESC
    PS:另一个方法用KeyListener来判断我知道该怎么用,现在我想知道,如果不用KeyListener,还有其它办法吗?谢谢

解决方案 »

  1.   

    mnemonic必须是可见的字符,ESC不是,所以不能用setMnemonic设置。
      

  2.   

    使用KeyListener的方法如下,敲键盘时,3个方法的执行顺序也如下所示。
    需要注意的一点是,你必须要保证该component获得焦点。另外,可以使用new KeyAdapter()代替new KeyListener(),这样,你可以只实现你所需要的方法即可。component.addKeyListener(
        new KeyListener(){
            public void keyPressed(KeyEvent e) {
                System.out.println("keyPressed");
            }
            public void keyTyped(KeyEvent e) {
                System.out.println("keyTyped");
            }
            public void keyReleased(KeyEvent e) {
                System.out.println("keyReleased");
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE ) {                        
                }                    
            }
        });
      

  3.   

    谢谢UnAgain() 的回复,还是有两个问题不解
        1,关于用setMnemonic这个方法,我写了个小程序打印出键盘各个键的值,发现Esc键的keycode是27,我查了javaDoc,那个 VK_ESCAPE 的值也是27,按道理应该可以使ESC键生效,可能你说得对,“mnemonic必须是可见的字符,ESC不是,所以不能用setMnemonic设置。”那原来里面提供的KeyEvent.VK_ESCAPE 这个是对应键盘上的那个键呢?
        2,关于KeyListener,我知道这样可以实现我的功能,但现在问题是,我这个swing等程序是基于一套公司内部框架写的,本身其实是一个JPanel,但通过xml配置后,框架在运行时会自动把他转成一个Dialog,用KeyListener来实现这个ESC快捷键会有问题,因为这个Dialog在编译时是不存在的,所以如this.getParentDialog().addKeyListener(.....)会报错 抛出空引用异常 (那个getParentDialog()是框架提供的一个方法)。所以这里不能用KeyEventListener或KeyEventAdapter.
         所以现在不知道要用什么方法才能把Esc设为快捷键。。
    请大家帮帮忙,谢谢。。
      

  4.   

    1)VK_ESCAPE就是ESC的KeyCode,但并不是所有的KeyCode都能作为mnemonic。JMenuItem中有一个方法setAccelerator可以使用VK_ESCAPE,把ESC设置为快捷键。2)你把KeyListener添加给JPanel试试。并且尝试JPanel能不能在Dialog显示时获得焦点。
      

  5.   

    今天自已找到另一个办法了就是用
    registerKeyboardAction((ActionListener anAction,
                                       String aCommand,
                                       KeyStroke aKeyStroke,
                                       int aCondition))
    这个方法,如cancelBtn.registerKeyboardAction(cancelBtn.getActionListeners()[0],KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0),JButton.WHEN_IN_FOCUSED_WINDOW);可以实现我想要的功能,
    但我查了J2SE5.0的DOC,好像这个方法在1.4还行,在1.5此方法现在已过时,对于类似的操作,请结合使用 getActionMap() 和 getInputMap()。具体详情可以查查DOC。。
    最后多谢Unagain()的热心帮助,现结贴给分.....