我知道你可以调用JComponent.setFocusable(false)
来使Java组件无法集中。但是由于我的应用程序中有很多组件我希望这样,我想知道是否有一种更简单的方法,而不是在几十个对象中的每一个上调用它。像一个UIDefaults
值?
我正在寻找这个,因为我的应用程序全屏运行,KeyListener
上有一个JFrame
,用于侦听触发各种事件的击键。但我发现只要点击JButton
或其他添加的组件,它就会获得焦点,而关键事件永远不会到达JFrame
。因此,一个更优雅的方式让一个父容器捕获关键事件,无论孩子有什么焦点,也可以解决我的问题。
答案 0 :(得分:3)
我想知道是否有比在数十个对象中的每一个上调用它更简单的方法。
我从未见过。
JFrame上有一个KeyListener,用于侦听触发各种事件的击键。
不要使用KeyListener。
相反,您可以将JMenus和JMenuItems与加速器一起使用。这种方法的好处是键击是菜单中的文档。请参阅How to Use Menus上的Swing教程中的部分。
或者,如果您不喜欢菜单,那么您应该使用Key Bindings。即使组件没有焦点,它们也可以编码工作。
答案 1 :(得分:2)
听起来像是KeyEventDispatcher的工作:
http://download.oracle.com/javase/6/docs/api/java/awt/KeyEventDispatcher.html
这将解决问题,而不是在与(不可估量的)副作用直接相关的属性上进行篡改: - )
答案 2 :(得分:1)
怎么样:
public boolean getComponent(Container c)
{
Component[] cmps = c.getComponents();
for(Component cmp : cmps)
{
if(cmp instanceof JComponent) // or even you could specify the JComponent you want to make it not-focusable, for example (cmp instanceof JButton)
{
((JComponent)cmp).setFocusable(false);
return true;
}
if(cmp instanceof Container)
{
if(getComponent((Container) cmp)) return true;
}
}
return false;
}
然后通过以下方式调用它:
getComponent(YourJFrame);
答案 3 :(得分:0)
这是一种相当粗略的方式来走树并将其设置在你关心的元素上。只需传入一组noFocus(或将逻辑改为一切)......
public static List<Component> disableFocus(final Container c, Set<Component> noFocus) {
Component[] comps = c.getComponents();
for (Component comp : comps) {
if (noFucus.contains(comp) { comp.setFocusable(false); }
if (comp instanceof Container) {
disableFocus(comp);
}
}
}