日別アーカイブ: 2013年7月15日

Eclipse 4.3(Kepler)ベースでJavaFXの開発環境構築

ベースはPleiades All in OneのEclipse4.3 ultimate。

JavaFX開発用プラグインのe(fx)clipseを以下のupdateサイトからインストール。

http://www.efxclipse.org/p2-repos/releases/latest/

何をインストールするか聞かれたけど、とりあえず全部選択した。

OracleのサイトからScene Builder(バージョンは1.0)のインストーラを落としてきてインストール。

 

Eclipse上からScene Builderを開けるようにするため、「Eclipseのウィンドウ->設定->JavaFX」にてシーンビルダーのインストールパスを指定。

自分の場合はC:\Program Files\Oracle\JavaFX Scene Builder 1.0\bin\scenebuilder.exe

 

この段階でエクリプスを再起動したら

新規->JavaFXから作成できるようになっているはず。

(New FX DocumentがfxmlでJavafx main classがメインクラス。)

 

JavaFX 2で始めるGUI開発の第2回までのソースを軽く追った範囲では大体問題なく動く模様。

ただし、Scene Builder上でイベント処理(リンク先の図10)を指定しようとしたときに、候補選択が効かなかったため手動で打ち込んだ。(Scene Builderのバージョンとかそちら側の問題かもしれないが調べられていない。 -> 他のものを触っているときにはScene Builderの1.0でも候補選択が有効だった。少なくともバージョンの問題ではない。)

a

(本来なら赤枠のエリアに選択肢が出てくるとのこと。)

JavaFXエラーパターン(FXMLLoaderのファイル名誤り)

FXMLLoader.load(getClass().getResource(“間違ったファイル名“));

としたときのエラーメッセージはロケーションが必須と若干意味が違うものが表示される。

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.NullPointerException: Location is required. <-ぱっと見わからない
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2739)

(中略)
  at jp.co.epea.firstclient.test3.TestLoginFXML.start(TestLoginFXML.java:15)

 

FXMLLoaderの中身見るとクラスローダーで探せないからURLがnullで渡されいってこのメッセージになっているらしい。

public static <T> T load(URL paramURL)
    throws IOException
  {
    return load(paramURL, null);
  }

->
if (paramURL == null) {
      throw new NullPointerException("Location is required.");
    }

JavaFXエラーパターン(Stage#setSceneの漏れ)

ITProのJavaFXサンプルを写経しつつ少しずつエラーを起こしてみる。

LoginDemoクラスにあるstage.setScene(scene);をコメントアウトしてみる。

        public void start(Stage stage) {
            stage.setTitle("Login Demo");

            AnchorPane root = new AnchorPane();
            Scene scene = new Scene(root);
            //stage.setScene(scene);  <-ここのコメントアウト

 

外枠部分だけ表示されて中が透明(背景がそのまま見える)な状態で表示されて枠ごと動かすとメモリがいっぱいいっぱいの時のような表示になる。

(枠の中に背景=Eclipseの画面が表示されている状態)

a

 

(ドラッグして表示が乱れている状態)

b

sceneに対して他のメソッドもコールしていなければEclipse上で”ローカル変数 scene の値は使用されていません”といわれるから多分気づく。ただ、メソッド呼んでいると警告出ないのでその時に事象を知らなかったら環境回りを疑いそう。

 

ちなみに、VBoxとかのコメントアウトはそのコンポーネント部分が表示されないだけなので切り分けは多分付く。

VBox vbox = new VBox();
//root.getChildren().add(vbox);

(コンポーネントが表示されていない状態)
c