如何在Kotlin

时间:2017-05-21 04:23:26

标签: javafx kotlin javafx-webengine tornadofx

我正在使用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
            }
        })

我一直在互联网上搜索很长时间,但我没有找到任何东西。请有人帮我解决这个错误。

1 个答案:

答案 0 :(得分:1)

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

我还没有真正评估过你在这里做了什么,或者这是一个好主意,所以只接受我对语法的建议:)