Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX中WebView中的透明背景_Webview_Javafx 2 - Fatal编程技术网

JavaFX中WebView中的透明背景

JavaFX中WebView中的透明背景,webview,javafx-2,Webview,Javafx 2,我需要在父背景模式上显示我的webview内容。有一种简单的方法吗?您可以使用特效查看您的内容 更新 我试过了,在JavaFX中使用JavaFX2.2的内置混合效果实现一个真正的色度键实际上相当困难(并且超过了我的实现能力)。我设法使该技术适用于预色度键控flv视频格式,但不适用于WebView等任意节点 不过,就目前而言,正如马提尼在他的回答中所建议的那样,你可以用一种简单的方法来实现一些类似的效果。它并不完美,但在实现之前可能需要满足,或者JavaFX平台提供更全面的alpha合成操作集。如

我需要在父背景模式上显示我的webview内容。有一种简单的方法吗?

您可以使用特效查看您的内容

更新

我试过了,在JavaFX中使用JavaFX2.2的内置混合效果实现一个真正的色度键实际上相当困难(并且超过了我的实现能力)。我设法使该技术适用于预色度键控flv视频格式,但不适用于WebView等任意节点


不过,就目前而言,正如马提尼在他的回答中所建议的那样,你可以用一种简单的方法来实现一些类似的效果。它并不完美,但在实现之前可能需要满足,或者JavaFX平台提供更全面的alpha合成操作集。

如果您有明亮的背景使用

webView.setBlendMode(BlendMode.DARKEN);
当背景颜色变暗时

webView.setBlendMode(BlendMode.LIGHTEN);

这可能会在一段时间内得到修复,JavaFX bug tracker上要求使用此功能,因为我找到了一个更好的解决方案,可以在渐变上使用
WebView
。假设您有一个,并希望在其上方显示一个白色的HTML字符串,如下所示:

<p>Integer semper, est imperdiet mattis porttitor, massa vulputate ipsum</p>
由于
WebView
加载任何HTML字符串,这可能涉及具有背景的
。在我的例子中,
WebView
没有用渐变占据整个空间,所以我也必须定位背景。以下是我在下面添加到上面的HTML字符串中的HTML:

<html>
<head>
</head>
<body style="margin: 0px; padding: 0px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAHDCAYAAADlQnCCAAAAq0lEQVRIib2VwRWAMAhDaSdwCtd1No8uUzzp0ydBgjwvnmhCPrTKtKxbb73NXcaQLiL5j/olyhQH5JXu4H4sUGyWHAIa9VWjU9qtyAh6JGicIMJno2HcGSX3gJsCKH5EfUfHJUed+qFzekrpuVzM/oq4uFKGr/pI4B7wiP2Vgno0F/uCUQ9ZXWg4vM/JL1Hpt10Nt+hZjhCDKepxV8H3soZGWOqHP3ZSGYDdATTkg3iGU3JnAAAAAElFTkSuQmCC); background-repeat: repeat-x; background-position: 0 -152px;">
<span style="font-family: Arial; font-size: 12px; color: white; display: block; margin:0px;">

最后:

</span></body></html>

因此,生成这样的代码:

String desc = "<html><head></head><body style=\"margin: 0px; padding: 0px; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAHDCAYAAADlQnCCAAAAq0lEQVRIib2VwRWAMAhDaSdwCtd1No8uUzzp0ydBgjwvnmhCPrTKtKxbb73NXcaQLiL5j/olyhQH5JXu4H4sUGyWHAIa9VWjU9qtyAh6JGicIMJno2HcGSX3gJsCKH5EfUfHJUed+qFzekrpuVzM/oq4uFKGr/pI4B7wiP2Vgno0F/uCUQ9ZXWg4vM/JL1Hpt10Nt+hZjhCDKepxV8H3soZGWOqHP3ZSGYDdATTkg3iGU3JnAAAAAElFTkSuQmCC); background-repeat: repeat-x; background-position: 0 -152px;\"><span style=\"font-family: Arial; font-size: 12px; color: white; display: block; margin:0px;\">" + description + "</span></body></html>";
wv_desc.getEngine().loadContent(desc);
String desc=”“+description+”;
wv_desc.getEngine().loadContent(desc);

我想你可以把样式放在
中,或者以其他方式加载它们,以保持清晰,但是这是一个更好的解决方法,可以解决我在网上找到的关于这个问题的任何其他问题。

Webview transparent我在这里得到一个很好的解决方案:阅读Harry Hur的评论

    import java.lang.reflect.Field;
    import javafx.application.Application;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue; 
    import javafx.scene.Scene;
    import javafx.scene.web.WebEngine;
    import javafx.scene.web.WebView;
    import javafx.stage.Stage;
    import javafx.stage.StageStyle; 
    import org.w3c.dom.Document; `

    public class TestTranparentApps extends Application { 

    @Override
    public void start(Stage primaryStage) {
        new WebPage(primaryStage);
        primaryStage.show(); 
    } 

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    class WebPage{

        WebView webview;
        WebEngine webengine;
        public WebPage(Stage mainstage){
            webview = new WebView();
            webengine = webview.getEngine();

            Scene scene = new Scene(webview);
            scene.setFill(null);

            mainstage.setScene(scene);
            mainstage.initStyle(StageStyle.TRANSPARENT);
            mainstage.setWidth(700);
            mainstage.setHeight(100);

            webengine.documentProperty().addListener(new DocListener());
            webengine.loadContent("<body style='background : rgba(0,0,0,0);font-size: 70px;text-align:center;'>Test Transparent</body>");
        }

        class DocListener implements ChangeListener<Document>{  
            @Override
            public void changed(ObservableValue<? extends Document> observable, Document oldValue, Document newValue) {
                try {

                    // Use reflection to retrieve the WebEngine's private 'page' field. 
                    Field f = webengine.getClass().getDeclaredField("page"); 
                    f.setAccessible(true); 
                    com.sun.webkit.WebPage page = (com.sun.webkit.WebPage) f.get(webengine);  
                    page.setBackgroundColor((new java.awt.Color(0, 0, 0, 0)).getRGB()); 

                } catch (Exception e) {
                }

            }
        }  
    } 
} 
import java.lang.reflect.Field;
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.web.WebEngine;
导入javafx.scene.web.WebView;
导入javafx.stage.stage;
导入javafx.stage.StageStyle;
导入org.w3c.dom.Document`
公共类TestTranparentApps扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
新网页(初级阶段);
primaryStage.show();
} 
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
班级网页{
网络视图;
网络引擎;
公共网页(舞台主流){
webview=新建webview();
webengine=webview.getEngine();
场景=新场景(webview);
scene.setFill(null);
主干。场景(场景);
initStyle(StageStyle.TRANSPARENT);
主干。设置宽度(700);
主干。设置高度(100);
webengine.documentProperty().addListener(新的DocListener());
loadContent(“测试透明”);
}
类DocListener实现ChangeListener{
@凌驾
公共空间已更改(ObservalEvalue这可能有用

final com.sun.webkit.WebPage webPage = com.sun.javafx.webkit.Accessor.getPageFor(engine);
webPage.setBackgroundColor(0);

您需要将网页背景设置为0。但您可能需要执行一些其他操作,以避免在滚动时中断。以下GitHub Gist是一个java代理,可添加到我们的应用程序中,并可将网页操纵为透明。或更高的最新版本


我找到的唯一一个解决方案是完全有效的。

它适用于JDK 8(1.8.0_40-ea),但不适用于JDK 7(1.7.0_65)
WebEngine。页面
是最终的,因此您可以在创建webView时执行反射,而无需监听文档更改。尽管我的版本(JDK 1.7.80)使用
com.sun.webpane.platform
,但可能是相同的。我尝试了这种方法,但对我来说,滚动时没有正确地重新绘制背景。这是JavaFX 11。这在我的project.JDK 15、JavaFX 15中起作用。需要添加以下VM选项:--add exports JavaFX.web/com.sun.JavaFX.webkit=ALL-UNNAMED;-add exports javafx.web/com.sun.webkit=ALL-UNNAMED;--add打开javafx.web/javafx.scene.web=ALL-UNNAMED;完美。要使WebView透明,只需要两行以上的代码。或者您可以使其成为一行代码
com.sun.javafx.webkit.Accessor.getPageFor(webviewgetEngine()).setBackgroundColor(0)
final com.sun.webkit.WebPage webPage = com.sun.javafx.webkit.Accessor.getPageFor(engine);
webPage.setBackgroundColor(0);