¿Cómo hago que la vista web de JavaFX se procese incluso cuando no está visible debido a que estoy en otra pestaña?

Estoy cargando un sitio web en un JavaFX WebView y despuésUn rato tomando una captura de pantalla con algo como:

WritableImage image = webView.snapshot(null, null);

Si estoy viendo ese WebView que funciona bien, pero si está oculto al estar en una pestaña que no está en primer plano (no estoy seguro de otros casos de ocultarlo), entonces, la captura de pantalla es del sitio apropiado , pero completamente en blanco.

¿Cómo puedo forzar el WebView para renderizar aunque no sea visible?

Durante este tiempo,webView.isVisible() es verdad.

Encontré que hay un método enWebView llamadoisTreeReallyVisible() y actualmente contiene:

private boolean isTreeReallyVisible() {
    if (getScene() == null) {
        return false;
    }

    final Window window = getScene().getWindow();

    if (window == null) {
        return false;
    }

    boolean iconified = (window instanceof Stage) ? ((Stage)window).isIconified() : false;

    return impl_isTreeVisible()
           && window.isShowing()
           && window.getWidth() > 0
           && window.getHeight() > 0
           && !iconified;
}

Cuando WebView se oculta al estar en una pestaña que no es de primer plano,impl_isTreeVisible() es falso (todos los demás factores en la declaración de retorno son verdaderos). Ese método está activadoNode y se ve así:

/**
 * @treatAsPrivate implementation detail
 * @deprecated This is an internal API that is not intended for use and will be removed in the next version
 */
@Deprecated
public final boolean impl_isTreeVisible() {
    return impl_treeVisibleProperty().get();
}

/**
 * @treatAsPrivate implementation detail
 * @deprecated This is an internal API that is not intended for use and will be removed in the next version
 */
@Deprecated
protected final BooleanExpression impl_treeVisibleProperty() {
    if (treeVisibleRO == null) {
        treeVisibleRO = new TreeVisiblePropertyReadOnly();
    }
    return treeVisibleRO;
}

Podría haber anuladoimpl_treeVisibleProperty() para proporcionar mi propia implementación, peroWebView es final, así que no puedo heredar de eso.

Otra situación completamente diferente a ser minimizado (iconificado) o en una pestaña oculta es tener el escenario completamente oculto (como cuando se ejecuta en la barra de la bandeja). Cuando estoy en ese modo, incluso si puedo hacer que el renderizado suceda, elWebView No cambia el tamaño. Yo lo llamowebView.resize() y luego tomar una captura de pantalla y la captura de pantalla es del tamaño apropiado pero la página renderizada real es del tamaño que seaWebView Fue antes.

Al depurar este comportamiento de dimensionamiento en las etapas mostradas y ocultas, descubrí que eventualmente llegamos aNode.addToSceneDirtyList() eso contiene:

private void addToSceneDirtyList() {
    Scene s = getScene();
    if (s != null) {
        s.addToDirtyList(this);
        if (getSubScene() != null) {
            getSubScene().setDirty(this);
        }
    }
}

Cuando está en modo oculto,getScene() devolucionesnull, a diferencia de lo que sucede cuando se muestra. Eso significa ques.addToDirtyList(this) nunca se llama. No estoy seguro de si esta es la razón por la cual no se redimensiona correctamente.

Hay un error sobre esto, uno muy viejo, aquí:https://bugs.openjdk.java.net/browse/JDK-8087569 pero no creo que ese sea el problema.

Estoy haciendo esto con Java 1.8.0_151. Intenté 9.0.1 para ver si se comportaría de manera diferente, ya que tengo entendido que WebKit se actualizó, pero no, es lo mismo.

Respuestas a la pregunta(3)

Su respuesta a la pregunta