我从一个大得多的应用程序中截取了一些代码,它在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();
}
}
}
}在MacOS 10.11.6上使用Oracle的JDK进行测试:
使用JDK 1.8.0_152,这段代码可以很好地工作--我得到的是黑底白字。(当我在堆叠窗格中将东西分层时,透明度也会起作用)
在JDK9 (9+181)中,不能再访问com.sun.webkit.WebPage,所以我必须用--add-exports javafx.web/com.sun.webkit=ALL-UNNAMED编译和运行它--但是这样做之后,我在黑屏上看到了黑色文本。我可以通过选择文本并拖动它来判断文本在那里,这会使文本在被拖动时显示为白色。
理想情况下,我希望保留一个同时适用于JDK 8和JDK 9的代码库(Java通常对我来说很好,因为它具有向后兼容性)。或者作为第二个最好的选择,我如何在JDK 9中获得我所期望的白文本?
有谁能给我指个方向吗?在此之前,非常感谢您。
发布于 2018-11-06 19:03:42
我也有同样的问题,我通过深入思考解决了这个问题:
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());https://stackoverflow.com/questions/48102577
复制相似问题