torutkのブログ

ソフトウェア・エンジニアのブログ

JythonでJavaFXプログラムを作る(Hello world編)

先日、JRubyでJavaFXプログラムを作る(Hello world編) - torutkのブログ で、JRuby環境でRubyスクリプトからJavaFX GUIを利用してHello worldな画面を表示してみました。今回は、Jython環境でPythonスクリプトからJavaFX GUIを利用してHello worldな画面を表示してみます。

JythonWindows環境にインストール

Jython公式ページから、現時点で最新のJython 2.7.0 Installerをダウンロードします。
http://www.jython.org/

Jythonのバージョンの頭2桁は、Pythonのバージョンと一致させているので、Jython 2.7.x は、Python 2.7相当となります。

このインストーラーは、Javaで実行するOS・パッケージシステム非依存のものです。
Windowsであればこのファイルをエクスプローラーでダブルクリックするとインストーラーが実行され、インストール画面が表示されます。

インストール種類を選択します。通常はStandardでよさそうです。

インストール場所を選択します。デフォルトでは次の画面のようにC:\jython2.7.0ですが、ルート直下は好みではないので、ここではC:\tools\jython2.7.0としました。

設定が一通り終わると確認画面が表示されます。Javaのバージョンは選択の余地なくインストーラが検知したもの(おそらくインストーラ自身を起動したJava)が設定されています。

インストールが終了したら、環境変数PATHにインストールディレクトリ\bin(この例では、C:\tools\jython2.7.0\bin)を追加しておきます。

動作確認のため、hello.pyを作成し実行させてみます。

print "Hello jython"
C:\work> jython hello.py 
Hello jython

JythonPythonからJavaFXを利用して画面を表示

from javafx.application import Application

class MessageBoard(Application):
    def start(self, stage):
        stage.setWidth(640)
        stage.setHeight(480)
        stage.setTitle("Hello Jython")
        stage.show()

if __name__ == "__main__":
    Application.launch(MessageBoard().class, [])

コマンドライン引数の取得は省略しています。

アニメーション

from javafx.application import Application
from javafx.scene import Group
from javafx.scene import Scene
from javafx.scene.text import Text
from javafx.animation import Interpolator
from javafx.animation import TranslateTransition
from javafx.util import Duration

class MessageBoard(Application):
    def start(self, stage):
        message = Text("Hello, world. This is Jython")

        transition = TranslateTransition(Duration.seconds(8), message)
        transition.setFromX(200);
        transition.setToX(-200);
        transition.setInterpolator(Interpolator.LINEAR)
        transition.setCycleCount(TranslateTransition.INDEFINITE)
        
        group = Group()
        group.getChildren().add(message)
        group.setLayoutY(50)
        scene = Scene(group, 200, 100)
        stage.setScene(scene)
        stage.setTitle("Hello Jython")
        stage.show()
        transition.play()

if __name__ == "__main__":
    Application.launch(MessageBoard().class, [])

はまったこと、エラー対処

可変長引数には対応していない模様

JavaFXで、Groupのコンストラクタは次です。

  • Group()
  • Group(Collection)
  • Group(Node...)

ここに、Textインスタンスを1つ指定します。

group = Group(message)

これは、

TypeError: javafx.scene.Group(): 1st arg can't be coerced to javafx.scene.Node[], java.util.Collection

とエラーになってしまいました。可変長引数は内部的には配列として扱っているからかと思います。

       group = Group()
       group.getChildren().add(message)

と書いてあげればOKでした。