如何在Kotlin中实现TornadoFX WebEngine回调

我正在使用Kotlin TornadoFX创建一个浏览器。 当我实现WebEngine setCreatePopupHandler时,我得到一个错误:

e:surfing \ src \ surfing.kt:(76,13):修饰符“覆盖”不适用于“本地功能”

e:surfing \ src \ surfing.kt:(76,13):期望WebEngine类型的值!

我使用JavaFX引用了这个Java代码:

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(); } }); 

翻译成Kotlin使用TornadoFX:

 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 } }) 

我在网上搜索了很长时间,但是我没有找到任何东西。 请有人可以帮我解决这个错误。

你几乎在那里:)要创建一个匿名类,就像在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 } 

我还没有真正评估你在这里做什么或如果这是一个好主意,所以只能采取我的意见的语法:)