【问题标题】:JavaFX - Override WebView's Cursor ChangeJavaFX - 覆盖 WebView 的光标更改
【发布时间】:2023-03-05 16:16:01
【问题描述】:

在使用 JavaFX 库在 Java 中创建自己的 Web 浏览器应用程序的过程中,我发现 WebView 倾向于覆盖其他类所做的光标更改。由于我使用的是 UNDECORATED 窗口类型,我的计划是创建一个自定义大小调整类来模拟窗口大小调整功能;这涉及将光标更改为“调整大小”类型。这确实有效,但是因为 WebView 元素没有边框并且不打算这样做;它会覆盖光标更改。我找不到 WebView 的光标更新的事件。

简而言之:如何强制更改光标(覆盖 WebView)。

注意:我试图在 WebView 修改后将光标改回来(我发现无法使用更改)但这导致了以下错误:

java.lang.StackOverflowError
at javafx.scene.Node$MiscProperties$6.invalidated(Node.java:6459)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:111)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:145)
at javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:82)
at javafx.scene.Node.setCursor(Node.java:1160)
at to.us.thedjcreeper.thelightweb.nodes.WebTab.lambda$new$1(WebTab.java:28)
at to.us.thedjcreeper.thelightweb.nodes.WebTab$$Lambda$98/1896727623.changed(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
at javafx.beans.property.ObjectPropertyBase.fireValueChangedEvent(ObjectPropertyBase.java:105)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:145)
at javafx.css.StyleableObjectProperty.set(StyleableObjectProperty.java:82)
at javafx.scene.Node.setCursor(Node.java:1160)

代码:

webView.cursorProperty().addListener((observable, oldValue, newValue) -> {
    if (ResizeHelper.resizing && oldValue != newValue) webView.setCursor(oldValue);
});

【问题讨论】:

  • 您是否可以控制 HTML 内容?
  • @VGR 是的,但是我宁愿避免修改文件的内容。

标签: java javafx webview cursor overriding


【解决方案1】:

您可以通过将 WebView 放置在 StackPane 中来添加边框,您可以在其中设置其边距。要完成光标更改,请在下方添加另一个窗格,该窗格可以提供光标并可以字段鼠标拖动事件:

double resizeBorderThickness = 6;
double cornerSize = 24;

Region n = new Region();
n.setCursor(Cursor.N_RESIZE);
n.setMinHeight(resizeBorderThickness);
Region s = new Region();
s.setCursor(Cursor.S_RESIZE);
s.setMinHeight(resizeBorderThickness);
Region e = new Region();
e.setCursor(Cursor.E_RESIZE);
e.setMinWidth(resizeBorderThickness);
Region w = new Region();
w.setCursor(Cursor.W_RESIZE);
w.setMinWidth(resizeBorderThickness);

Region nw = new Region();
nw.setCursor(Cursor.NW_RESIZE);
nw.setMinSize(cornerSize, cornerSize);
Region ne = new Region();
ne.setCursor(Cursor.NE_RESIZE);
ne.setMinSize(cornerSize, cornerSize);
Region sw = new Region();
sw.setCursor(Cursor.SW_RESIZE);
sw.setMinSize(cornerSize, cornerSize);
Region se = new Region();
se.setCursor(Cursor.SE_RESIZE);
se.setMinSize(cornerSize, cornerSize);

GridPane resizePane = new GridPane();
resizePane.addRow(0, nw, n, ne);
resizePane.addRow(2, sw, s, se);
resizePane.add(w, 0, 1);
resizePane.add(e, 2, 1);

GridPane.setHgrow(n, Priority.ALWAYS);
GridPane.setHgrow(s, Priority.ALWAYS);
GridPane.setVgrow(w, Priority.ALWAYS);
GridPane.setVgrow(e, Priority.ALWAYS);

StackPane stackPane = new StackPane(resizePane, webView);
StackPane.setMargin(webView, new Insets(resizeBorderThickness));

Scene scene = new Scene(stackPane);

【讨论】:

  • 它适用于 Java 1.8.0_111。您使用的是什么版本的 Java?
  • 我认为你不明白我的问题。我尝试了您的解决方案,但效果不佳。当悬停在链接上时,它停止了光标的更改,但是当用户调整窗口大小而不用 WebView 将其更改回来时,我需要能够将光标设置为 RESIZE 类型。我正在使用 Java 1.8.0_101。
  • 你是对的。不知何故,我完全误解了您要做什么;我很抱歉。是只覆盖 WebView 边缘的光标,还是覆盖整个 WebView 区域?
  • 仅在 WebView 的边缘。
  • 更改了答案,希望能反映您想要做的事情。
【解决方案2】:

这是内置在 WebVew 中的:

webView.getEngine().inheritCursor(false);

这将禁止 webView 更改光标并允许您修改光标。但是,我建议您仅在需要修改游标类型时将其设置为 false。

文档: https://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/InheritCursor.html

【讨论】:

  • 我似乎找不到 inheritCursor()。我正在使用 Java 1.8.0_101。此外,文档链接已损坏。
  • inheritCursor() 不是有效的 Java 方法。
猜你喜欢
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
相关资源
最近更新 更多