По умолчанию JxBrowser использует тяжеловесный режим. В режиме тяжелого рендеринга отдельный процесс выполняет рендеринг, а владелец фокуса находится в другом BrowserContext. Вот почему вызов KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()
возвращает ноль.
Чтобы решить эту проблему, рассмотрите возможность использования облегченного режима. Вы можете найти больше информации о режиме рендеринга в руководстве 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;
}