java - 如何在 java swing 中获得焦点 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
编辑:在重量级渲染模式中,我们将本机窗口嵌入到您的 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;
}
推荐阅读
- python - 根据值 Pandas 重命名列名
- ruby-on-rails - 如何在rails中按天数或日期名称获取日期?
- angular - 如何在量角器中执行拖放功能
- java - Java for Android 中的自定义对象检测
- reactjs - Firebase 部署命令正在部署一个非常旧的提交
- google-tag-manager - 自定义历史更改触发器以跳过 GTM 中同一页面上的 hashchanges
- scala - Calculating mean and standard deviation using Spark / SCALA
- ssas - PY YTD 计算的可以处理闰年 MDX 的度量
- c# - 如何让 VS Code 使用本地安装的 .NET Core?
- json - 使用 XSLT 提取 json 字段