No Bugs, No Life

読んだ本や、プログラミング、システム開発等のねたを中心に。文章を書く練習なので少し硬派に書くつもりだけど、どうなることやら。

JRubyFXによる画面遷移とダイアログ表示

JavaFXの時もそれなりに苦労した画面遷移とダイアログ表示。
JRubyFXでも最初は勝手がわからずに試行錯誤したけど、sampleとかを見ているうちにできたので、覚書として晒しておく。

画面遷移

とりあえず、以下のような画面を2つ考えて画面遷移させてみる。
f:id:kazyury:20141231170127p:plainf:id:kazyury:20141231170145p:plain
最初の画面が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のまんま)。
f:id:kazyury:20141231173142p:plain

画面遷移との違いは、以下。

  • ボタン押下時のイベントハンドラで、新たにステージを作成(画面遷移の時は、自身の@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

こんな感じで表示される。無事にモーダル表示もされた。
f:id:kazyury:20141231174643p:plain

今日はここまで。