は私がのJavaFXのWebViewにとのようなもので、スクリーンショットを撮るしばらく後にウェブサイトをロードしています:別のタブのために表示されない場合でも、JavaFXのWebviewレンダーを作成するにはどうすればよいですか?
WritableImage image = webView.snapshot(null, null);
は私が正常に動作しているのWebViewで探していた場合、それがあることによって隠されていた場合(私はそれを隠す他のケースについてはわからない)、その後、スクリーンショットは適切なサイトのものですが、完全に空白です。
WebViewが表示されなくてもレンダリングさせるにはどうすればよいですか?
この間、webView.isVisible()
は真です。
私はそこisTreeReallyVisible()
呼ばWebView
での方法だと、現在それが含まれていた:returnステートメント内の他のすべての要因がWebViewのが非フォアグラウンドのタブであることによって隠されている場合は
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;
}
、impl_isTreeVisible()
が偽です(本当です)。その方法はNode
上で、次のようになります。私は私の独自の実装を提供するために、impl_treeVisibleProperty()
をオーバーライドしている可能性が
/**
* @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;
}
が、WebView
は最終的なもので、そう、私はそれを継承することはできません。
最小化(アイコン化)または非表示のタブ上の別の全く異なる状況は、ステージを完全に非表示にすることです(トレイバーで実行中)。そのモードでは、レンダリングを行うことができても、WebView
はサイズ変更されません。私はwebView.resize()
と呼んでから、スクリーンショットを撮って、スクリーンショットは適切なサイズですが、実際にレンダリングされるページのサイズは、WebView
です。
private void addToSceneDirtyList() {
Scene s = getScene();
if (s != null) {
s.addToDirtyList(this);
if (getSubScene() != null) {
getSubScene().setDirty(this);
}
}
}
隠しモードでは、getScene()
戻っそれはショーであることだと何が起こるかとは異なりnull
、:
が示され、隠された段階で、このサイジング動作のデバッグ、私は最終的に我々は含まれていNode.addToSceneDirtyList()
に着くことがわかりました。つまり、s.addToDirtyList(this)
は呼び出されません。これが適切にサイズ変更されない理由があるかどうかはわかりません。
これについてのバグは、非常に古いものです:https://bugs.openjdk.java.net/browse/JDK-8087569ですが、それはすべての問題だとは思いません。
私はJava 1.8.0_151でこれをやっています。私はWebKitがアップグレードされたと私が理解しているように、動作が違うかどうかを確認するために9.0.1を試しましたが、同じではありません。
タブペインのスキンがどのように実装されているのか覚えていませんが、あなたが記述したシナリオのシーンにWebビューが存在しない可能性があります。この場合、スナップショットは機能しません(ただし、スナップショットを撮っている間に一時的にWebビューをシーンに追加できます)。まだシーンの一部であれば、私は考えていません... –
@James_Dは考えていません...終焉。 – Mordechai
ヘルプがあれば見てください。https://stackoverflow.com/questions/40642573/trying-to-render-javafx-webview-to-offscreen-buffer-or-fbo – AsifAli72090