作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将两个透明的 WebView 一个显示在另一个之上。
它们显示正常,但是,只能单击顶部 WebView 的超链接。
我的理解是,通过设置setPickOnBounds(false)
,点击顶部WebView的透明像素应该到达底部WebView。然而,它似乎确实是这样工作的,顶部的 WebView 阻止了所有点击。
有没有办法让重叠的 WebView 和超链接同时适用于两者?
示例:
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.layout.StackPane;
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 DoubleWebViews extends Application {
@Override
public void start(Stage primaryStage) {
new WebPage(primaryStage);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
static class WebPage{
WebView webViewBack = new WebView();
WebView webViewFront = new WebView();
public WebPage(Stage mainstage){
setupWebView(webViewBack, "<a href='https://www.google.com'>URL 1</a> can't be clicked!");
setupWebView(webViewFront, "<br><br><br><a href='https://www.google.com'>URL 2</a>");
StackPane root = new StackPane(webViewBack, webViewFront);
root.setPickOnBounds(false);
Scene scene = new Scene(root);
mainstage.setScene(scene);
mainstage.initStyle(StageStyle.TRANSPARENT);
}
void setupWebView(WebView webView, String html){
webView.setPickOnBounds(false); // doesn't work?
WebEngine webEngine = webView.getEngine();
webEngine.documentProperty().addListener(new DocListener(webEngine));
webEngine.loadContent("<body style='background : rgba(0,0,0,0);font-size: 70px;text-align:center;'>" + html + "</body>");
}
static class DocListener implements ChangeListener<Document>{
private final WebEngine webEngine;
public DocListener(WebEngine webEngine) { this.webEngine = webEngine;}
@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 = this.webEngine.getClass().getDeclaredField("page");
f.setAccessible(true);
com.sun.webkit.WebPage page = (com.sun.webkit.WebPage) f.get(this.webEngine);
page.setBackgroundColor((new java.awt.Color(0, 0, 0, 0)).getRGB());
} catch (Exception ignored) {}
}
}
}
}
最佳答案
我还没有找到一个优雅的解决方案,但这可行。
首先,前端WebView
webViewFront
接收到的鼠标事件需要转发到webViewBack
:
webViewFront.addEventFilter(MouseEvent.ANY, event -> webViewBack.fireEvent(event));
这将使点击、拖动等操作在两个框架上都起作用。
至于使用正确的光标,这有点棘手。只显示前面WebView
的光标。因此,我们的后面的WebView必须允许修改前面的光标:
webViewBack.cursorProperty().addListener((obs, oldCursor, newCursor) -> webViewFront.setCursor(newCursor));
现在的问题是,如果发生鼠标事件并且 webViewFront
中的该位置没有超链接,webViewFront
会不断地将其光标重置为默认值。因此,我们阻止此重置:
webViewFront.cursorProperty().addListener((obs, oldCursor, newCursor) -> {
if (newCursor != null && "DEFAULT".equals(newCursor.toString())) {
webViewFront.setCursor(webViewBack.getCursor());
}
});
这三项更改共同允许两个重叠的 WebView 以及适用于两者的超链接。
关于JavaFX Web View : ignoring setPickOnBounds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61180137/
我正在尝试将两个透明的 WebView 一个显示在另一个之上。 它们显示正常,但是,只能单击顶部 WebView 的超链接。 我的理解是,通过设置setPickOnBounds(false),点击顶部
我是一名优秀的程序员,十分优秀!