Jruby에서 JavaFX+FXML
원래 자바인데 귀찮은 건 귀찮지만 간단해요.
모든 코드가 아래에 있습니다.
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 등)에서 컨트롤러의 실례를 삽입할 수 있다.
そのうち書く
Reference
이 문제에 관하여(Jruby에서 JavaFX+FXML), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kinumi/items/c7ebca536266d1df99ff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)