2016-01-16 2 views
13

Kotlin lang dışarı çalışıyorum ve bunu Java ile uyumlu olduğuna dair bir izlenim vardı ve bu nedenle JavaFX ile ve i şu çalıştı:Kotlin. Temel JavaFX uygulaması

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

bu Java'nın

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

ancak temelde aynıdır Kotlin bir hata verir: "ana" java.lang.RuntimeException iş parçacığında özel durum: Uygulama örneği yapılamıyor: sınıf Test

cevap

27

Sağladığınız kod örnekleri eşdeğer değil: birKotlin'dekitekildir, bu nedenle sınıf başlatıldığında özel kurucuyu çağırarak yalnızca bir örneği vardır. JavaFX, sınıfın yapıcısını yansıtıcı olarak çağırmaya çalışıyor ancak yapıcı olması gerektiği gibi özel olduğu için başarısız oluyor.

Onun yerine neler görüyorsanız, main, companion object ürününde basit bir sınıf beyanıdır.

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

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

Ayrıca sadece doğrudan 'eğlenceli ana()' bit lop edebilirsiniz: hayır açık kurucular beyan durumunda, Kotlin, Java gibi, JavaFX uygulama örneğini sağlayan varsayılan bir tane üretecektir Üst düzey kapsam da. – Max

+1

Biraz daha iyi çalıştı, ancak hala vardı: "ana" java.lang.RuntimeException iş parçacığında özel durum: Error: class TestKt $ Companion javafx.application.Application bir alt sınıf değil – Elavrius

+0

Bence bu uygulama yöntemini kullanmalısınız: http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#launch (java.lang.Class,% 20java.lang.String ...). Kotlin'de lansman yapılacaktı (TestKt :: class.java) ' –

18
class MyApplication : Application() { 

    override fun start(primaryStage: Stage) { 

    } 
} 

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