【问题标题】:How to find out which object currently has focus如何找出当前具有焦点的对象
【发布时间】:2010-10-17 17:44:29
【问题描述】:

我的Frame 中有几个TextFields。我想知道哪个TextField 目前有焦点。我怎样才能找到这些信息?

【问题讨论】:

    标签: java swing focus


    【解决方案1】:

    你可以像这样获得当前关注的组件:

    Component focusOwner = FocusManager.getCurrentManager().getFocusOwner();
    

    之后你可以检查focusOwner是否是TextField的实例

    【讨论】:

      【解决方案2】:

      您还可以在键盘焦点管理器中监听适当的属性变化:

      KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener("focusOwner", new PropertyChangeListener() {
          @Override
          public void propertyChange(PropertyChangeEvent evt) {
              System.out.println(evt.getNewValue());
          }
      });
      

      这会在您与 Swing 组件交互时输出焦点所有者,并且通常对于调试焦点问题很有用。

      【讨论】:

        【解决方案3】:

        KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
        不会跨线程工作。因此,如果您的应用程序调用一个新线程并且该线程具有自己的框架/窗口等,那么它将无法从该线程获得焦点所有者。改为使用:KeyboardFocusManager.getCurrentKeyboardFocusManager().getGlobalFocusOwner();

        【讨论】:

        • 好的,阅读 api 文档有助于(我 :-) 理解您的意思。它声明 返回焦点所有者,即使调用线程与焦点所有者位于不同的上下文中 - 但它在应用程序代码中不可用,因为它的范围受到保护。它只在内部使用...
        • Swing 是一个单线程环境,所有 UI 交互都必须发生在 Event Dispatching Thread 的上下文中,同一个 JVM 中不可能有两个窗口在不同的线程中运行,这不是API 工作原理
        【解决方案4】:
        KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()
        

        【讨论】:

        • 比公认的答案好得多,恕我直言,因为我可以从一个无法访问我实际使用的窗口的静态类中执行此操作,而且我不必遍历所有窗户。
        【解决方案5】:

        【讨论】:

          【解决方案6】:

          getFocusOwner() 将返回当前焦点所在的子组件。

          但是你必须检查它是否是一个 JTextField。如果其他组件(例如按钮)也存在于您的框架中,它们可能会被聚焦。

          【讨论】:

            【解决方案7】:

            JFrame.getFocusOwner()(继承自Window.getFocusOwner())应该返回对具有焦点的组件的引用。 getMostRecentFocusOwner() 也可能感兴趣。

            【讨论】:

              【解决方案8】:

              每个 JComponent 都有一个 hasFocus 方法,您可以使用它来检查它是否有焦点。 但是,这已被更改,现在您应该使用 isFocusOwner。

              因此,遍历框架中的所有文本字段,并通过调用该方法检查每个字段是否为 isFocusOwner。

              您还可以让焦点所有者通过框架。

              【讨论】:

              • 似乎效率很低。你可以调用 KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
              【解决方案9】:

              This 教程应该对理解焦点很有帮助。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-04-04
                • 1970-01-01
                • 2011-04-06
                • 1970-01-01
                • 2011-09-23
                相关资源
                最近更新 更多