2

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

我正在寻找这个,因为我的应用程序全屏运行,并且有一个监听按键以触发各种事件KeyListenerJFrame但是我发现,每当单击一个JButton或其他添加的组件时,它都会获得焦点,并且关键事件永远不会到达JFrame. 因此,一种更优雅的方式让单个父容器捕获关键事件,而不管哪个孩子有焦点,也可以解决我的问题。

4

4 回答 4

3

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

我从来没有见过一个。

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

不要使用 KeyListener。

相反,您可以将 JMenus 和 JMenuItems 与加速器一起使用。这种方法的好处是击键然后记录在菜单中。请参阅 Swing 教程中有关如何使用菜单的部分。

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

于 2011-07-28T14:53:14.930 回答
2

听起来像是 KeyEventDispatcher 的工作:

http://download.oracle.com/javase/6/docs/api/java/awt/KeyEventDispatcher.html

那将解决问题,而不是修改具有(无法计算的)副作用的不直接相关的属性:-)

于 2011-07-28T15:18:57.387 回答
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);
于 2011-07-28T14:57:00.187 回答
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);
      }
    }
  }
于 2011-07-28T14:57:32.657 回答