2011-07-28 104 views
2

我知道你可以调用JComponent.setFocusable(false)来使Java组件不被关注。但是因为我在应用程序中有很多组件,所以我想知道是否有比在几十个对象中调用它更简单的方法。像UIDefaults值?是否有可能使JComponent默认为不可聚焦?

我在找这个,因为我的应用程序全屏运行,JFrame上有一个KeyListener,它侦听按键触发各种事件。但是我发现无论何时点击一个JButton或其他添加的组件,它都会获得焦点,关键事件永远不会到达JFrame。因此,无论孩子有什么焦点,都可以通过单个父容器捕获关键事件的更优雅的方式来解决我的问题。

回答

3

我想知道是否有比在几十个对象上调用它更简单的方法。

我从来没有见过一个。

JFrame上有一个KeyListener,用于侦听按键触发各种事件。

请勿使用KeyListener。

相反,您可以使用JMenus和JMenuItems加速器。这种方法的好处是,关键笔画然后是菜单中的文档。请参阅How to Use Menus上的Swing教程部分。

或者如果你不喜欢菜单,那么你应该使用Key Bindings。即使组件没有焦点,它们也可以被编码以工作。

+0

只是一个小心当心:菜单加速器只能如预期的,如果他们是唯一的 - 与聚焦时窗口绑定是最后一个只有在没有人想要的时候才能看到它们它们。 – kleopatra

+0

我使用Key Bindings而不是KeyListener,而且这样做。至少有一次,我开始为InputMap使用JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT标志。 –

+0

@Mike,然后论坛程序是“接受”你使用的答案。 – camickr

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); 
+0

我怀疑你想要“回归真实”在那里... –

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); 
     } 
    } 
    } 
+1

怀疑你想篡改症状;-) – kleopatra

相关问题