【问题标题】:How to implement TornadoFX WebEngine Callback in Kotlin如何在 Kotlin 中实现 TornadoFX WebEngine 回调
【发布时间】:2017-05-21 17:09:02
【问题描述】:

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

e: surfing\src\surfing.kt: (76, 13): 修饰符 'override' 不是 适用于“局部函数”

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

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

【问题讨论】:

    标签: javafx kotlin javafx-webengine tornadofx


    【解决方案1】:

    你快到了 :) 要像在 Java 中一样创建一个匿名类,你需要在 class 语句前面使用 object 关键字:

    br.createPopupHandler = object : Callback&lt;PopupFeatures, WebEngine&gt; {

    不过,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
    }
    

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

    【讨论】:

    • 首先我很惊讶 tornadoFX 开发人员回答了我的问题。太感谢了。这个问题让我从 tornadoFX ver 1.5.7 更改为 ver1.7.5 ,结果出现其他版本问题,所以我改回 ver1.5.7 并尝试您的建议方法编译它。 BUILD SUCCESSFUL 解决了我的问题。再次感谢你:)
    • 太棒了!如果您在升级时遇到问题,可能是因为您忘记将 jvmTarget 更改为 1.8。请参阅 1.7.1 发行说明页面上的说明:github.com/edvin/tornadofx/releases/tag/v1.7.1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2018-09-05
    • 2021-07-12
    • 2021-02-06
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多