2016-01-16 21 views
13

Kotlin LANGを試して、私はそれがJavaFXのでJavaと互換性があり、そのためであるという印象を持っていたし、私は、次の試してみました:Kotlin。基本的な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() 
    } 
} 

これは、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(); 
    } 
} 

と基本的に同じですが、 Kotlinはエラーを出します:スレッド "main"の例外java.lang.RuntimeException:アプリケーションインスタンスを構築できません:クラスTest

答えて

27

あなたが提供したコードサンプルは等価ではありません:Kotlinのはシングルトンなので、クラスの初期化時にプライベートコンストラクタを呼び出すことで1つのインスタンスしか構築されません。 JavaFXはクラスのコンストラクタを反映するようにしようとしていますが、コンストラクタはプライベートであるため失敗します。

代わりに探しているのは、maincompanion objectである単純なクラス宣言です。明示的なコンストラクタが宣言されていない場合は、JavaのようなKotlinは、JavaFXのアプリケーションをインスタンス化することができ、デフォルトのものを生成します:

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

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

あなたはまた、単にで直接 '楽しいのmain()'ビットをウンチすることができますトップレベルのスコープもあります。それは少し良く働いていたが、それでも持っていた – Max

+1

:スレッドの例外「メイン」java.lang.RuntimeException:エラー:クラスTestKt $コンパニオンは、私はあなたがアプリケーションのこの方法を使うべきだと思うjavafx.application.Application – Elavrius

+0

のサブクラスではありません。 http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#launch(java.lang.Class、%20java.lang.String ...)。 Kotlinは 'launch(TestKt :: class.java)' –

18
class MyApplication : Application() { 

    override fun start(primaryStage: Stage) { 

    } 
} 

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