2013-02-01 36 views
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。

+0

爲什麼不執行以scale值作爲參數的JS函數? –

+0

老實說,我不知道這樣的功能,它是一個標準的JS或Webkit特定的? – Dreen

+0

他們倆。 Webkit引擎可以處理的任何JS代碼。我的意思是嘗試在