一點紅中原
一點紅中原

Reputation: 3

How to implement TornadoFX WebEngine Callback in Kotlin

I am using Kotlin TornadoFX to create a browser. When I implement WebEngine setCreatePopupHandler, I get an error:

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!

I referenced this Java code using JavaFX:

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

Translated into Kotlin to use 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
            }
        })

I have been searching for a long time on the internet, but I didn't find anything. Please can somebody help me fix this error.

Upvotes: 0

Views: 1025

Answers (1)

Edvin Syse
Edvin Syse

Reputation: 7297

You're almost there :) To create an anonymous class much the same way you do in Java, you need to use the object keyword in front of the class statement:

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

However, Kotlin allows you to turn SAM types into lambdas. You can also utilize the property access pattern and immutable values to clean up the code a little. Here is a the code rewritten and 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
}

I haven't really evaluated what you're doing here or if that's a good idea, so only take my advice on the syntax :)

Upvotes: 1

Related Questions