gikoha’s blog

個人的メモがわり

eclipse to IntelliJ IDEA (Java 1.3-6 Project)

ターゲットのJVMバージョン1.5-1.6で動作するプログラムを作るとき、これまでは eclipse+ WindowBuilderが定番だったが、 IntelliJ IDEAでは formを読ませることで WindowBuilderの代わりをするらしい(IDEが$$$setup$$$とかをソースで埋め込むかバイナリで埋め込むかをPreferences>Editor>GUI Designerから選んでおくこと)

まず New Projectから Javaを選択しProjectを作る

Project structure画面からsrcを右クリックし packageを作る

f:id:gikoha:20180910214355j:plain

main view classは extends JFrameとする

main view classから右クリックし、同じ名前のGUI Formを作る

bind classを新規に作らない場合には必ずbindしておくこと

まっさらなJPanelができる

f:id:gikoha:20180910214417j:plain

コンポーネントをつめこむ  GridLayoutManager (IntelliJ)はコンポーネントを長くしたい場合横方向や縦方向にRow/Columnをつなげることで長くできる

f:id:gikoha:20180910214531j:plain

ロジックを書き込んで pack()等を忘れずにコンストラクタに記述する

f:id:gikoha:20180910214612j:plain

そんでもってうまくいきました

f:id:gikoha:20180910214702j:plain

apache poi使った。

こりゃ本格的にeclipse不要になってきたな..

 

経過表

大学病院勤務時代は、経過表を教授回診前にボードに色鉛筆で記入し血圧・薬剤について一目でわかるようにグラフにしていたものだった。

同様にプレゼン等でも特に薬剤などは一目でわかるようにしたい

例:

http://idsc.nih.go.jp/iasr/rapid/graph/pf33241.gif

薬剤が単剤であればそれほど問題ないが、漸増や漸減したときにうまく量を表現したい

 

kotlin+TornadeFX(JavaFX)

val bc = barchart("Patient",CategoryAxis(), NumberAxis())
bc.isLegendVisible=false
bc.barGap=0.0
bc.categoryGap=0.0
bc.isHorizontalGridLinesVisible=false
bc.isVerticalZeroLineVisible=false
bc.isHorizontalZeroLineVisible=false


val ser = XYChart.Series<String,Number>()

ser.name = drugHdr[i]
for(j in 1..maxColumn)
{
ser.data.add(XYChart.Data(columnName[j], numdata[i][j]))
}
bc.data.add(ser)


vbox += bc

結果

f:id:gikoha:20180906120202j:plain

グラフがいまいちカスタマイズしづらい

 

R

 

# quartz(type="pdf",width=7,height=5,file="hoge.pdf")
y  = c(1.25, 2.5, 3.75, 5.0, 5.0)
x <- seq_along(y)
y2 <- rep(y, each=2)
y2 <- y2[-length(y2)]
x2 <- rep(x, each=2)[-1]
x3 <- c(min(x2), x2, max(x2))
y3 <- c(0, y2, 0)
plot(x, y, ylim=c(0, max(y)), type="n", bty="n", xlab="",ylab="",axes=F)
polygon(x3, y3, border=1, col="grey")
# dev.off()

 結果

f:id:gikoha:20180906120828j:plain

こっちのほうが編集に使いやすいのでこっちにした

手書きのほうが速いってのはお約束 

JavaFX chart on TornadeFX/kotlin

子供の自由研究結果をグラフにするソフトを書いた

 

f:id:gikoha:20180829163921j:plain

 

はじめの美しくないやりかた 

vbox += barchart("氷の溶ける早さ",CategoryAxis(), NumberAxis())
{
series(header[1]) {
data(serHdr[1],numdata[1][1])
data(serHdr[2],numdata[2][1])
data(serHdr[3],numdata[3][1])
data(serHdr[4],numdata[4][1])
}
series(header[2]) {
data(serHdr[1],numdata[1][2])
data(serHdr[2],numdata[2][2])
data(serHdr[3],numdata[3][2])
data(serHdr[4],numdata[4][2])
}
series(header[3]) {
data(serHdr[1],numdata[1][3])
data(serHdr[2],numdata[2][3])
data(serHdr[3],numdata[3][3])
data(serHdr[4],numdata[4][3])
}
series(header[4]) {
data(serHdr[1],numdata[1][4])
data(serHdr[2],numdata[2][4])
data(serHdr[3],numdata[3][4])
data(serHdr[4],numdata[4][4])
}
}

こうかけばよかった

val bc = barchart("氷の溶ける早さ",CategoryAxis(), NumberAxis())

for(i in 1..4)
{
val ser = XYChart.Series<String,Number>()
ser.name = header[i]
for(j in 1..4)
{
ser.data.add(XYChart.Data(serHdr[j], numdata[j][i]))
}

bc.data.add(ser)
}
vbox += bc

 

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よりかなり簡単にグラフ化できるのでよさげ。