2017-05-21 4 views
0

Ich benutze Kotlin TornadoFX, um einen Browser zu erstellen. Als ich WebEngine setCreatePopupHandler implementieren, bekomme ich einen Fehler:Wie man TornadoFX WebEngine Callback in Kotlin implementiert

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!

verweisen ich diesen Java-Code mit 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(); 
      } 
    }); 

in Kotlin übersetzt TornadoFX zu verwenden:

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

ich gewesen sein Ich habe lange im Internet gesucht, aber nichts gefunden. Bitte kann mir jemand helfen, diesen Fehler zu beheben.

Antwort

0

Sie sind fast da :) Um eine anonyme Klasse die gleiche Weise, die Sie tun in Java zu erstellen, müssen Sie das object Schlüsselwort vor der Klasse Anweisung:

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

jedoch Mit Kotlin können Sie SAM-Typen in Lambdas umwandeln. Sie können auch das Eigenschaftszugriffsmuster und unveränderliche Werte verwenden, um den Code ein wenig zu bereinigen. Hier ist eine der Code neu geschrieben und 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 
} 

Ich habe nicht wirklich ausgewertet, was Sie hier tun oder ob das eine gute Idee ist, so nehmen Sie nur meinen Rat über die Syntax :)

+0

Zuerst habe ich bin sehr überrascht TornadoFX Entwickler meine Frage zu beantworten. ich danke dir sehr. Dieses Problem ließ mich von TornadoFX ver 1.5.7 ändern, um ver1.7.5, Ergebnis ouccer andere ver Problem, so dass ich wieder ver1.5.7 ändern und versuchen Sie Ihre Beratung Methode kompilieren. BUILD SUCCESSFUL hat mein Problem gelöst. danke nochmal :) –

+0

Großartig! Wenn Sie Probleme beim Aktualisieren haben, liegt es wahrscheinlich daran, dass Sie vergessen haben, jvmTarget auf 1.8 zu ändern. Weitere Informationen finden Sie auf der Release-Notes-Seite 1.7.1: https://github.com/edvin/tornadofx/releases/tag/v1.7.1 –

+0

So ist es. Ich verstehe bald nach Ihrer Erklärung. Danke! –

Verwandte Themen