2016-01-16 15 views
13

Próbowanie Kotlin lang i miałem wrażenie, że jest on zgodny z Java i dlatego z JavaFX i próbowałem następujące:Kotlin. Podstawowa aplikacja 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() 
    } 
} 

to jest w zasadzie taki sam jak 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(); 
    } 
} 

ale Kotlin daje błąd: wyjątek w wątku "główny" java.lang.RuntimeException: nie można utworzyć instancji aplikacji: test klasy

Odpowiedz

27

Podane próbki kodu nie są równoważne: object declaration w Kotlin jest singletonem, więc ma tylko jedną instancję skonstruowaną przez wywołanie prywatnego konstruktora podczas inicjowania klasy. JavaFX próbuje wywołać konstruktor klasy, ale nie działa, ponieważ konstruktor jest prywatny, tak jak powinien.

To, czego szukasz, to prosta deklaracja klasy, z main w jej companion object. Jeśli nie ma wyraźnych konstruktorzy są zadeklarowane, Kotlin, jak Java, wygeneruje jeden domyślny, pozwalając JavaFX instancję aplikacji:

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

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

Można też po prostu PLOP z 'zabawa main()' trochę bezpośrednio w zasięg najwyższego poziomu. – Max

+1

To działało trochę lepiej, ale wciąż było: Wyjątek w wątku "główny" java.lang.RuntimeException: Błąd: klasa TestKt $ Companion nie jest podklasą javafx.application.Application – Elavrius

+0

Myślę, że powinieneś użyć tej metody aplikacji: http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#launch (java.lang.Class,% 20java.lang.String ...). W Kotlin, który byłby 'uruchomieniem (TestKt :: class.java)' –

18
class MyApplication : Application() { 

    override fun start(primaryStage: Stage) { 

    } 
} 

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