World Of Zono

2017年の4月3日から社会人となる男の奮闘記

JavaFX(社会人74日目)

2017-06-18 15:39:34 | 日記
こんにちは。

今日の東京は雨です。しかも中々激しめの(--〆)。昨日はかなり天気が良かったので今日も晴れるのかな~なんて思っていたらこのざまです。なので今日は家から一歩も出ていません。流石にこの天気で外出しようとするやつはただのアホだ!恐らく晩飯の時以外はこのまま部屋から出ないと思うので今日は早めの投稿をしようと思います。今日の投稿は昨日発見したJavaFXの機能について書こうと思います。

JavaFXとはJavaのGUIフレームワークの一つです。前まではSwingっていうフレームワークが主流だったそうですが、今後はJavaFXが来る!!という記事を見たので学生の頃からボチボチ勉強していました。Swingとの大きな違いは、GUIのデザイン?コントロールの設定?がfxmlというxmlに似たマークアップ言語でパパッと書けるところですね。fxmlで書くぐらいのなら前みたいにプログラム上で設計した方がいい!!と思う人もいると思いますが、SceneBuilderという開発支援ツールを使えば一瞬でFXMLのコードを記述してくれます。VisualStudioでGUIアプリケーションを作ったことがある人がいればそちらを想像していただければいいと思います。それのJavaバージョンです。

このJavaFXにはコントローラークラスというものを用意してあげる必要があります。このコントローラークラスとは、FXMLで記述されたアプリケーションの骨格を制御するクラスです。こいつが無ければGUIを制御することができません(ボタンのアクション処理など)。ここからが昨日発見した画期的な方法。(多分基本的なことだと思いますが僕は今まで知りませんでした...)このJavaFXは、FXMLファイルをロードした時、自動的にコントローラークラスのインスタンスを作ってしまうんですよね。こいつが意外と厄介でした。知らない間にインスタンスが生成されて、GUI内のデータはそのインスタンスしか扱えない。外部からGUI内のデータ取得、操作をしたい場合はどうしたらいいんだ!!とず~と考えていました。そして、その解決策を昨日発見しました。フツーにOraceleが作ったマニュアルに載っていました...。やっぱマニュアルを読むのは大事だな(--〆)。画像を使って詳しく説明したい気持ちは山々なんですが面倒くさい(´◉◞౪◟◉)なので簡単なソースコードだけ載せます。多分、僕と同じところで悩んでいる人がいれば「なるほど!!」となると思います。

Stage stage = new Stage();

try {
   FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("design.fxml"));
   fxmlLoader.setController(this);  ←この一行
   Parent root = fxmlLoader.load();
   Scene scene = new Scene(root);
   stage.setTitle("test");
   stage.setScene(scene);
   stage.show();
  } catch (Exception e) {
   e.printStackTrace();
  }


意外とJavaFXを説明しているサイトではこの部分抜けていますよね。「this」っていうのは自身のインスタンスってこと。つまり、このFXMLを制御するコントローラークラスは自身のインスタンスってことです。なので、このロード兼コントローラークラスをインスタンス化してあげれば、メンバ変数にGUIのデータを保存するだけで外部からデータを取得することができます。この方法を使えば、このインスタンス経由でFXMLで宣言したコントロールにもアクセスすることができるのでいろいろと便利ですYO!!

今日はここでおしまい!!それじゃノシ

参考
https://docs.oracle.com/javase/jp/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html


1728文字

コメントを投稿