【问题标题】:How to get the focused jxBrowser in java swing如何在 java swing 中获得焦点 jxBrowser
【发布时间】:2018-11-01 22:26:36
【问题描述】:

为了确定哪个组件拥有焦点,我通常调用KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(),但是当 BrowserView 处于焦点时,它会返回 null。 为什么会这样? jxBrowser 有其他的方法吗?

【问题讨论】:

    标签: java swing focus jxbrowser


    【解决方案1】:

    默认情况下,JxBrowser 使用重量级模式。在重量级渲染模式下,单独的进程处理渲染,焦点所有者位于另一个 BrowserContext 中。这就是调用KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() 返回null 的原因。 要解决此问题,请考虑使用轻量级模式。您可以在 JxBrowser 指南中找到更多关于渲染模式的信息:https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013069-lightweight-or-heavyweight


    编辑:在重量级渲染模式中,我们将本机窗口嵌入到您的 Java 应用程序中。 JavaFX 和 Swing 在焦点转移方面有不同的实现。在 JavaFX 中我们不会清除焦点所有者,因此您可以通过 Scene.focusOwnerProperty() 获取它。在 Swing 中,当嵌入式原生窗口接收到焦点时,我们必须清除全局焦点所有者,否则,我们稍后将无法将焦点转移到其他 Swing 组件。但是,我们使用内部 Java API 设置了最近的焦点所有者。如果必须使用重量级渲染模式,可以使用反射获取最近的焦点所有者。我已经更新了答案来演示这种方法。

    public static Component getMostRecentFocusOwner(Window window) {
        try {
            KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            Method getMostRecentFocusOwner = KeyboardFocusManager.class.getDeclaredMethod("getMostRecentFocusOwner", Window.class);
            getMostRecentFocusOwner.setAccessible(true);
            return (Component) getMostRecentFocusOwner.invoke(focusManager, window);
        } catch (Exception ignored) {}
        return null;
    }
    

    【讨论】:

    • 解决了这个问题。谢谢!无论如何,在 javaFX 中,即使浏览器处于 HeavyWeight 模式,您也可以通过 Scene.focusOwnerProperty() 获得焦点浏览器视图。你能解释一下吗?
    • 我已经用解释更新了答案,请检查。
    【解决方案2】:

    在 Java 16 中,我注意到“getMostRecentFocusOwner.setAccessible(true);”会抛出以下错误。

    java.lang.reflect.InaccessibleObjectException:无法使静态同步 java.awt.Component java.awt.KeyboardFocusManager.getMostRecentFocusOwner(java.awt.Window) 可访问:模块 java.desktop 不会“打开 java.awt”到未命名的模块

    我改用以下方法返回活动的 BrowserView

    public static Component getMostRecentFocusOwner() {
         KeyboardFocusManager focusManager
         = KeyboardFocusManager.getCurrentKeyboardFocusManager();
             return focusManager.getFocusOwner().getParent();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多