2016-11-06 1 views
0

Bei der Erstellung meiner eigenen Web-Browser-Anwendung in Java mit der JavaFX-Bibliothek habe ich festgestellt, dass WebView Cursor-Änderungen von anderen Klassen tendenziell überschreibt. Da ich einen UNDECORATED-Fenstertyp verwende, möchte ich eine benutzerdefinierte Größenänderungsklasse erstellen, um die Fenstergrößenanpassung zu simulieren. Dazu muss der Cursor auf den Typ "RESIZE" geändert werden. Dies funktioniert jedoch, da das WebView-Element keinen Rahmen hat und nicht geplant ist; Es überschreibt die Cursoränderung. Ich konnte kein Ereignis für die Cursoraktualisierung von WebView finden.JavaFX - überschreiben WebView Cursor ändern

Kurz gesagt: Wie kann ich den Cursor (überschreiben WebView) gewaltsam ändern.

Anmerkung: Ich habe versucht, den Cursor zu ändern zurück nach WebView modifiziert sie (ich fand keinen Weg, um die Änderung zu konsumieren), aber dies führte zu dem folgenden Fehler:

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) 

Code:

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

Haben Sie die Kontrolle über den HTML-Inhalt haben? – VGR

+0

@VGR Ja, aber ich würde lieber vermeiden, den Inhalt der Datei zu ändern. – TheDJCreeper

Antwort

0

Sie können einen Rahmen hinzufügen, indem Sie das WebView in einem StackPane platzieren, wo Sie seinen Rand festlegen können. Um den Cursor Änderung zu erreichen, fügen Sie eine weitere Scheibe, unter dem Sie den Cursor zur Verfügung stellen kann und Ziehen mit der Maus Ereignisse Feld:

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); 
+0

Dies hat nicht funktioniert. Trotzdem danke. – TheDJCreeper

+0

Es funktioniert für mich in Java 1.8.0_111. Welche Version von Java verwenden Sie? – VGR

+0

Ich glaube nicht, dass Sie meine Frage verstehen. Ich habe deine Lösung versucht, aber es hat nicht ganz funktioniert. Es hat den Cursor daran gehindert, sich zu ändern, wenn ich auf einer Verbindung schwebte, aber ich musste den Cursor auf den RESIZE-Typ setzen können, wenn der Benutzer die Größe des Fensters ändert, ohne dass das WebView es zurück ändert. Ich benutze Java 1.8.0_101. – TheDJCreeper

0

Das in WebVew gebaut:

webView.getEngine().inheritCursor(false); 

Dies wird die webView nicht zulassen ändert die Cursor und ermöglichen Ihnen, den Cursor zu ändern. Ich würde jedoch vorschlagen, dass Sie dies nur auf false setzen, wenn Sie den Cursortyp ändern müssen.

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

+0

Ich kann nicht finden, dass inheritCursor(). Ich benutze Java 1.8.0_101. Außerdem ist der Dokumentationslink unterbrochen. – TheDJCreeper