Как получить сфокусированный jxBrowser в java swing - PullRequest
0 голосов
/ 02 ноября 2018

Чтобы определить, какому компоненту принадлежит фокус, я обычно называю KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), но когда BrowserView находится в фокусе, он возвращает ноль. Почему это так? Есть ли альтернативный способ для jxBrowser?

1 Ответ

0 голосов
/ 06 ноября 2018

По умолчанию 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;
}
...