JavaFX WebView用法,透明背景,jdk8 vs jdk9

时间:2018-01-04 19:53:09

标签: javafx-8 javafx-webengine javafx-9

我从一个更大的应用程序中删除了一些代码,它在JavaFX WebView中的黑色背景上呈现了一些白色文本。使用Transparent background in the WebView in JavaFX

中的一些代码将页面的背景颜色设置为透明
import java.lang.reflect.Field;
import org.w3c.dom.Document;
import com.sun.webkit.WebPage;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class TestWebView extends Application {

  public void start(Stage stage) throws Exception {
    StackPane stackpane = new StackPane();
    Scene scene = new Scene(stackpane, stage.getWidth(), stage.getHeight(), Color.BLACK);
    stage.setScene(scene);
    scene.setFill(Color.BLACK);
    stackpane.setStyle("-fx-background-color: BLACK");
    WebView webview = new WebView();
    stackpane.getChildren().add(webview);
    WebEngine webengine = webview.getEngine();
    webengine.documentProperty().addListener(new WebDocumentListener(webengine));
    webengine.loadContent("<p style='color:white'>Hello World</p>");
    stage.show();
  }

  public static void main(String[] args) {
    launch(args);
  }

  protected class WebDocumentListener implements ChangeListener<Document> {
    private final WebEngine wdl_webEngine;

    public WebDocumentListener(WebEngine webEngine) {
      wdl_webEngine = webEngine;
    }

    @Override
    public void changed(ObservableValue<? extends Document> arg0, Document arg1, Document arg2) {
      try {
        Field f = wdl_webEngine.getClass().getDeclaredField("page");
        f.setAccessible(true);
        com.sun.webkit.WebPage page = (WebPage) f.get(wdl_webEngine);
        page.setBackgroundColor((new java.awt.Color(0, 0, 0, 0)).getRGB());
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

使用Oracle的JDK在MacOS 10.11.6上进行测试:

使用JDK 1.8.0_152,这段代码很好用 - 我得到黑色的白色文字。 (当我在堆栈窗格中将它下面的东西分层时,透明度也会起作用)

使用JDK 9(9 + 181),com.sun.webkit.WebPage不再可访问,因此我必须使用--add-exports javafx.web/com.sun.webkit=ALL-UNNAMED编译并运行它 - 但是这样做了,我得到了一个黑色文本黑屏。我可以通过选择文本并将其拖动来判断文本是否存在,这使得文本在被拖动时显示为白色。

理想情况下,我希望保留一个适用于JDK 8和9的单一代码库。(Java通常对我有好处,具有向后兼容性)。或者作为第二好的,如何获得我在JDK 9中期待的白色文本?

有人能指出我正确的方向吗?非常感谢提前。

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我通过进一步思考来解决了这个问题:

Field f = webEngine.getClass().getDeclaredField("page");
f.setAccessible(true);
Object page = f.get(webEngine);
Method m = page.getClass().getMethod("setBackgroundColor", int.class);
m.setAccessible(true);
m.invoke(page, (new java.awt.Color(0, 0, 0, 0)).getRGB());