首页 > 解决方案 > 如何在 java swing 中获得焦点 jxBrowser

问题描述

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

标签: javaswingfocusjxbrowser

解决方案


默认情况下,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;
}

推荐阅读