gikoha’s blog

個人的メモがわり

TornadoFX Kotlin

swiftはxcodeだけあり iPhone, macOS両対応

kotlinはAndroid Studio事例はたくさんあるが、desktop appの作成はうまくいかないらしい

JavaFXをコールするにしてもいろいろ面倒くさい

WindowBuilderみたいなのはないので、TornadoFXでwrapしてScenebuilderをダウンロードして使うのがいいらしい

 

以下導入

Terminal から "brew install gradle" "brew install maven32" で開発ツールインストールしておく

JDKが入っていなければ1.8以降をインストール

Android Studioとは別に

www.jetbrains.com

をインストール

Pluginsの下の真ん中のボタン Browse respositories...から TornadoFXプラグインをインストール

New Project...から TornadoFX - tornadofx-gradle-projectを選ぶ

初回 gradle homeがないといってくるので 

/usr/local/Cellar/gradle/4.9/libexec/

あたりを指定

make: Buildボタン コマンドラインなら "gradle build"

実行:まずRunメニューのEdit Configurations...から + を押したあと、Gradleを選び、Gradle Projectに現在のプロジェクトを選び、Tasksに"run"と入力する。すると下記のようになって実行ボタンが使える  コマンドラインなら "gradle run"

f:id:gikoha:20180828111717j:plain

 

fxmlのサンプル

下記にfxmlを入れる src/main/resources/PACKAGES/ そうするとAnchorPane by fxml()で読み込めるし gradleでもリソース扱いされてファイルが無視されない

f:id:gikoha:20180828121756j:plain

fxmlの実際:fx:controller attributeがAnchorPaneタグ内に入っているとjavafx exception : Controller value already specifiedエラーが出るので削除すること。IDEならScenebuilderがビルトインされていて編集が容易。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Button layoutX="172.0" layoutY="121.0" mnemonicParsing="false" onAction="#increment" text="Click here to Increment" />
<Label layoutX="135.0" layoutY="70.0" text="Counter: " />
<Label fx:id="counterLabel" layoutX="219.0" layoutY="70.0" prefHeight="17.0" prefWidth="66.0" text="0" />
</children>
</AnchorPane>

読み込む方の実際 MainView.kt

package com.hatenablog.gikoha.view

import tornadofx.*
import javafx.scene.layout.*
import javafx.scene.control.*
import javafx.beans.property.SimpleIntegerProperty

class MainView : View("Hello TornadoFX FXML") {
override val root : AnchorPane by fxml()
val counter = SimpleIntegerProperty()
val counterLabel: Label by fxid()

init {
counterLabel.bind(counter)
}

fun increment() {
counter.value += 1
}
}

jarの作成: "gradle jar" で/build/libs以下にjarができる。でもでかい。

Charts · edvin/tornadofx Wiki · GitHubなどはkotlinならjavaよりかなり簡単にグラフ化できるのでよさげ。