非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

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]

スポンサーリンク

 - Java, Kotlin