2016-11-06 28 views
0

JavaFXライブラリを使用して自分のWebブラウザアプリケーションをJavaで作成する過程で、WebViewが他のクラスのカーソル変更を上書きする傾向があることがわかりました。私はUNDECORATEDウィンドウタイプを使用しているので、私の計画は、ウィンドウサイズ変更機能を模倣するカスタムサイズ変更クラスを作成することです。これは、カーソルを「サイズ変更」タイプに変更することを含む。しかし、これはうまくいきますが、WebView要素には境界線がなく、計画もしていないためです。カーソルの変更を無効にします。私はWebViewのカーソル更新のイベントを見つけることができませんでした。JavaFX - 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); 
}); 
私は(私は変更を消費する方法を発見していない)が、これは次のようなエラーが生じたのWebViewはそれを修正した後に戻って、カーソルを変更しようとしています
+0

あなたがHTMLコンテンツを制御することがありますか? – VGR

+0

@VGRはい、私はむしろファイルの内容を変更しないでください。 – TheDJCreeper

答えて

0

境界線を追加するには、余白を設定できるStackPaneにWebViewを配置します。カーソルの変更を達成するために、カーソルを提供することができ、マウスドラッグイベントをフィールドすることができたの下に別のウィンドウを追加します。これはWebVewに組み込まれています

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

これは機能しませんでした。とにかくありがとうございました。 – TheDJCreeper

+0

Java 1.8.0_111で動作します。どのJavaのバージョンを使用していますか? – VGR

+0

私はあなたが私の質問を理解するとは思わない。私はあなたの解決策を試みましたが、それはうまく機能しませんでした。リンク上でカーソルを移動するとカーソルが変化するのを止めましたが、ユーザーがWebViewを元に戻さずにウィンドウのサイズを変更したときにカーソルをRESIZEタイプに設定する必要がありました。私はJava 1.8.0_101を使用しています。 – TheDJCreeper

0

webView.getEngine().inheritCursor(false); 

これは変化するからWebViewのを禁止しますカーソルを変更してカーソルを変更できます。しかし、カーソルのタイプを変更する必要がある場合にのみ、これをfalseに設定することをお勧めします。

ドキュメント: https://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/InheritCursor.html

+0

私はinheritCursor()を見つけることができません。私はJava 1.8.0_101を使用しています。また、ドキュメントのリンクが壊れています。 – TheDJCreeper

関連する問題