[Python] 296 Jython 03 FXMLファイルの読み込み

軽い気持ちで取りかかったら見事にハマりました。

なかなか解決しなかったのは、launchメソッドの2番目の引数とFXMLファイルのパスの書き方です。

いわゆるヌルポ(NullPointerException)から脱するため、Thread.currentThread().getStackTrace()を走らせたり色々調べても解決の糸口を見出せず。

結局、引数はsys.argv、パスはプロジェクトディレクトリ直下の絶対パスでした。JavaではMainファイルからの相対パスになります(スラッシュなしのファイル名のみ)。スラッシュの有り無しは全く意識してませんでした。

EclipseからPyCharmに検討環境を移す寸前でStackOverFlowの英語版にヒントを見つけました。またしても海外のギークに助けられました。

GUI内のカタカナなど2バイト文字が明らかに中華系フォントなので、別途フォント指定が必要ですね。

from javafx.application import Application
from javafx.fxml import FXMLLoader
from javafx.scene import Scene
import sys

class JythonJavafx(Application):
    def start(self, stage):
        root = FXMLLoader.load(self.getClass().getResource('/test.fxml'))
        stage.setScene(Scene(root, 300, 125))
        stage.setTitle("CHARACTER CODE CONVERTOR")
        stage.show()

if __name__ == "__main__":
    Application.launch(JythonJavafx().__class__, sys.argv)
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="125.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
    <center>
        <Label text="FXML ロード成功" BorderPane.alignment="CENTER" />
    </center>
</BorderPane>