2016-01-16 18 views
13

Provare Kotlin Lang e ho avuto l'impressione che sia compatibile con Java e quindi con JavaFX e ho cercato seguenti:Kotlin. domanda di base JavaFX

public object TestKt: Application() { 

    public override fun start(stage: Stage){ 
     val pane= Pane() 
     val scene=Scene(pane,200.0,200.0) 
     stage.scene = scene 
     stage.show() 

    } 
    @JvmStatic public fun main(args: Array<String>){ 
     launch() 
    } 
} 

Questo è fondamentalmente uguale a Java

public class Test extends Application { 
    @Override 
    public void start(Stage stage) { 
     Pane pane=new Pane(); 
     Scene scene=new Scene(pane, 200,200); 
     stage.setScene(scene); 
     stage.show(); 
    } 
    public static void main(String[] args){ 
     launch(); 
    } 
} 

ma Kotlin dà un errore: Eccezione nel thread "main" java.lang.RuntimeException: Impossibile costruire l'istanza dell'applicazione: class Test

risposta

27

Gli esempi di codice che hai fornito non sono equivalenti: uno object declaration in Kotlin è un singleton, quindi ha solo un'istanza costruita chiamando il costruttore privato quando la classe è inizializzata. JavaFX sta cercando di chiamare il costruttore della classe in modo riflessivo, ma non riesce perché il costruttore è privato come dovrebbe essere.

Quello che si sta cercando invece è una semplice dichiarazione di classe, con il main nel suo companion object. Se non costruttori espliciti vengono dichiarati, Kotlin, come Java, genererà un uno di default, permettendo JavaFX per istanziare l'applicazione:

class Test : Application() { 
    override fun start(stage: Stage) { 
     ... 
    } 

    companion object { 
     @JvmStatic 
     fun main(args: Array<String>) { 
      launch(Test::class.java) 
     } 
    } 
} 
+1

si può anche solo plop il divertimento principale() 'po' direttamente in ambito di alto livello, anche. – Max

+1

Ha funzionato un po 'meglio, ma aveva ancora: Eccezione nel thread "main" java.lang.RuntimeException: Errore: class TestKt $ Companion non è una sottoclasse di javafx.application.Application – Elavrius

+0

Penso che dovresti usare questo metodo di Applicazione: http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#launch (java.lang.Class,% 20java.lang.String ...). In Kotlin sarebbe 'launch (TestKt :: class.java)' –

18
class MyApplication : Application() { 

    override fun start(primaryStage: Stage) { 

    } 
} 

fun main(args: Array<String>) { 
    Application.launch(MyApplication::class.java, *args) 
}