java - 如何在java swing中获得聚焦的jxBrowser

标签 java swing focus jxbrowser

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

最佳答案

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

<小时/>

编辑:在重量级渲染模式中,我们将 native 窗口嵌入到您的 Java 应用程序中。 JavaFX 和 Swing 在焦点转移方面有不同的实现。在JavaFX中,我们不清除焦点所有者,因此您可以通过Scene.focusOwnerProperty()获取它。在Swing中,当嵌入的 native 窗口获得焦点时,我们必须清除全局焦点所有者,否则,我们以后将无法将焦点转移到其他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;
}

关于java - 如何在java swing中获得聚焦的jxBrowser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53110251/

相关文章:

java - 按钮上的 getSource 方法出现问题

jquery - 使按钮保持一种颜色,除非悬停在上面

java - JAI 文件加载/文件存储操作与 JAI 图像读取/图像写入操作。差异?

java - Python、Java 和 C 中的嵌套循环比较

java - 在 Java 的构造函数中声明和设置私有(private)最终成员变量的正确方法?

java - 间隔条渲染器 : Displaying specific information inside the bar

java - 如何修改我的程序以便用户不需要指定输入长度?

java - 进度条可以在 main 之外的类中使用吗?

javascript - 将焦点置于字段并使用 HTML anchor

c# - WinForms Web 浏览器控件强制重新聚焦?