動機
今どき、JavaやRubyでGUIのデスクトップアプリを作りたいという人は少ないかもしれませんが、CUIコマンドの引数指定を忘れた時、GUI画面があったほうがいいと思うことがあります。(Tcl/Tkで作っていた人もいたかもしれません)
Javaには、Swing、JavaFX、SWTという優れたフレームワークがありますが、ちょこちょこ修正するかもしれないことを考えると、スクリプト言語の気軽さと、使い慣れたJavaのライブラリーを組み合わせたいと思い、サンプルを作ってみました。
JRubyでJavaFXを利用すると、Rubyの手軽さと、JavaFXの美しさ、Javaの豊富なライブラリーのいいとこ取りをすることができます。
環境構築
JDK
JavaFXを利用することにします。
今は、OpenJDKなどにはJavaFXが組み込まれていません。簡単に導入するとなると、bellsoftのLiberica JDK(FULL)が手っ取り早いと思います。こちらからダウンロードしてください。https://bell-sw.com/pages/downloads/#jdk-25-lts
ダウンロードする時、以下のようにパッケージを選択できます。「FULL JDK」を選択すると、JavaFXが組み込まれたものを入手できます。
javaコマンドのあるディレクトリをPATHに通せばOKです。
JRuby
https://www.jruby.org/download からダウンロードします。
自分は、取り扱いが楽なことを想定し、Complete版を使います。 https://repo1.maven.org/maven2/org/jruby/jruby-complete/10.0.3.0/jruby-complete-10.0.3.0.jar
GEM_HOMEの設定
自分は、RubyとJRubyのどちらも利用しています。その場合、バージョンの違いによってパッケージが衝突することがあるので、JRubyのGEMは、$(HOME)/JGEMにいれるようにしています。このため、起動するときは、(Linuxの場合)
GEM_HOME=/home/XXX/JGEM java -jar jruby-complete-10.0.3.0.jar -S .....
のように指定します。
JavaFXを利用するためのgem
以下でインストールできます
GEM_HOME=/home/XXX/JGEM java -jar jruby-complete-10.0.3.0.jar -S gem install jrubyfx
実際のコード
以下の2つのファイルを jruby-fxml.rb、Hello.fxmlなどとして同じディレクトリに保存します。
Rubyスクリプト
require 'jrubyfx'
fxml_root File.dirname(__FILE__)
class HelloWorldApp < JRubyFX::Application
def start(stage)
with(stage, title: "JrubyによるFXMLテストアプリ", width: 800, height: 600) do
fxml HelloWorldController
show
end
end
end
class HelloWorldController
include JRubyFX::Controller
fxml "Hello.fxml"
def say_clicked
@hello_label.text = "ありがとうございます"
end
end
HelloWorldApp.launch
FXMLファイル
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>
<VBox alignment="CENTER" xmlns:fx="http://javafx.com/fxml">
<children>
<Label fx:id="hello_label" text="こんにちは!" underline="true">
<font>
<Font size="66.0" />
</font>
</Label>
<Button mnemonicParsing="false" onAction="#say_clicked" prefHeight="49.0" prefWidth="166.0" text="押して!!">
<font>
<Font size="23.0" />
</font>
</Button>
</children>
</VBox>
起動
以下のように起動します。
GEM_HOME=/home/XXX/JGEM java -jar jruby-complete-10.0.3.0.jar -S jruby-fxml.rb
ボタンをクリックすると
最後に
FXMLは、JavaFX Scene Builderで作れます。
JavaFXが、多くの優れたJavaライブラリーとともに、さまざまな業務アプリで利用されるといいなと思っています。


