Jruby에서 JavaFX+FXML

13919 단어 JRubyjrubyfxJavaFX
간단한 멀티플랫폼 GUI 애플리케이션을 만들 수 있어 살펴봤다.
원래 자바인데 귀찮은 건 귀찮지만 간단해요.
모든 코드가 아래에 있습니다.
https://github.com/kinumi/jruby-javafx-samples
sample1. 창 표시
창만 표시됩니다.
특별히 유용한 것은 없지만 간단하다.
sample1/Gemfile
source 'https://rubygems.org/'

gem 'jrubyfx'
gem 'jrubyfx-fxmlloader'
sample1/main.rb
#!jruby
#coding: utf-8

require 'bundler'
Bundler.require

class Main < JRubyFX::Application
  def start(stage)
    stage.show
  end
end

Main.launch

sample2. FXML로 화면 만들기
FXML은 JavaFX Scene Builder로 제작하면 간단합니다.그 부분은 생략되었다.
sample2/ui/hello_window.fxml
省略
FXML에 해당하는 컨트롤러를 만듭니다.
내용은 이런 느낌.
sample2/ui/hello_window.rb
#coding: utf-8

class HelloWindow
  include JRubyFX::Controller

  # 対応するFXMLファイルを、main.rbで設定したfxml_rootからの相対パスで指定する
  fxml 'hello_window.fxml'

  # FXMLのイベントハンドラと同名のメソッドを作っておくと勝手に呼んでくれる
  def on_hello_action
    # FXMLでfx:idを付与したノードはインスタンス変数として参照できる
    @txt_hello.text = 'Hello JRuby + JavaFX!!'
  end
end
main.rb 이런 느낌이에요.
sample2/main.rb
#!jruby
#coding: utf-8

require 'bundler'
Bundler.require

# FXMLを「ui」ディレクトリ以下から探すよう設定する
fxml_root File.dirname(__FILE__) + '/ui'
# コントローラ
require_relative 'ui/hello_window'

class Main < JRubyFX::Application
  def start(stage)
    # stageに表示するfxmlを指定する
    stage.fxml HelloWindow
    stage.show
  end
end

Main.launch
버튼은 텍스트 필드에 문자열을 표시합니다.

sample3. 컨트롤러 초기화 시 전송 매개 변수
이런 느낌은 파라미터를 전달할 수 있다.
sample3/ui/hello_window.rb
#coding: utf-8

class HelloWindow
  include JRubyFX::Controller

  fxml 'hello_window.fxml'

  # コンストラクタを定義しておく
  def initialize(initial_text)
    @txt_hello.text = initial_text
  end

  def on_hello_action
    @txt_hello.text = 'Hello JRuby + JavaFX!!'
  end
end
sample3/main.rb
#!jruby
#coding: utf-8

require 'bundler'
Bundler.require

fxml_root File.dirname(__FILE__) + '/ui'
require_relative 'ui/hello_window'

class Main < JRubyFX::Application
  def start(stage)
    # :initializeというオプションに、コントローラのコンストラクタに渡したい引数を配列で指定する
    stage.fxml HelloWindow, :initialize => ['click button ->']
    stage.show
  end
end

Main.launch
이런 느낌,main.rb에서 건네준 문자열을 표시합니다.

sample4. TableView 사용
이것을 사용하면 상당히 편리하다.
sample4/ui/table_view_window.rb
#coding: utf-8

class TableViewWindow
  include JRubyFX::Controller

  fxml 'table_view_window.fxml'

  # Javaのクラスを参照するためのモジュール
  # ほんとは共通モジュール的なところで定義するとよさげ
  # サンプルなので適当にここで定義する
  module J
    include_package 'javafx.beans.property'
  end

  # コンストラクタ
  def initialize
    # テーブルに表示する内容
    # JavaのObservableListを設定する
    @table.items = FXCollections.observable_list([])

    # Columnごとに、CellValueFactoryを設定する
    # JavaのサンプルではPropertyValueFactoryを使っていることが多いが、
    # JRubyだとうまくいかない。lambdaやProc.newなどで、自前で実装してやる必要があった
    # (もっとうまいやりかたがあるかもしれない。。)
    @col_name.cell_value_factory = lambda {|v| v.value.name }
    @col_address.cell_value_factory = lambda {|v| v.value.address }
    @col_tel.cell_value_factory = lambda {|v| v.value.tel }

    # とりあえずダミーデータを1000件分登録してみる
    Faker::Config.locale = :ja
    1000.times do
      name = Faker::Name.name
      address = Faker::Address.state + ' ' + Faker::Address.city + ' ' + Faker::Address.building_number
      tel = Faker::PhoneNumber.phone_number
      @table.items << TableRecord.new(name, address, tel)
    end
  end

  # テーブル1レコードぶんのデータクラス
  class TableRecord
    attr_reader :name
    attr_reader :address
    attr_reader :tel

    def initialize(name, address, tel)
      @name = J::SimpleStringProperty.new(name)
      @address = J::SimpleStringProperty.new(address)
      @tel = J::SimpleStringProperty.new(tel)
    end
  end
end

FXML로 제작된 화면에 FXML로 제작된 화면 포함
표현하기 어렵지만 사용하는 곳으로서 탭 팬의 탭을 동적으로 늘리고 싶을 때도 많다.
JavaFX에서 노드가 토로하는 곳(예를 들어 Tab의 setContentent, BorderPane의 setBottom 등)에서 컨트롤러의 실례를 삽입할 수 있다.
そのうち書く

좋은 웹페이지 즐겨찾기