是否可以使JComponent默认为不可聚焦?

时间:2011-07-28 14:43:27

标签: java swing focus keylistener jcomponent

我知道你可以调用JComponent.setFocusable(false)来使Java组件无法集中。但是由于我的应用程序中有很多组件我希望这样,我想知道是否有一种更简单的方法,而不是在几十个对象中的每一个上调用它。像一个UIDefaults值?

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

4 个答案:

答案 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);
      }
    }
  }