3
我在全屏中使用WebView
來顯示固定尺寸爲1024x768
的內容,因此我需要對其進行縮放以便從屏幕的頂部延伸到底部。爲了實現這個目標,我已經把下面的代碼在我的控制器的initialize()
:在JavaFX的WebView中使用JavaScript設置任意CSS規則
this.wv.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
public void changed(ObservableValue<? extends State> ov, State oldState, State newState)
{
if (newState == State.SUCCEEDED)
{
wv.requestFocus();
wv.getEngine().setUserStyleSheetLocation(getClass().getResource("/css/user.css").toExternalForm());
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
Element maincontainer = (Element) wv.getEngine().executeScript("document.getElementById('pbody')");
maincontainer.setAttribute("style", String.format("-webkit-transform: scale(%.5f)", (primaryScreenBounds.getHeight()/768.0)));
}
else if (newState == State.FAILED)
{
//.
}
}
});
在user.css
加載罰款,並參考這裏的CSS代碼如下:
body {
overflow-x: hidden;
background-color: #ccc;
}
#pbody {
margin: 0 auto;
-webkit-transform-origin: top center;
}
在HTML body標籤肯定有一個id:
<body id="pbody">
的問題是,由於某種原因,#pbody
沒有被javascript的一點發現,T herefore產生以下錯誤:
java.lang.NullPointerException
at com.mediacitizens.companyapp.presentation.desktop.SlideshowController$1.changed(SlideshowController.java:165)
at com.mediacitizens.companyapp.presentation.desktop.SlideshowController$1.changed(SlideshowController.java:1)
at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:196)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:100)
at javafx.beans.property.ReadOnlyObjectWrapper$ReadOnlyPropertyImpl.fireValueChangedEvent(ReadOnlyObjectWrapper.java:195)
at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:161)
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:130)
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:163)
at javafx.scene.web.WebEngine$LoadWorker.updateState(WebEngine.java:975)
at javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1086)
at javafx.scene.web.WebEngine$LoadWorker.access$600(WebEngine.java:968)
at javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:955)
at com.sun.webpane.platform.WebPage.fireLoadEvent(WebPage.java:2372)
at com.sun.webpane.platform.WebPage.fwkFireLoadEvent(WebPage.java:2220)
at com.sun.webpane.webkit.network.URLLoader.twkDidFinishLoading(Native Method)
at com.sun.webpane.webkit.network.URLLoader.access$1300(URLLoader.java:42)
at com.sun.webpane.webkit.network.URLLoader$6.run(URLLoader.java:657)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
at java.lang.Thread.run(Thread.java:722)
的SlideshowController.java:165
是行:
maincontainer.setAttribute("style", String.format("-webkit-transform: scale(%.5f)", (primaryScreenBounds.getHeight()/768.0)));
我無法理解這種行爲背後的原因。
更新:我試着等待文件加載但它不擦出火花,首先我把這個內容手動:
<script>
function scaleBody(scale)
{
alert(3);
document.getElementById('pbody').style.webkitTransform = "scale("+scale+")";
}
</script>
,然後,使用狀態變化監聽器:
double scale = Screen.getPrimary().getVisualBounds().getHeight()/768.0;
wv.getEngine().executeScript(String.format("alert(1); window.onload = function(){ alert(2); scaleBody(%.5f); }", scale));
只有alert(1)
實際火災不會產生錯誤...
...仍然不知道如何在JavaFX中執行js。
爲什麼不執行以scale值作爲參數的JS函數? –
老實說,我不知道這樣的功能,它是一個標準的JS或Webkit特定的? – Dreen
他們倆。 Webkit引擎可以處理的任何JS代碼。我的意思是嘗試在