SlideShare a Scribd company logo
JavaFX Update
JavaOne2013

⻘青江  崇(@aoetk)
⾃自⼰己紹介
• 
• 
• 
• 

⻘青江  崇
Twitter ID: aoetk / Hatena ID: aoe-tk
(株)ノーチラス・テクノロジーズ所属
本家JavaOneは今回が初参加!
JavaFXとは?
•  Javaに新たに加わったモダンなGUIツール
キット
–  FXMLの導⼊入によるプレゼンテーションとロ
ジックの分離離
–  アニメーション、エフェクト
–  CSSによるスタイリング
–  WebKitベースのブラウザコンポーネント

•  OpenJFXプロジェクトでOSSとして開発
Java SE8からは標準GUIツールキットに!
こんな感じで実装
public class BrowserViewController {
@FXML
private TextField textFieldUrl;
@FXML
private WebView webViewBrowser;
@FXML
private void handleButtonAction(ActionEvent event) {
String url = textFieldUrl.getText();
webEngine.load(url);
}
}	
 

Javaコード

FXML

<AnchorPane id="AnchorPane”
xmlns:fx="http://javafx.com/fxml”
fx:controller="BrowserViewController">
<children>
<Button fx:id="button" onAction="#handleButtonAction" text="Go" />
<TextField fx:id="textFieldUrl" onAction="#handleButtonAction" />
<WebView fx:id="webViewBrowser" />
</children>
Node
</AnchorPane>	
 

シーン
グラフ
こうなります
以上、前座でした
本⽇日のトピック
•  JavaFX 8の新機能⼀一巡り
•  ⾯面⽩白かったセッションの紹介

–  A Tour of the New JavaFX Printing APIs
–  Ten Man-Years of JavaFX

•  JavaOneを通して⾒見見えたJavaFXの向かう
先
JavaFX 8の新機能⼀一巡り
新しいテーマ
Lambda!
これが…
final ToggleGroup themeGroup = new ToggleGroup();
...
themeGroup.selectedToggleProperty()
.addListener(new ChangeListener<Toggle>() {
@Override
public void changed(ObservableValue<? extends Toggle> ov,
Toggle old, Toggle next) {
if (next == btnModena) {
setUserAgentStylesheet(STYLESHEET_MODENA);
} else {
setUserAgentStylesheet(STYLESHEET_CASPIAN);
}
}
});
Lambda!
こうなる!
final ToggleGroup themeGroup = new ToggleGroup();
...
themeGroup.selectedToggleProperty()
.addListener((ov, old, next) -> {
if (next == btnModena) {
setUserAgentStylesheet(STYLESHEET_MODENA);
} else {
setUserAgentStylesheet(STYLESHEET_CASPIAN);
}
}
});
Lambda!
このようにも書ける!
final ToggleGroup themeGroup = new ToggleGroup();
...
themeGroup.selectedToggleProperty()
.addListener(this::changeTheme);	
 
void changeTheme(ObservableValue<? extends Toggle> ov,
Toggle old, Toggle next) {
if (next == btnModena) {
setUserAgentStylesheet(STYLESHEET_MODENA);
} else {
setUserAgentStylesheet(STYLESHEET_CASPIAN);
}
}
3Dグラフィック
•  JavaFX 2までは限定的にサポート

–  2Dのグラフィックを変形して3Dにする

•  JavaFX 8では3Dのシェイプが作れるように
–  CameraもNodeになり、シーングラフ上を動か
せるように
OpenJFXで開発し
ている3DViewer*
を使って、Mayaや
3D Studio Maxで
作成したモデルを
取り込み可能に
(*) JDK8のサンプル
に⼊入っています
DatePickerの追加
•  やっとですか…
•  JSR-310 Date and Time APIに対応
SwingNode
•  「JavaFXの上にSwing」がOKに
•  SwingコンポーネントをSwingNodeでく
るんでシーングラフに追加
Label label = new Label("This is an FX Label");
JButton button = new JButton("This is a JButton");
button.addActionListener(event -> {
Platform.runLater(() -> label.setText("Hello from Swing!"));
});
SwingNode swing = new SwingNode();
swing.setContent(button);
VBox box = new VBox(15, label, swing);
その他
•  基本APIの強化

–  Collection、Task、Bindingに機能追加

•  カスタムコントロールを実装するための
APIを公開
•  フルスクリーン機能の強化
•  印刷API
–  この後説明します
⾯面⽩白かったセッションの
紹介
セッション紹介その1
All the Nodes That Are Fit to Print: A Tour
of the New JavaFX Printing APIs
[CON2662]
(JavaFX 印刷APIのツアー)

Jenifer Godinez

Phil Race
セッション概要
•  JavaFX 8の新機能のうち、これまで余り
詳細な説明がなかった印刷APIについて解
説するセッション
•  重要なクラスについて解説
JavaFXにおける印刷の流流れ
•  印刷ジョブを管理理する
javafx.print.PrinterJobクラスを使うのが
基本
boolean doPrint(Node n) {
PrinterJob job = PrinterJob.createPrinterJob(); // ジョブ作成	
 
	
 	
 	
 if (job == null) return false; // プリンタがない
// 印刷ダイアログを見せる	
 
	
 	
 	
 if (!job.showPrintDialog(null)) return false;	
 
	
 	
 	
 if (!job.printPage(n)) return false; // ノードを渡して印刷	
 
	
 	
 	
 return job.endJob(); // ジョブの終了	
 
}
その他重要なクラス(その1)
•  Printer
–  プリンターデバイスを表す
–  サポート属性をPrinterAttributes経由で取得
その他重要なクラス(その2)
•  JobSettings
–  印刷ジョブの設定

•  PageLayout
–  印刷対象のページ設定
デモ
•  Scene Builderを使ってデザインした帳票
を印刷してみます
現在Macでは動作しないので、Windowsで
動かした様⼦子を動画でお⾒見見せします
まとめ
•  やっと加わった印刷API、なかなか使い易易
いAPIです
•  プリンター設定、印刷ジョブ設定、ペー
ジ設定など細かい各種設定を⾏行行うことが
可能
•  Scene Builderを帳票デザインツールとし
て使うのもありかも
セッション紹介その2
Henrik Olsson

Ten Man-Years of JavaFX: Real-World
Project Experiences [CON2670]
(10⼈人年年のJavaFX開発プロジェクト)
セッション概要
•  SmartBear社の製品、LoadUIの開発プロ
ジェクトを通して学んだことについて紹
介するセッション
–  JavaFXの良良さ
–  開発上のTips、落落とし⽳穴
–  OSSとして開発した⽀支援ライブラリ

•  “Ten Man-Years” つまり10⼈人年年のプロ
ジェクト
LoadUIについて
•  http://www.loadui.org/
•  JavaFX製負荷テストツール
•  OSSとして開発
–  機能強化した有償版あり

•  SoapUIの姉妹ツールとして開発
–  SOAP/RESTful Webサービス⽤用テストツー
ル

•  リッチクライアントらしい美麗麗なUIが特
⾊色
何故負荷テストツールを新たに
作ったのか?
Load Runner

UIがごちゃっとしてる!

JMeter

テストのワークフロー
が分かりにくい!
JavaOne2013報告会 JavaFX Update
何故JavaFXなのか?
•  Illustratorで作った理理想を忠実に再現でき
るのがJavaFXだった
Illustrator

JavaFX
JavaFX 1で開発、しかし…
•  JavaFX 1がEOLに!
•  SmartBear社のCTOがOracleにEOL延⻑⾧長
を直訴!→答えは「No.」
•  ランタイムの配布を2013/3まで延ばして
もらい…
2013/4にJavaFX 2への移植完了了!
JavaFX1から2への移植
•  移植に9ヶ⽉月
•  ソースコード量量は41K⾏行行から32K⾏行行に減る
–  でもリライト多し

•  性能は⼤大幅に向上!
•  JavaFX 1の弱点が解消
–  IDEサポートがプア
–  コントロールが少ない
–  FXMLによるMVC/MVPパターンの導⼊入
JavaFX開発上のTips
•  全プラットフォームでテストしよう
–  プラットフォーム間で微妙に差異異有り

• 
• 
• 
• 

CSS、FXMLをよく学ぼう
IntelliJかNetBeansで開発しよう
ビットマップは極⼒力力使わずCSSを利利⽤用
Java SE / FX 8に備えよ!
何より開発を楽しもう!
プロジェクトを通して
⽀支援ライブラリもOSSとして開発
•  GuavaFX
–  https://github.com/SmartBear/GuavaFX
–  Google Guavaにインスパイアされた
ObservableListの拡張
•  transfrom、filter、concatを追加
•  transform以外はJavaFX 8で追加されている
プロジェクトを通して
⽀支援ライブラリもOSSとして開発
•  TestFX
–  https://github.com/SmartBear/TestFX
–  GUIテストツール
–  流流れるようなAPIでテストを記述できる
rightClick("#desktop").moveMouseTo("New")
.click("Text Document")
.type("myTextfile.txt")
.press(ENTER)
まとめ
•  JavaFXは本格的なプロダクト開発に使わ
れるようになってきています
•  このLoadUIのように「やりたいことを実
現する⼿手段」としてJavaFXが選択されて
います
•  実プロジェクトで揉まれたライブラリが
登場するようになりました
「試す」時期から「本気で使う」時期に
移りつつある!
その他⾯面⽩白かったセッション
•  Architecting Enterprise JavaFX 8
Applications [CON2229]
–  Java EEで有名なAdam Bienさんのセッション
–  本格的なJavaFXアプリケーションを開発する際の
アーキテクチャについての考察

•  Optimizing JavaFX Applications [CON3141]
–  レンダリング処理理の詳細について解説するセッショ
ン

かなりディープな内容なのでJavaFX勉強会
あたりででもお話しできたらと
JavaOneを通して⾒見見えた
JavaFXの向かう先
Oracleは何をJavaFXのターゲット
としているのか?
•  エンタープライズ向けデスクトップGUIの
開発
•  組み込み機器向けGUIの開発
エンタープライズ向けGUI
•  従来からのターゲット
•  採⽤用事例例が増え、ライブラリ、フレーム
ワークも増えている
•  Windows、Mac、Linux全てで使えるGUI
ツールキットは減っている
–  Adobe AIRはLinuxをドロップ
–  エンタープライズ向けGUI開発フレームワー
クとして期待されていたFlexは将来性に疑問
符が
組み込み機器向けGUI
•  Java SE 8 EmbeddedのGUIスタックとし
て採⽤用
–  ユースケースとしてはキオスク端末、医療療機
器、多機能プリンタ、ホームゲートウェイ、
監視システムなどなど

•  Internet of Things(IoT)をメインター
ゲットとするOracleの⽅方向性に合致
ではiOSやAndroidは?
•  iOS、Android関連のセッションは直前に
キャンセル
•  特に新情報なし

Oracleはここでの勝負を捨てた?
•  コミュニティベースで実装することは妨
げない姿勢なのであきらめないで

–  OpenJFXではiOS、Android向け実装を公開
–  RoboVMを使っての動作検証例例あり
DukePadがあるじゃないか!
•  ホントにこういう製品が出るわけではな
いので…

–  低スペックな組み込み機器でもこれだけの
GUIが実現できることのデモです
–  レシピが公開されているので腕に⾃自信がある
⽅方はチャレンジを!

https://wiki.openjdk.java.net/display/OpenJFX/DukePad
総括
•  JavaFX 8で本格的な⽤用途に使える⼟土台が
できあがった
•  JavaFXが徐々に実開発で使われ始めてい
ることを実感
–  本格的な開発事例例のセッション多数
–  実開発で培われたライブラリが登場

•  IoT時代におけるGUI開発の主役になる可
能性が

今度度こそ俺達の時代が来る?!
参考資料料
公式ドキュメント  http://docs.oracle.com/javafx/
FX Experience http://fxexperience.com/
JavaFX Community
https://www.java.net/community/javafx

OpenJFX Wiki
https://wiki.openjdk.java.net/display/OpenJFX/Main

OTN JavaFX Forum
https://forums.oracle.com/community/developer/english/java/
javafx/javafx_2.0_and_later

ITPro JavaFX 2で始めるGUI開発
http://itpro.nikkeibp.co.jp/article/COLUMN/
20120731/413043/

More Related Content

JavaOne2013報告会 JavaFX Update