在一个JPanel里面add了两个JButton  jb1   jb2
想在jb1和jb2上加上快捷键如果是这样  (用JPanel 以及  WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
InputMap imap=thePanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)   ;
imap.put( ... )
imap.put( ... )
就可以但是我想用直接在JButton上用WHEN_IN_FOCUSED
jb1.getInputMap(JComponent.WHEN_IN_FOCUSED).put( ... )
jb2.getInputMap(JComponent.WHEN_IN_FOCUSED).put( ... )
第一个(jb1)可以
但是第二个(jb2)就没有用了   这是怎么回事?

解决方案 »

  1.   

    我要知道,你的inputmap里面你放置了什么。
    你的actionmap在哪里?
      

  2.   

    代码如下
     
     jb1.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
     jb2.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");jb1.getActionMap().put("panel.yellow", yellowAction);
     jb2.getActionMap().put("panel.blue", blueAction);
    可是 如果把jb1 jb2换成 panel  然后参数是 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT  是可以的
      

  3.   

    http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
    http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
      

  4.   

    老大  我有api doc啊   就是出现实际(非教条性)的问题才会问啊
      

  5.   

    那,我明白了。你的问题就是在你的参数上。
    jb1.getInputMap(JComponent.WHEN_FOCUSED)
    那么,你既然有文档,可曾仔细推敲过?WHEN_FOCUSED这个参数代表的是什么?
    WHEN_FOCUSED
    public static final int WHEN_FOCUSED用于 registerKeyboardAction 的常量,意味着在组件获得焦点时应该调用命令。 

    那,换言之,不获得焦点就不调用。
    也就是说只有当你的button拥有焦点的时候,这动作才有效。你可以做一试验,就按照你原来的代码,按下tab键将焦点切换到你的第二个按钮,按下第二个按钮你注册的快捷键。第二个有效,第一个却没反应了。
    而一开始,第一个按钮可以执行的原因就是你的第一个按钮,原因就在于,你的第一个按钮在起始的时候会获得默认的焦点。你可以再试试,如果你先添加一个其他的组件在之前,连你的第一个快捷键都没有响应。
      

  6.   

    7楼言之有理。对于api我们要知其然,更要知其所以然