JRubyFXによる画面遷移とダイアログ表示
JavaFXの時もそれなりに苦労した画面遷移とダイアログ表示。
JRubyFXでも最初は勝手がわからずに試行錯誤したけど、sampleとかを見ているうちにできたので、覚書として晒しておく。
画面遷移
とりあえず、以下のような画面を2つ考えて画面遷移させてみる。
最初の画面がtop.fxmlでコントローラーはTopController、ボタンを押した時のアクションがnext_button_clicked で、次のnext.fxmlに画面遷移(同じくコントローラーはNextController)とする。
ApplicationクラスはMainクラス(main.rb)とすると、コード例は以下のとおり。
main.rb
# coding : utf-8 require 'jrubyfx' fxml_root File.dirname(__FILE__) # コントローラー require_relative 'top_controller' require_relative 'next_controller' class Main < JRubyFX::Application def start(stage) stage.title = '画面遷移テスト' stage.fxml = TopController # 最初に表示する画面 stage.show end end Main.launch
top_controller.rb
# coding : utf-8 class TopController include JRubyFX::Controller fxml 'top.fxml' # 「NEXT」ボタン押下時の処理 # ここでは、next.fxmlに画面遷移する。 def next_button_clicked # 次の画面のコントローラーを自身のステージ # (JRubyFX::Controllerをincludeしているので、@stageでアクセス可能) # に設定する。 @stage.fxml = NextController @stage.show end end
next_controller.rb
# coding : utf-8 class NextController include JRubyFX::Controller fxml 'next.fxml' end
ダイアログ表示
同じように、次はダイアログ表示の例。先ほどのtop.fxmlでnextボタンを押したときにダイアログを表示させてみる。
ダイアログは、以下のような感じ(Scene Builder 2.0の File>New from Template > Alert Dialogのまんま)。
画面遷移との違いは、以下。
- ボタン押下時のイベントハンドラで、新たにステージを作成(画面遷移の時は、自身の@stageに対して#fxml=()をセットした)してそのステージのコントローラーを設定した。
- モーダル表示にするために、新たに作成したステージのオーナーを自身のwindowに設定し、modalityを設定した。
- ダイアログを表示する際に、show ではなく、show_and_wait を使用した。
要点箇所の抜粋は以下のとおり。
def next_button_clicked # 新たにステージを作成してDialog.fxmlのコントローラーを設定する。 dialog = Stage.new(StageStyle::UTILITY) dialog.fxml = DialogController # Dialogをモーダル表示にする dialog.init_owner(@scene.window) dialog.init_modality(Modality::WINDOW_MODAL) # Dialogが閉じられるのを待つ(のかな?) dialog.show_and_wait end
全体のコードは以下のとおり。
main.rb
# coding : utf-8 require 'jrubyfx' fxml_root File.dirname(__FILE__) # コントローラー require_relative 'top_controller' require_relative 'dialog_controller' class Main < JRubyFX::Application def start(stage) stage.title = '画面遷移テスト' stage.fxml = TopController # 最初に表示する画面 stage.show end end Main.launch
top_controller.rb
# coding : utf-8 class TopController include JRubyFX::Controller fxml 'top.fxml' # 「NEXT」ボタン押下時の処理 # 今回はダイアログを表示する。 def next_button_clicked # 新たにステージを作成してDialog.fxmlのコントローラーを設定する。 dialog = Stage.new(StageStyle::UTILITY) dialog.fxml = DialogController # Dialogをモーダル表示にする dialog.init_owner(@scene.window) dialog.init_modality(Modality::WINDOW_MODAL) # Dialogが閉じられるのを待つ(のかな?) dialog.show_and_wait end end
dialog_controller.rb
# coding : utf-8 class DialogController include JRubyFX::Controller fxml 'dialog.fxml' end
こんな感じで表示される。無事にモーダル表示もされた。
今日はここまで。