【问题标题】:Is it possible to make a JComponent default to not-focusable?是否可以将 JComponent 默认设置为不可聚焦?
【发布时间】:2011-10-15 05:00:50
【问题描述】:

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

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

【问题讨论】:

    标签: java swing focus keylistener jcomponent


    【解决方案1】:

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

    我从没见过。

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

    不要使用 KeyListener。

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

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

    【讨论】:

    • 请注意:菜单加速器只有在它们是唯一的情况下才能按预期工作 - 与 when-in-focused-window 的绑定是最后看到它们的,并且只有在没有其他人想要它们时才看到它们。
    • 我使用了 Key Bindings 而不是 KeyListener 并且成功了。至少有一次我开始为 InputMap 使用 JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 标志。
    • @Mike,那么论坛程序是“接受”您使用的答案。
    【解决方案2】:

    怎么样:

    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】:

      这是一种相当粗略的遍历树并将其设置在您关心的元素上的方法。只需传入一组 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);
            }
          }
        }
      

      【讨论】:

      • 怀疑你想修改症状 ;-)
      【解决方案4】:

      听起来像是 KeyEventDispatcher 的工作:

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

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

      【讨论】:

        猜你喜欢
        • 2019-08-24
        • 2014-10-15
        • 2021-07-22
        • 2019-04-05
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多