ボタンクリック時の処理(onAction)を追加する [JavaFX]
前置き
ボタンクリック時の処理は、setOnActionメソッドで直接追加する方法と、FXMLのonActionにメソッドを指定して追加する方法がある。
どちらの方法でも良いが、どちらかに統一した方がいいと思っていて、体感では、直接追加する方法はソースを追いやすくなり、
FXMLで指定する方法ではソースがスッキリするイメージ。
実装
直接指定
FXDemo.javaFXML指定
SceneBuilderで対象のコントロールを選択して、右側のインスペクタからCodeを展開し、
On ActionにJavaで呼び出すメソッド名を指定する。
イベント発生時に、ここで指定したメソッドの処理が実行されるようになる。
Java側では@FXMLアノテーションを付与し、On Actionで指定したメソッド名でバインドする。
FXDemo.fxml
FXDemo.java
実行結果
FXMLでレイアウトを定義する [JavaFX]
前置き
自分がSwingからJavaFXへ移行する上で、一番の動機付けになっている変更点が、XMLでレイアウトを定義できるようになった所だった。
FXMLというXML形式のファイルに、コンテナにコントロールの配置を定義する。
FXMLはSceneBuilderというツールで、コントロールをドラッグアンドドロップして配置していく要領で、簡単に作成することができる。
これをクラスローダで読み込んで、コントロールに対し必要な処理部分を定義していく流れとなり、
WEBアプリケーションを作成するのに近くなったことで、MVCライクな設計が可能となる。
ということは、設計によってはWEBアプリケーションとGUIアプリケーションの資産を相互に流用することもできる。
準備
後述の手順でSceneBuilderを準備していく。ここまでいろいろと書いているが、この方の説明の方が遥かに分かり易いのでお勧め。
実装
SceneBuilderでコンテナにコントロールを配置していく。
操作が直感的に行えるので配置に関する説明は割愛するが、ポイントだけ押さえておく。
まずはfx:idについて。
コントロール毎に識別子を指定する。これがJava側でのフィールド名となる。
コントロールを選択して、右側のインスペクタからCodeを展開しfx:idにJavaでのフィールド名を指定する。
次に、Controllerクラスを指定する。
これはFXMLとJavaクラスをバインドさせるための指定で、左側のドキュメントからコントローラを展開し、
Controller classに、パッケージを含めたクラス名を指定する。
コントローラクラスに指定されたクラスは、javafx.fxml.Initializableインタフェースをimplementsする必要がある。
これによって、@FXMLアノテーションでfx:idとフィールド名をバインドさせることができる。
また、Initializableインタフェースには、initializeという抽象メソッドが用意されており、
FXMLで定義できないコントロールの処理や設定などを、文字通り初期化することができる。
以上、SceneBuilderで作成したFXMLファイルは、リソースフォルダに保存する。
コントローラクラスからgetResourceメソッドで読み込みを想定しているので、
コントローラクラスと同じパッケージを用意し、FXDemo.fxmlというファイル名で保存することにする。
FXDemo.fxml
FXDemo.java
今回は、FXMLでは定義していない初期値やボタン名を、initializeメソッドで変更してみた。
実行結果
TabPane [JavaFX]
説明
タブの選択によってコンテンツを切り替える。実装
TabPaneDemo.java実行結果
HBox・VBox [JavaFX]
説明
コントロールを追加順で水平・垂直方向に配置する。FlowPaneとは違い、ウィンドウ幅のオーバーフロー分の折り返しはない。
実装
HBoxDemo.java実行結果
ウィンドウ幅を縮めると、ウィンドウサイズに応じてコントロールのサイズが動的に変わり、配置は保たれる。
FlowPane [JavaFX]
説明
コントロールを追加順に配置する。文字通り、コントロールを流し込んでいくイメージ。
ウィンドウ幅のオーバーフロー分は、折り返して再配置される。
実装
FlowPaneDemo.java実行結果
ウィンドウ幅を縮めると、ウィンドウサイズに応じてコントロールの配置が動的に変わる。
BorderPane [JavaFX]
説明
コントロールを上・下・左・右・中心に分けて配置する。実装
BorderPaneDemo.java実行結果
JavaFXでGUIアプリケーションを創る [JavaFX]
やりたいこと
JavaでGUIアプリを創ってみる。
Javaで創っておけば、ランタイムさえあればどこでも動くし便利。
だし、コンソールアプリはやっぱり味気ない。。。
今まではSwingで創っていたけど、後追い技術の方が生産性が向上する筈なので、JavaFXに移行する。
いつの時代も、改革には痛みを伴う。
実装
今回はFXMLを適用しないやり方。FxDemo.java
実行結果
GSonを使いJSONのシリアライズとデシリアライズをするプログラムをJavaで創る [プログラミング]
やりたいこと
JSONでシリアライズとデシリアライズをしたい実装
pom.xmlJsonDemo.java
実行結果
Lombokを使いデータクラスをJavaで創る [プログラミング]
やりたいこと
Getter, Setterを作るのが面倒くさい。。。Kotlinみたいに、データクラスの作成で楽がしたい。
使い方と、余談
IntelliJとかだと、コード補完でgetXXXやsetXXXが出てこないので、プラグインのインストールが必要っぽい。
設定 > プラグイン > "lombok"で検索 > Lombokプラグインをインストール
他のIDEでも、プラグインが必要になると思う。多分。知らんけど。。。
クラスに@Dataアノテーションを付与すると、データクラスとなりフィールドの定義だけで Getter、Setterが勝手に作成される。(実装不要)
今からJVM言語の学習を始めるなら、JavaよりもKotlinがお勧め。
そもそもLombokも使う必要がないし、型推論や、データクラス定義の標準装備など、モダン言語は生産性が爆上がりw
Javaにもバージョンによっては型推論があるけど、どうせIDEにプラグインが必要になるだろうし、色々と面倒くさい。(未検証)
実装
pom.xmlLombokDemo.java
実行結果
Apache POIを使いExcelファイルを読み込むプログラムをJavaで創る [プログラミング]
やりたいこと
Excelファイルからデータを読み込みたい※ 前回 作ったExcelファイルを読み込むだけのプログラムを作成する
参考
Apache POIを使いExcelファイルに書き込むプログラムをJavaで創る実装
pom.xmlPoiReadDemo.java