KotlinでJavaFXパートⅡ イベント処理とか変な演算子に遭遇したとか
前回の記事でAndroid Studio上でJavaFXをKotlinに変換した苦労話を書きましたが、その中でイベント処理がうまくできず前回はあきらめましたが、今回うまくいったので紹介します。あと、Kotlinに変換したら変な演算子に遭遇しました。
前回の記事
↓前回はコメントアウトで逃げた
[ad#top-1]
まず、イベント処理について
イベント処理に関して前回は僕のミスがありました。
元々のJavaのソースでイベントを設定する際に、以下のようにしてしまったために変な変換をされてしまったようです。
//誤 btn.setOnAction( event -> handleOK(new ActionEvent()) );
急場で作ったソースなのでメソッドに無名クラスを渡してしまいました。まあ、これでもコンパイルは通るんですけどね。
正しくは
//正 btn.setOnAction( event -> handleOK(event) );
ですね。
これで、Kotlinに変換されると以下のようになります。これでkotlinコンパイルは通ります。
btn.setOnAction({ event -> handleOK(event) })
コントロールを他のメソッドで使えるようにしたら変な演算子に遭遇
で、イベント処理ができることになったので、コントロールをイベント処理で操作するようにしてみました。Labelをクラス内で使えるように以下のようにしました。
(1)でlabelオブジェクトをクラス内で使えるように宣言しています。kotolinではprivateで明示しないとpablicになってしまうので注意です。あと、?=nullを入れないとコンパイルエラーが発生します。
これで行けるだろうとコンパイルしたところ以下のエラーが発生しました。上図(2)のところです。
Labelへのスマートキャストは不可能??
よくわからないので、いったんJavaでファイルを作って、前回同様にAndroid Studio上でKotlinに変換してみました。
下がJavaファイルです。赤矢印のところがどう変換されるか注目です。
これが変換後のKotlinファイル。
なんやねん「!!」て… なんやねん「!!」て!
新しい演算子「!!」に遭遇です。
ちなみにちゃんと実行できました。
「OK」ボタンを押すと以下の通り、ちゃんとLabelが「OK」という表示に変わります。
Kotlinの基本的な知識が不足しています。なんかいい教科書ないですね…。今はAndroid Studioの変換機能が手放せません。
ソースコード全文
今回のKotlinソースコードです。
import javafx.application.Application import javafx.event.ActionEvent import javafx.scene.Scene import javafx.scene.text.Font import javafx.scene.control.* import javafx.scene.layout.AnchorPane import javafx.stage.Stage class FxTest2 : Application() { private var label: Label? = null override fun start(stage: Stage) { stage.setTitle("Java Test") label = Label("Hello World") label!!.setFont(Font("Meiryo UI", 36.0)) AnchorPane.setTopAnchor(label, 26.0) AnchorPane.setLeftAnchor(label, 46.0) val btn = Button("OK") btn.setFont(Font("Meiryo UI", 18.0)) btn.setPrefWidth(95.0) btn.setPrefHeight(19.0) AnchorPane.setTopAnchor(btn, 31.0) AnchorPane.setLeftAnchor(btn, 267.0) btn.setOnAction({ event -> handleOK(event) }) val root = AnchorPane() root.setPrefWidth(400.0) root.setPrefHeight(100.0) root.getChildren().addAll(label, btn) stage.setScene(Scene(root)) stage.show() } fun handleOK(e: ActionEvent) { System.out.println(e.getSource()) label!!.setText("OK") } } fun main(args: Array<String>) { Application.launch(FxTest2()::class.java, *args) }
[ad#ad-1]
スポンサーリンク