在一个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)就没有用了 这是怎么回事?
想在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)就没有用了 这是怎么回事?
你的actionmap在哪里?
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 是可以的
http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
jb1.getInputMap(JComponent.WHEN_FOCUSED)
那么,你既然有文档,可曾仔细推敲过?WHEN_FOCUSED这个参数代表的是什么?
WHEN_FOCUSED
public static final int WHEN_FOCUSED用于 registerKeyboardAction 的常量,意味着在组件获得焦点时应该调用命令。
那,换言之,不获得焦点就不调用。
也就是说只有当你的button拥有焦点的时候,这动作才有效。你可以做一试验,就按照你原来的代码,按下tab键将焦点切换到你的第二个按钮,按下第二个按钮你注册的快捷键。第二个有效,第一个却没反应了。
而一开始,第一个按钮可以执行的原因就是你的第一个按钮,原因就在于,你的第一个按钮在起始的时候会获得默认的焦点。你可以再试试,如果你先添加一个其他的组件在之前,连你的第一个快捷键都没有响应。