JavaFx 2.x はじめました

半年くらい前に JavaFx 2.x のちょっとしたサンプルを作った程度でした。
アプリを作る必要があったので、JavaFx に再チャレンジしてます。

まずは簡単なサンプルをつくる

入門系のサイトのサンプルコードを拝借しながら Groovy で書いてます。

class Sample extends Application {

    @Override
    void start(Stage stage) {
        stage.title = "Sample"

        Parent parent = FXMLLoader.load(getClass().getResource("sample.fxml"))
        Scene scene = new Scene(parent)

        stage.scene = scene

        stage.show()
    }

    static void main(String... args) {
        launch(args)
    }
}

つづいて、画面レイアウトの 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.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <TextField id="textField1" layoutX="42.0" layoutY="48.0" prefWidth="200.0" text="TextField" />
    <Button id="button1" layoutX="42.0" layoutY="152.0" text="Button" />
  </children>
</AnchorPane>

FXML は Scene Builder を使って、Drag&Drop で作りました。かんたん、かんたん。

Sample クラスを実行すると…

例外が発生しました (~_~;)

Exception in thread "main" java.lang.RuntimeException: Error: class sun.reflect.NativeMethodAccessorImpl is not a subclass of javafx.application.Application

サンプルコードとの違いは、Sample クラスが Java ではなく Groovy である点。
ということで、Sample2.java を作って、中身おなじで実行してみたら JavaFx 動きました。

launch メソッドでクラス指定が必要

調べてみると javafx.application.Application#launch(String…) ではなく、
javafx.application.Application#launch(Class, String…) を呼び出せばいいとのこと。

http://www.dreamchain.com/javafx-and-groovy-exception/

    static void main(String... args) {
        launch(Sample.class, args)
    }

と修正して実行してみると、無事 JavaFx 動きました。

困ったことを解決できたので、ブログに書いてメモです。

本当は…

GroovyFx を使いたいのですが、まだまだ情報量が少ないので断念です。