2017-05-21 40 views
0

我正在使用Kotlin TornadoFX創建瀏覽器。當我實現WebEngine setCreatePopupHandler,我得到一個錯誤:如何在Kotlin中實現TornadoFX WebEngine回調

webEngine.setCreatePopupHandler(
      new Callback<PopupFeatures, WebEngine>() { 
       @Override 
       public WebEngine call(PopupFeatures config) { 
        smallView.setFontScale(0.8); 
        if (!toolBar.getChildren().contains(smallView)) { 
         toolBar.getChildren().add(smallView); 
        } 
       return smallView.getEngine(); 
      } 
    }); 

翻譯成科特林使用TornadoFX:

e: surfing\src\surfing.kt: (76, 13): Modifier 'override' is not applicable to 'local function'

e: surfing\src\surfing.kt: (76, 13): Expected a value of type WebEngine!

我使用JavaFX引用這個Java代碼

var wv = webview() 
val br = wv.getEngine() 
br.setCreatePopupHandler(Callback<PopupFeatures, WebEngine>() { 
      override fun call(pf: PopupFeatures): WebEngine { 
       var smallView = webview() 
       val stage = Stage(StageStyle.UTILITY) 
       stage.setScene(Scene(smallView)) 
       stage.show() 
       val engine = smallView.getEngine() 
       return engine 
      } 
     }) 

我一直在互聯網上搜索了很長時間,但我沒有找到任何東西。請有人可以幫我解決這個錯誤。

回答

0

就快:)要創建一個匿名類多,你在Java中做同樣的方式,你需要使用object關鍵字在類聲明的前面:

br.createPopupHandler = object : Callback<PopupFeatures, WebEngine> {

然而, Kotlin允許您將SAM類型轉換爲lambda表達式。您還可以利用屬性訪問模式和不可變的值來清理代碼。下面是一個代碼重寫Kotlinified:

val wv = webview() 
val br = wv.engine 
br.setCreatePopupHandler { 
    val smallView = webview() 
    val stage = Stage(StageStyle.UTILITY) 
    stage.scene = Scene(smallView) 
    stage.show() 
    smallView.engine 
} 

我還沒有真正評估你在這裏做什麼或者如果這是一個好主意,所以只需要在語法:)

+0

首先我我的建議我非常驚訝tornadoFX開發人員回答我的問題。非常感謝。這個問題讓我從tornadoFX ver 1.5.7更改爲ver1.7.5,導致了其他版本的問題,於是我改回了ver1.5.7並嘗試了你的建議方法編譯它。建立成功解決了我的問題。再次感謝你:) –

+0

太棒了!如果您在升級時遇到問題,可能是因爲您忘記將jvmTarget更改爲1.8。請參閱1.7.1發行說明頁面上的說明:https://github.com/edvin/tornadofx/releases/tag/v1.7.1 –

+0

就這樣。我對你的解釋很快就會明白。謝謝! –