JavaFX 単語

12件

ジャバエフエックス

5.3千文字の記事
  • twitter
  • facebook
  • はてな
  • LINE
注意 【注意】
この項は、
JavaFX 2.0以降の情報が書かれています。

JavaFX 1.x系以前の情報こちら

JavaFXとは、Javaの標準GUIライブラリである(Java 8以降)。お金が溶けるFXとは何の関係もない。

概要(歴史)

ver. 1.x

JavaFXはサン・マイクロシステムズ社がプログラミング言語として開発した。同社の買収したForm Follows Function (F3)とSavaJeと呼ばれるJava関連技術を発展させて2008年12月パージョン1.0がリリースとなった。

ver. 2.x 〜 ver. 8

2009年8月にサン・マイクロシステムズはOracleに買収され、Java及びJavaFXはOracleが引き継ぐところとなったが、2010年9月OracleはJavaFX 2でJavaFX Scriptを止することを発表[1]。これによりJavaFXは全く別物のGUIライブラリへと生まれ変わることとなる。

これまでJavaの標準GUIライブラリSwingであったが、今後はJavaFXを標準GUIライブラリとしていくことも発表された。

JavaFX 2.0は2011年10月10日リリースされたので、一口にJavaFXといってもこの2011年10月の前と後では全く別物をしているWeb上で情報を探したり、書店で書籍を探したりするときは日付に注意されたい。

JavaFX 2.2の次のバージョンは3.0となる予定だったが、2014年3月18日リリースされたJava 8以降では標準ライブラリとしてJava仮想マシンに組み込まれることに(Java 7 Update2以降であれば標準搭載されてはいる)なったため、JavaバージョンにあわせてJavaFX 8になり大きくバージョン番号が飛ぶことになった。

ver. 11 〜

2018年3月Oracleは、Java 8でJava仮想マシンに組み込んだJavaFXを、再びJava仮想マシンから切り離す方針であることを発表した。2018年9月リリースJava 11(バージョン番号についてはJavaの記事を参照)から実施された。標準とは何だったのか。

JavaFXはOpenJFXとしてオープンソースプロジェクトとなり、Java 11リリース後はGluonという企業が実質的にJavaFXの開発を引き継いでいる。Java本体とは独立した開発なのでバージョン番号Java本体とは一致するとは限らないはずだが、実際はJavaバージョンに一致したJavaFXを用いる形で配布されている。

Java 11以降Oracle以外からもJava仮想マシンが配布されるケースが増えてきたが、BellSoftが配布するLibericaJDKexitにはJavaFXが同梱されているバージョンもある。

Oracleの言い分

Oracleは、JavaFXの分離により「OpenJFXはJava本体の開発ペースに左右されずに開発が進む」というメリットがありそうな表現をしているが、Java7の時代からJavaリファレンス実装になったOpenJDKでは、もともとJavaFXはJava仮想マシンに統合されておらず、Javaバージョンが7のままでもJavaFXは2.0から2.2までアップデートしていたし、Java8リリース後もJava 8u40の時に機追加が行われており、これまでもOpenJFXはJava本体の開発ペースに縛られてはいなかった。

むしろ、最新のJava仮想マシンリリース時に対応するJavaFXが同時リリースされる保がなくなる上に、ひっそりと開発中止になる可性すら否定できなくなるという深刻なデメリットがあるのだが、その点についてOracleは一切触れていない。

JavaFXを切り離す一方で、Oracleは旧来のGUIライブラリであるAWTやSwingJava内に残すとしている。しかし、AWTやSwingについてもJavaFXともどもサポート企業を探すとしており、それらの地位も未来永劫安泰というわけではなさそうである。将来、Javaは標準GUIライブラリを持たなくなるということかもしれない。

仕様等

MVC(モデル・ビュー・コントローラー)モデルGUIを作成する。

モデルユーザー(プログラマー)が各自でクラスを作成する。コントローラーについてもユーザークラスを作成するが、書き方についてはJavaFX独自の作法がある。

ビューの部分はJavaソースコードに記述することも可だが、FXMLというXMLで分離して記述できることが特徴[2]。このFXMLをGUIを通じて作成するScene Builderというオープンソースソフトウェアがあり[3]、これによって視覚的にGUIを設計することが可になった。

フォントや色などの外観はFXMLにCSSを組み合わせることでも変更することができ、さらにこのCSSを外部ファイルとして独立させることも可である。

黙示のマルチスレッド

Swingなどで既にGUIマスターしている人には当然なのかもしれないが、JavaFXのGUIを使用すると、GUIに変更を行うためのスレッド(Application Thread: SwingでいうEvent Dispatch Thread)が自動的に生成される。(動画処理などを除き)すべてのGUI変更命はこのスレッドに集められ、一本化されてから実行される。

ユーザーが明示的に作ったものでないにもかかわらず、このスレッドの存在を意識してコードを書かないと、マルチスレッドにはまって理解できない動作に悩まされることになる。

Swingとの相互運用

JavaFX 2.x系では、Swingの中にJavaFXの部品を入れることはできたが、逆は出来なかった。しかし、JavaFX 8以降では、SwingNodeの導入により相互運用することが可になっている。

プラットフォーム

ラットフォームはJava仮想マシンが動作する環境、すなわちWindowsMacLinuxだが、実用性や安定性を別にすればiOSAndroidについても以下のようなプロジェクトが存在する。

2015年5月現在Java自体がWindows8以降で追加されたModern UI(旧称Metro)に対応していないため、現時点ではデスクトップアプリケーション開発体になると思われるが、JavaFX自体にはタッチスワイプなどのタッチネル操作を前提にした項も存在しているので、将来的にはJavaFXでモバイルアプリ開発できる日が来るのかもしれない。


Linux環境Java仮想マシンとしては、ハードウェアの違いにより通常のIntelCPU用以外にARM用のJava仮想マシンが存在するが、2015年1月OracleARM系プロセッサ向けのJava仮想マシンからJavaFXを省くexitという決定をした。

Oracle以外の実装であるOpenJDKでは引き続きJavaFXのサポートが続けられているが、コア機能に限定されているexitようである。浮動小数点演算がハードウェア実行かソフトウェア実行かにより制約を受けるらしい。

OpenJFXはオープンソースなので、それをコンパイルしてOracleARM用のJava仮想マシンに組み込むという荒業もあるらしいexitが、かなり複雑な工程を要する。

前述のLibericaJDKexitにはARM用のJavaFXを同梱したバージョンが存在する。

関連動画

関連項目

外部リンク

コラム: 早すぎた?JavaFX

JavaFXはFlashなどのWebコンテンツ向けGUI開発環境に対抗して投入された経緯があるが、この分野ではHTML5などに大きく後れを取ってしまい、一般的には遅すぎる投入であったと考えられている。

これに対し私見ではあるが、別の観点からするとJavaFXの投入が早すぎたのではないかといえる一面があることについて述べようと思う。

未熟な機能

たとえば印刷機ですら、JavaFX 2.0の時点では不十分で、JavaFX8になってからようやく本格的にサポートされた。2015年2月の時点で、タスクレイアイコン(SwingですらなくAWTのクラスを使用しなければならない)やダイアログボックス(2015年3月のJavaFX 8 update 40で遅ればせながら導入)など、かゆいところに手が届かない未熟な一面が見てとれる。

すでにかなり遅れをとっていたので投入を急がざるを得なかったのはわかるが、時間が解決してくれる可性もあるので今後に期待ということになるのであろうか。

Optional

もう一点、より深刻なのが、Java8から導入されたnull対策であるOptionalクラス活用されていない点である。

JavaFXでは、リストボックスの未選択状態などを表現するのにnullを多用している。もし導入がJava6でなくJava8からであったなら、Optionalクラスのとてもよい活用例になっただろうと思われる。

しかし、JavaFX 2.0はJava6上でも利用できるように設計されているので、当然Optionalは使用されていない。その結果、互換性の関係からJavaFX 8になってもやはり使用されていない。もし今から導入しようとすると、各部品に設定されている選択状態などの値を格納する変数クラスを変更しないといけなくなるので、互換性のことを考えると現段階から導入するのは絶望的なのではないだろうか。

IntegerProperty(あるいはObjectProperty<Integer>にnullを格納)の代わりにObjectProperty<OptionalInt>やObjectProperty<Optional<Integer>> 、ObjectProperty<T>の代わりにObjectProperty<Optional<T>>とすると利用できないこともないが、bindする部分を自力で用意せねばならず、かなり不格好である。ちなみにObjectProperty<Optional<Integer>>とObjectProperty<OptionalInt>ではそれほどbindするときの手間が変わらないように見えるが、Optional<Integer>では使えるのにOptionalIntでは使えないメソッドがあったりするので、後者の方がまだシンプルそうに見えるが、前者のほうがいくらか扱いやすい可性はある。

脚注

  1. *止されたJavaFX Scriptの後継としてユーザインタフェース設計用のDSLを策定するVisageという派生プロジェクトexitもあったが、アルファ版をリリースするにとどまり、2012年以降は動きがない。
  2. *.NET FrameworkWindows Presentation Foundation(2006年11月.NET Framework 3.0から搭載、ちなみに.NET Framework 3.0のリリース前の名前WinFXだったexitWikipediaによるとexitFXというのはプログラミング業界でフレームワークを意味する略号ということなので、GUIフレームワークとして名前の一部が被ってしまったのは不自然ではない。)にXAMLというXML...おや、誰か来たようだ
  3. *Scene BuilderはOracleから配布exitされていたが、2015年3月ごろにJava SE 8u40のリリースでJavaFXにも若干の機追加があったのを機にOracleからは最新版の配布がされなくなった。SceneBuilder自体はOpenJDKに移管exitされ、Gluonという準公式サードパーティからバイナリの入手exitが可ではあるものの、正式な最新版の入手には自力でビルドするというハードルの高い作業が必要になった。
この記事を編集する

掲示板

おすすめトレンド

ニコニ広告で宣伝された記事

記事と一緒に動画もおすすめ!
もっと見る

急上昇ワード改

最終更新:2024/12/27(金) 13:00

ほめられた記事

最終更新:2024/12/27(金) 13:00

ウォッチリストに追加しました!

すでにウォッチリストに
入っています。

OK

追加に失敗しました。

OK

追加にはログインが必要です。

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

ほめるの取消しに失敗しました。

OK

ほめるにはログインが必要です。

タグ編集にはログインが必要です。

タグ編集には利用規約の同意が必要です。

TOP