JavaFXの非同期処理 [JavaFX]
前置き
前回メモした通り、Progress系のコントロールで進捗状況を逐次確認したい時は、非同期で進捗度合いを更新する必要がある。
JavaFXでは非同期処理用に、javafx.concurrent.Taskクラスが用意されている。
Taskクラスのcallメソッドに、時間が掛かる処理を実装しておき、別スレッドでそのTaskを呼び出す流れ。
Taskクラスには、updateProgressメソッドが用意されており、簡単に進捗度を更新できるようになっている。
これにより、Progressコントロールに非同期処理を実装したTaskクラスをバインドすることで、
進捗度合いをリアルタイムでモニタできるようになっている。
Taskクラスは他にも、cancelledメソッドやsucceededメソッドなど、非同期処理を制御するためのメソッドが用意されている。
SwingのSwingWorkerと使い方はほとんど同じだが、処理状況、進捗度合い、処理結果などを保持できるあたりが優秀。
画面設計
- 初期表示
- 全てのバーとインジケータを初期化
- 実行中(Start・Restartボタン)
- 第1インジケータを不確定モードにする
- 第2バーを不確定モードにする
- 非同期処理を開始 or 再開する
- 他のバーとインジケータで進捗度をモニタする
- Start・Restartボタンを非活性にする
- 停止状態(Stopボタン)
- 非同期処理を中断する
- 全てのバーとインジケータに停止時の進捗度を表示する
- 実行中はStartボタンのテキストをRestartに変更する
- Restartボタンを活性化する
- 完了
- 全てのバーとインジケータの状態を完了にする
- RestartボタンのテキストをStartに変更する
実装
FXDemo.fxmlFXDemo.kt
実行結果
初期表示実行中
停止状態
完了
ProgressBar・ProgressIndicator [JavaFX]
バブルチャートを使う [JavaFX]
前置き
JavaFXでバブルチャート表示させる。
前回の散布図と使い方はほとんど一緒。ただし、データの強弱を表現できる。
ポイントは、X軸に NumberAxis を指定する必要があること。
データの第3引数に半径を指定すると、データの強弱を表現できるようになる。
半径を指定しなかった場合には、散布図とほぼ同じ使い方になる。
今回は、半径を5段階でランダムに指定している。
実装
FXDemo.fxmlFXDemo.kt
実行結果
データに半径を指定しなかった場合
データに半径を指定した場合
散布図を使う [JavaFX]
円グラフを使う [JavaFX]
折れ線グラフを使う [JavaFX]
棒グラフを使う [JavaFX]
前置き
JavaFXで棒グラフを表示させる。
X軸とY軸を反転させると横棒グラフを表示させることも可能。(未確認)
あと、積上げ棒グラフも表現できる(当然、未確認)ので、用途に合わせて選択できる。
スキルの幅を少し拡張したかったので、今回からKotlinで実装している。
Kotlinの文法等は、他の入門サイト等で十分補完可能なので割愛。
JavaからKotlinに移行するにあたり、ハマった箇所をメモしておく。
- @FXMLで読み込むコントロールは lateinit var で宣言しておく
- initializeメソッドの引数はnull考慮にしておく
- launchメソッドの引数に自クラスを指定しておく
実装
FXDemo.fxmlFXDemo.kt
実行結果
JavaFXでダイアログ表示 [JavaFX]
前置き
バージョン:JavaFX 8u40 から導入されたコントロール。
それまではダイアログは自炊するか、SwingのJOptionPaneで各種ダイアログを呼び出すしかなかった。
いやいや。。。GUIアプリケーションなのに、こんな高頻度で使用するコントロールを初期装備してないなんて有り得ないから(;^ω^)
タイトル、ヘッダテキスト、コンテントテキスト、ボタン等々の細かい設定ができるのはSwingと同じ。
実装
FXDemo.fxmlFXDemo.java
FileChooser・DirectoryChooser [JavaFX]
前置き
ディレクトリやファイルを選択するダイアログを表示するためのコントロール。
showSaveDialogでファイル保存用のダイアログを表示することも可能。
実装
FXDemo.fxmlFXDemo.java
DatePicker [JavaFX]
前置き
日付をカレンダーから指定できる。意外と便利。
実装
FXDemo.fxmlFXDemo.java