java fx 2.0による次世代アプリケーション開発 · java fx...
TRANSCRIPT
<Insert Picture Here>
Java FX 2.0による次世代アプリケーション開発
日本オラクル株式会社 Java Embedded Global Business Unit佐藤 芳樹2011年5月19日
Copyright© 2011, Oracle. All rights reserved.
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
Copyright© 2011, Oracle. All rights reserved.
What’s JavaFXJAVAFX 2.0
本発表の内容は2011/5/19時点で、Early Access版の情報を元に構成されていますβ版及びGA版では変更が発生する内容がある点を御理解下さい。
Copyright© 2011, Oracle. All rights reserved.
JavaFXとはJavaリッチクライアントプラットフォームの進化系
クロスプラットフォームのRIA開発・実行環境
魅力的なアプリケーションによる特別なユーザ体験を提供
巨大なJavaエコシステムを最大限に活用
4
RIA:リッチインターネットアプリケーションとは動的で表現力豊かなWebアプリケーションの総称(Applet, DHTML, Flash/Air, SilverlightもRIA)
Copyright© 2011, Oracle. All rights reserved.
JavaFXのRIAアプリケーション例
5
MLB.com Vancouver2010.com
Oracle Beehive Client
Copyright© 2011, Oracle. All rights reserved.
JavaFX採用の理由
6
The main reason we went with Java and JavaFX was for flexibility. Java has all the advantages of a high-level programming language and it can be run on all the operating systems we want to support (Mac, Windows, and Linux).
We also needed to be able to deploy Conferencing without requiring users to download and install anything in advance. Going into this, we checked the market share of Adobe Flash versus Sun Java. At that time, Adobe Flash was available on 98% of all desktops. Java, on the other hand, was available on 89% of all desktops. On Windows, JavaFX and Flash are essentially the same. However, on the Mac, Flash has a number of known issues (i.e. it crashes and hangs an awful lot. I am a Mac user, and I despise Flash). JavaFX, on the other hand, works well on the Mac.
by Product Mgr of Oracle Beehive Client
Copyright© 2011, Oracle. All rights reserved.
Oracle
JavaFXの歴史JavaFX1.0 → 2.0
7
Sun
JavaOne’07
JavaFX 1.0
‘10/4
1.3
JavaOne’10‘10/8
1.3.11.1
‘09/2
1.2
JavaOne’09
Composer(NetBeans) Authoring Tool
スクリーン非依存のRIAプラットフォーム 言語非依存のRIAプラットフォーム
2.0
最初のターゲットはデスクトップ向けWindows/x86
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0とは生まれ変わったJavaFXの特徴①
プライマリ言語はJava• JavaFX1.xスクリプトの機能をJava APIとして移植
• Generics, Annotation, Multi thread等の言語機能を享受
• Java向けのIDEサポート, デバッガ, プロファイラも活用
• JRuby/Groovy/Scala/Clojure/JavaScriptをはじめ、全てのJVM言語がセカンダリ言語
• Bind, Sequence等のJavaFXスクリプト機能はAPIで提供
8
既存のJavaインフラ(人材,スキル,ツール)を最大限活用
実証されたJava技術で投資リスクや開発コストを削減
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0とは生まれ変わったJavaFXの特徴②
高性能描画パイプライン• PRISMハードウェアアクセラレーションとGlassツールキット
埋め込みブラウザ• Webkitベースのレンダラ
新しいメディア再生エンジン• GStreamerベース
ブラウザプラグイン• アプレットのPRISM実行
50以上の多彩なUIコンポーネント• チャート,メニュー,テーブル,パネル等に加え、CSSサポート
Swing相互連携
9
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0のシーングラフGUI構成要素
シーングラフはノードの有向非巡回グラフ• ツリー状の階層構造で親子関係が存在
• 各ノードにエフェクト, 透過処理, 2D/3D変換, イベント処理を適用可能
• JFXPanelを用いてSwingへ埋め込み
ノード• 2D/3D Shape
• 画像
• メディア
• Webブラウザ
• テキスト
• UIコンポーネント
10
Stage
Parent(Group, Region, Control)
• チャート
• グループ
• コンテナ Node Node
NodeNode Node
Scene
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0のアーキテクチャ描画エンジンのコンポーネント構成
Prismレンダリングエンジン• 2D/3Dシーングラフをサポート
• ハード/ソフトレンダリング• DirectX 9 (WinXP, WinVista)
• DirectX 11 (Win7)
• OpenGL (Mac, Linux, Embedded)
• Java2D (ソフトウェアレンダリング)
• 豊かなグラフィックスを容易に実現• 2D: シャドウ,ぼかし,反射,エフェクト
• 3D変換 (完全対応は将来)
• Quantumが、Prism描画とGlassイベント処理をスレッド制御
Glassウィンドウツールキット• ウィンドウ、タイマ、サーフェイス、イベントキューを管理する
プラットフォーム依存のネィティブ層
• AWTと違い、JavaFXアプリケーションと同一スレッドで動作
11
Java Virtual Machine
Quantum Toolkit
Prism
JavaFX Public APIs and Scene Graph
Java2D D3D OpenGL
GlassWindowing
Toolkit
MediaEngine
WebEngine
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0のWebコンポーネントWeb用のUIコンポーネント
12
ブラウザ制御基本的なWebページブラウズ機能
Webコンテンツエフェクトや3D変換の対象
ブラウザポリシーウィンドウ,ページ読込みやスクリプト実行の可否
JavaFX組込みブラウザ• JavaFXアプリケーションに組み込めるWebコンポーネント
• WebKitベースのHTML描画 (ローカル/リモート, ヒストリ等)
• HTML5, CSS, JavaScript, SVGとDOMアクセスサポート
Webkit
HTML5 CSS 3 JavaScript 5
DOM
JavaFX Public APIs
HTML要素へアクセス
HTML構築
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0のメディア再生JavaFX1.xから新たに作り直されたソフトウェアスタック
新たなメディアエンジン• GStreamerベースの安定したメディアフレームワーク
• FLVコンテナ(VP6/MP3), H.264/AAC形式のビデオサポート予定
• MP3, AIFF, WAV形式のオーディオサポート (非圧縮PCM含む)
13
メディア再生制御再生,停止,ボリューム,バランス,イコライザ
メディアコンテンツソース,解像度,メタデータなど
メディアノードアニメーション,半透明エフェクト等の対象
GStreamer: LGPLのクロスプラットフォームマルチメディアライブラリ
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0のUI部品GUI構成要素
JavaFX UIコントロール• プラットフォーム非依存のUI部品であり、シーングラフのノードとして提供
• AWT/Swingとは別に、1から作り直したもの
14
•Button
•Cell
•CheckBox
•ChoiceBox
•Hyperlink
• IndexedCell
•Label
•ListCell
•ListView
•PasswordBox
•ProgressBar
•ProgressIndicator
•RadioButton
•ScrollBar
•ScrollPane
•Separator
•Slider
•TextBox
•ToggleButton
•ToggleGroup
•ToolTip
•CheckMenuItem
•CustomMenuItem
•GridPane
•Menu
•MenuBar
•MenuButton
•MenuItem
•PopupMenu
•RadioMenuItem
•SplitMenuButton
•ToolBar
•AreaChart
•BarChart
•BubbleChart
•Chart
•LineChart
•PieChart
•ScatterChart
•XYChart
•TreeCell
•TreeView
•Accordion
•SplitPane
•Table
•Tab
•TabPane
•TitledPane
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0のCSSサポートUIコントロールのスタイルをカスタマイズ可能
シーングラフ中の全てのノードへCSS適用可• W3C CSS ver. 2.1とver. 3の一部
• JavaFXアプリケーションとHTMLページのスタイルをミックス
• 実行時にCSS切り替えも可能
15
.scene{
-fx-font: 14pt "Cambria Bold";
-fx-color: #e79423;
-fx-background: #67644e
}
.button{
-fx-text-fill: #006464;
-fx-background-color: #e79423;
-fx-border-radius: 20;
-fx-background-radius: 20;
-fx-padding: 5
}
scene.getStylesheets().add("controlStyle.css");label1.setStyle(“-fx-base: #ed1c24);
Copyright© 2011, Oracle. All rights reserved.
JavaFX Demo
Copyright© 2011, Oracle. All rights reserved.
Ensemble
17
Copyright© 2011, Oracle. All rights reserved.
Brick Breaker
18
Copyright© 2011, Oracle. All rights reserved.
Display Shelf
19
Copyright© 2011, Oracle. All rights reserved.
Key Stroke Motion
20
Copyright© 2011, Oracle. All rights reserved.
How to JavaFXJAVAFXアプリケーション開発
Copyright© 2011, Oracle. All rights reserved.
シンプルなJavaFXアプリケーション例
22
public class MyApp extends Application {
@Override public void start(Stage stage) {
Group root = new Group();
Scene scene = new Scene(root,500, 400);
scene.setFill(Color.BLACK);
stage.setScene(scene);
stage.setVisible(true);
}
public static void main(String[] args) {
Launcher.launch(MyApp.class, null);
}
}
ライフサイクルメソッドを持ちスタンドアロンとアプレットモデルに対応
JDK5以降!
Copyright© 2011, Oracle. All rights reserved.
比べてみよう
23
Stage {scene:Scene{content:[
Circle { centerX: 50
centerY: 50radius: 50fill: Color.RED
}]
}}
JavaFX 1.x
public class MyApp extends Application {@Override public void start(Stage stage) {
Group root = new Group();Scene scene = new Scene(root,100,100);stage.setScene(scene);
Circle c1 = new Circle();c1.setFill(Color.RED);c1.setCenterX(50.0);c1.setCenterY(50.0);c1.setRadius(50.0);
root.getChildren().add(c1);stage.setVisible(true);
}
public static void main(String[] args) {Launcher.launch(MyApp.class, null);
} }
JavaFX 2.0
Copyright© 2011, Oracle. All rights reserved.
比べてみようBuilderクラス利用イメージ
24
Stage {scene:Scene{content:[
Circle { centerX: 50
centerY: 50radius: 50fill: Color.RED
}]
}}
JavaFX 1.x
public class MyApp extends Application {@Override public void start(Stage stage) {
stage.visible(true).scene(new SceneBuilder().root(new GroupBuilder()
.children(new CircleBuilder()
.centerX(100).centerY(50).radious(50)
.fill(Color.RED).build()).build()
).build()).build();
}
public static void main(String[] args) {
Launcher.launch(MyApp.class, null);} }
JavaFX 2.0 with Builders
Copyright© 2011, Oracle. All rights reserved.25
JavaFXアプリケーションの起動方法
コマンドラインから• java -jar myapp.jar
• java -cp jfxrt.jar:myapp.jar MyApp
• javafx -cp myapp.jar MyApp
IDEから• クラスパスを設定して実行
ブラウザから• JavaFX Plug-inで実行
• ハードウェアアクセラレーションもBeta/GAで対応
25
Copyright© 2011, Oracle. All rights reserved.26
JavaFXデプロイメント
3種類のデプロイメント (JARファイルは同一)• Standaloneデプロイメント: Jarファイルでデスクトップ実行
• Web Startデプロイメント: JNLPファイルをダウンロードして実行
• Appletデプロイメント: ブラウザ内でプラグインが実行
Web StartのPre-Loaderメカニズム• FXアプリケーションの描画前に実行可能なプログラム
• アプリケーションとデータ受け渡しや、同じウィンドウ(Stage)への描画が可能
• ロード待ちの間のGUI描画や実行前のフェードイン/アウトなどのTransitionも実現
26
Copyright© 2011, Oracle. All rights reserved.
JavaFX Script
Alternatives
Copyright© 2011, Oracle. All rights reserved.
JavaFX with JRuby
JRubyとは?RubyインタプリタのJava実装で、RubyプログラムからJava APIへアクセスできる
JRubyを使う利点• JavaFX APIを直接呼び出し
• 動的型付け
• クロージャでイベント処理実装
• ビルダーを利用してJavaFXスクリプトライクなDSLを準備可能• e.g.) Swing向けのSwiby
28
Copyright© 2011, Oracle. All rights reserved.
JRubyサンプル
29
stage.title = 'Hello JRubyFX'stage.width = 300stage.height = 200group = Group.newscene = Scene.new(group)scene.fill = Color::DARKBLUEstage.scene = scene
rect = Rectangle.newrect.x = 10rect.y = 40rect.width = 50rect.height = 50rect.fill = Color::REDgroup.children << rect
timeline = Timeline.newtimeline.cycle_count = Timeline::INDEFINITEtimeline.auto_reverse = true
kf1 = KeyFrame.new(Duration::ZERO, KeyValue.key_value(rect.translateXModel, 0))
kf2 = KeyFrame.new(Duration.new(1000), KeyValue.key_value(rect.translateXModel, 200))
timeline.key_frames << kf1<< kf2timeline.play()stage.visible = true
require 'java'
Application = Java::javafx.application.ApplicationFX = Java::com.sun.javafx.application.LauncherImplStage = Java::javafx.stage.StageScene = Java::javafx.scene.SceneGroup = Java::javafx.scene.GroupColor = Java::javafx.scene.paint.Color…..
class HelloJRubyFX < Applicationdef start(stage)
endend
FX.launchApplication(HelloJRubyFX.new)
Copyright© 2011, Oracle. All rights reserved.
JRuby DSL
Swiby: ビルダーを利用したSwingのためのDSLライブラリ• JavaFXライクにGUIを記述可能 (Bindingもサポート)
30
require 'swiby„
class HelloWorldModelattr_accessor :saying
end
model = HelloWorldModel.newmodel.saying = "Hello World"
Frame {title "Hello World“width 200content {
Label {text bind(model,:saying)
}}visible true
}
Copyright© 2011, Oracle. All rights reserved.
JavaFX with Groovy
31
Groovyとは?
Java用のスクリプト言語
Groovyを使う利点• Javaと密接でほぼ全ての機能を利用可能
• 動的型付け
• クロージャでイベント処理実装
• 省略構文やビルダー機能で宣言的なGUI記述が可能• e.g.) Swing向けのGriffon
Copyright© 2011, Oracle. All rights reserved.
Groovyサンプル
32
class HelloGroovyFX extends Applicaiton {public void start(Stage stage) {
stage.setTitle("Hello GroovyFX “);stage.setWidth(600);stage.setHeight(450);Rectangle rect = new Rectangle();rect.setX(25);rect.setY(40);rect.setWidth(100);rect.setHeight(50);rect.setFill(Color.RED);Scene scene = new Scene(rect);scene.setFill(Color.BLUE);stage.setScene(scene);stage.setVisible(true);
}
static void main(args) {Launcher.launch(HelloGroovyFX.class,null);
}}
通常のGroovy
Public void start(Stage stage) { stage.with {
title="Hello GroovyFX“width=600height=450visible=truescene=new Scene(
new Group(new Rectangle(x:25, y:40,
width:100,height:50,fill: Color.RED)),
Color.BLUE)}}
Beans省略構文を使ったGroovy
FxBuilder.build {stage = stage(
title: "Hello GroovyFxBuilder", width: 600, height: 450,scene: scene(fill: Color. BLUE) {
rectangle(x: 25, y: 40,width: 100, height: 50,fill: Color.RED
)})stage.visible = true;}
ビルダーDSL利用例
Copyright© 2011, Oracle. All rights reserved.
JavaFX with Scala
Scalaとは?オブジェクト指向と関数型をミックスし、型推論、アクター、Traits/Mix-inなど何でもできる
Scalaを使う利点• JavaFXスクリプトのように、GUIプログラミングを容易にする
多くの機能を保有
• 静的型付け可能
• クロージャ
• 宣言的記述
• DSLサポート
33
Copyright© 2011, Oracle. All rights reserved.
Scalaサンプル
34
object HelloScalaFX extends Application {def stage = new Stage {
title = "Hello ScalaFX"width = 600height = 450scene = new Scene {
fill = Color.LIGHTGREENcontent = List(new Rectangle {
x = 25y = 40width = 100height = 50fill = Color.RED
})}
}}
宣言的なGUI定義インラインプロパティ設定
リストも宣言的に作成
擬似的なScala DSLによるJavaFXアプリ
Copyright© 2011, Oracle. All rights reserved.
多言語連携
その他の選択肢• JavaScript (Rhino)
• Clojure
• Jython
• JavaFX 1.3 (Visage)
DSL実装の提供は?• OracleからJava以外のBuilder, DSL実装が提供される訳ではない
• コミュニティが、自由に開発・保守・改良したものを利用する
35
(なので安心)
Copyright© 2011, Oracle. All rights reserved.
JavaFX Graphic
Components
Copyright© 2011, Oracle. All rights reserved.
Shapes
Polyline polyline2 = new Polyline(new double[]{135, 10, 100, 80,
170, 80, 135, 10,});polyline2.setStroke(Color.DODGERBLUE);polyline2.setStrokeWidth(2);polyline2.setFill(Color.DARKBLUE);
37
Copyright© 2011, Oracle. All rights reserved.
ImagesImageView sample1 = new ImageView(
new Image(url, 30, 70, false, true));
ImageView sample2 = new ImageView(new Image(url));sample2.setFitWidth(250); //preferred widthsample2.setPreserveRatio(true);
ImageView sample3 = new ImageView(new Image(url));sample3.setFitWidth(40);sample3.setFitHeight(80);sample3.setPreserveRatio(false);sample3.setSmooth(true); //better filtersample3.setRotate(90);
ImageView sample4 = new ImageView(new Image(url));sample4.setFitHeight(60);sample4.setPreserveRatio(true);Rectangle2D rectangle2D = new Rectangle2D(0,0,120,60);sample4.setViewport(rectangle2D); //image's viewport for zoom
HBox hBox = new HBox();hBox.setSpacing(30);hBox.getChildren().addAll(sample1, sample3, sample4);VBox vb = new VBox(10);vb.getChildren().addAll(hBox, sample2);root.getChildren().add(vb);
38
Copyright© 2011, Oracle. All rights reserved.
Media
private static final String MEDIA_URL = "http://webcast-west.sun.com/oow2010.flv";
private MediaPlayer mediaPlayer;
@Override public void start(Stage stage) {Group root = new Group();Scene scene = new Scene(root,400,400);stage.setScene(scene);
mediaPlayer = new MediaPlayer(new Media(MEDIA_URL));mediaPlayer.setAutoPlay(true);MediaView mediaView = new MediaView();mediaView.setMediaPlayer(mediaPlayer);mediaView.setLayoutX(20);mediaView.setLayoutY(20);
root.getChildren().add(mediaView);stage.setVisible(true);
}
39
Copyright© 2011, Oracle. All rights reserved.
Web Components
@Override public void start(Stage stage){Group root = new Group();Scene scene = new Scene(root,1000,600);stage.setScene(scene);stage.sizeToScene();
WebEngine myweb = new WebEngine("http://facebook.com/OracleJP”);WebView webView = new WebView(myweb);webView.setLayoutX(100);webView.setLayoutY(100);root.getChildren().add(webView);stage.setVisible(true);
}
40
Copyright© 2011, Oracle. All rights reserved.
TextVBox box = new VBox(10);
ImageView imageView = new ImageView(ICON_48);Label label = new Label("graphic on the top.", imageView);label.setContentDisplay(ContentDisplay.TOP);box.getChildren().add(label);
imageView = new ImageView(ICON_48);label = new Label("graphic on the right.", imageView);label.setContentDisplay(ContentDisplay.RIGHT);box.getChildren().add(label);
imageView = new ImageView(ICON_48);label = new Label("graphic on the bottom.", imageView);label.setContentDisplay(ContentDisplay.BOTTOM);box.getChildren().add(label);
imageView = new ImageView(ICON_48);label = new Label("graphic on the left.", imageView);label.setContentDisplay(ContentDisplay.LEFT);box.getChildren().add(label);
imageView = new ImageView(ICON_48);label = new Label("graphic on the center.", imageView);label.setContentDisplay(ContentDisplay.CENTER);box.getChildren().add(label);
getChildren().add(box);
41
Copyright© 2011, Oracle. All rights reserved.
Controls
42
Many more...
Copyright© 2011, Oracle. All rights reserved.
Charts
43
Copyright© 2011, Oracle. All rights reserved.
Effects
44
Text sample = new Text(0,40,"DropShadow Effect");
sample.setFont(Font.font("Amble", FontWeight.BOLD,66));
DropShadow dropShadow = new DropShadow();
dropShadow.setOffsetX(20);
dropShadow.setOffsetY(20);
sample.setEffect(dropShadow)
GaussianBlur InnerShadow
SepiaToneReflection
Copyright© 2011, Oracle. All rights reserved.
Transforms
45
その他、2Dアフィン変換や3D射影変換等の変形も
Rectangle rect=new Rectangle(0,0,60,60);rect.setFill(Color.DODGERBLUE);rect.setArcWidth(10);rect.setArcHeight(10);
rect.setRotate(45);
rect.setScaleX(2);rect.setScaleY(0.5);
Shear shear = new Shear(0.7, 0);rect.getTransforms().add(shear);
rect.setTranslateX(40);rect.setTranslateY(10);
Copyright© 2011, Oracle. All rights reserved.
JavaFX Animation
Copyright© 2011, Oracle. All rights reserved.
2種類のアニメーション
47
Copyright© 2011, Oracle. All rights reserved.
Timelineベースのアニメーション時間軸のスナップショット(KeyFrame)を与えて補間
48
Circle circle = new Circle(25,25, 20, Color.web("1c89f4"));circle.setEffect(new Lighting());
Timeline timeline = new Timeline(); timeline.setCycleCount(Timeline.INDEFINITE);timeline.setAutoReverse(true);
timeline.getKeyFrames().addAll(new KeyFrame(Duration.ZERO,
KeyValue.keyValue(circle.translateXProperty(), 0)),new KeyFrame(new Duration(4000),
KeyValue.keyValue(circle.translateXProperty(), 205)));
timeline.play();
0s 1s 2s 3s 4s
x=0 x=205
KeyFrame
KeyValue Timeline
Copyright© 2011, Oracle. All rights reserved.
Transitionベースのアニメーション事前定義された特定目的のアニメーション
49
Circle circle = new Circle(20, Color.CRIMSON);
getChildren().add(circle);
TranslateTransition translateTransition = new
TranslateTransition(Duration.valueOf(4000),circle);
translateTransition.setFromX(20);
translateTransition.setToX(380);
translateTransition.setCycleCount(Timeline.INDEFINITE);
translateTransition.setAutoReverse(true);
translateTransition.play();
parallelTransition = new ParallelTransition();
parallelTransition.getChildren().addAll( fadeTransition,
translateTransition,
rotateTransition,
scaleTransition);
parallelTransition.setCycleCount(Timeline.INDEFINITE);
parallelTransition.play();
Translate/Rotate/Scale/Fade... –始点・終点を指定したTransition
Parallel/Sequential... –複数Transitionの並行・連続
Copyright© 2011, Oracle. All rights reserved. 50
Rectangle rect = new Rectangle (0, 0, 40, 40);rect.setArcHeight(10);rect.setArcWidth(10);rect.setFill(Color.ORANGE);getChildren().add(rect);
Path path = new Path();path.getElements().add(new MoveTo(20,20));path.getElements().add(new CubicCurveTo(380, 0, 380, 120, 200, 120));path.getElements().add(new CubicCurveTo(0, 120, 0, 240, 380, 240));path.setStroke(Color.DODGERBLUE);path.getStrokeDashArray().setAll(5d,5d);getChildren().add(path);
pathTransition = new PathTransition();pathTransition.setDuration(Duration.valueOf(4000));pathTransition.setPath(AnimationPath.createFromPath(path)); //経路としてpathを設定pathTransition.setNode(rect); //アニメーション対象ノード指定pathTransition.setOrientation(OrientationType.ORTHOGONAL_TO_TANGENT);pathTransition.setCycleCount(Timeline.INDEFINITE);pathTransition.setAutoReverse(true);pathTransition.play();
Path Transitionの例Shapeで作ったPathを沿うAnimation
Copyright© 2011, Oracle. All rights reserved.
JavaFX
Beans and Binding
Copyright© 2011, Oracle. All rights reserved.
JavaFX1.xのTriggerとBindingMVCのGUIプログラミング向けの便利な機能
Trigger: 変更イベントをハンドリング• 変数アクセスを監視し、指定したコードを実行する機能
Binding: 更新した値を自動で同期• 変数の値を、他の変数や式、ブロックへ同期させる機能
52
var a on replace oldValue {println("Value Changed from {oldValue} to {a}");
};
var x = 10;var y = bind x;println(x); // -> 10 println(y); // -> 10 x = 11;println(x); // -> 11println(y); // -> 11
Copyright© 2011, Oracle. All rights reserved.
BeanJavaFX1.xのTriggerを代替するAPI
Observable/Bindable Variable• 監視プロパティを、ObservableValueでラッピングして定義
javafx.beans.property.StringProperty name;
• プロパティへへはsetter/getterを介してアクセスname.getValue(); name.setValue(value);
• プロパティへリスナ登録する事でトリガ機能を代替name.addListener(
new ChangeListener() {@Override void changed(ObservableValue<String>, String oldValue, String newValue) {
System.out.println(newValue + “ is changed from “ + oldValue);}});
53
JavaFXの全モデルのプロパティはObservableValue<T>でラッピングされ監視可能
Copyright© 2011, Oracle. All rights reserved.
BindingJavaFX1.xのBindingを実現する2種類のAPI
Binding APIの特徴• 更新時はInvalidマークを付加
• 読み出し時に、依存グラフを辿って再計算
54
Rectangle r1 = new Rectangle();
Rectangle r2 = new Rectangle();
Rectangle r3 = new Rectangle();
// r3.x = r1.x + r2.x
r3.xProperty().bind(
r1.xProperty().add(r2.xProperty())
);
高レベルBindingfinal Rectangle r1 = new Rectangle();
final Rectangle r2 = new Rectangle();
Rectangle r3 = new Rectangle();
// r3.x = r1.x + r2.x
DoubleBinding b = new DoubleBinding() {{ super.bind(r1, r2); }
@Override protected double computeValue() {
return r1.getX() + r2.getX();
}};
r3.xProperty().bind(b);
低レベルBinding
頻出パターン向けでコード補完もでき使い易い
高レベルBindingで不足の場合に実装若干性能が良い
Copyright© 2011, Oracle. All rights reserved.
Webサービス
Webサービスサポート• HttpRequestクラス
• XML, JSONパーサ, XPathサポート
55
Copyright© 2011, Oracle. All rights reserved.
Roadmap
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0ロードマップ5/1にEAプロセス完了
57
まもなくβリリース!
イマココ
5/1End of EA
Q3 CY12
Copyright© 2011, Oracle. All rights reserved.
JavaFX 2.0ロードマップ主な機能のマイルストーン
58
Early Access
•JavaFXスクリプトのAPI移植
•Binding API
•Sequence, Observable List
•ハードウェアアクセラレーション
•アニメーション高速化
•Swing相互連携
•Webコンポーネント
•Media再生
Public Beta
•マルチスレッド改善
•フォーカス管理
•レイアウトコンテナ再設計
•フルスクリーンビデオ
•プログラムメディアマーカ
•HTML DOM
•CSSアニメーション
•メディアプレイヤコントロール(*)
•Webブラウザコントロール
•TableViewコントロール
•SplietViewコントロール
•TabViewコントロール
General Availability
•実行時のヒープ削減
•ディスクサイズ削減
•起動性能改善
•公式のベンチマーク測定
•メディア/アニメーションのタイムライン同期
•Prismプラグイン
•リッチテキスト(*)
•サンプルアプリケーション
赤字はEAで実装済み*は実装未確定
http://javafx.com/roadmap
Copyright© 2011, Oracle. All rights reserved.
リファレンス
JavaFX 2.0 Roadmap & Featureshttp://javafx.com/roadmap/
JavaFX Partner Programhttp://javafx.com/partners/
Java EGBUチームブログhttp://blogs.oracle.com/javajp/
59
Copyright© 2011, Oracle. All rights reserved.
Copyright© 2011, Oracle. All rights reserved.
Copyright© 2011, Oracle. All rights reserved.
Layouts
• Pane
• AnchorPane
• BorderPane
• FlowPane
• GridPane
• HBox
• StackPane
• TilePane
• VBox
Copyright© 2011, Oracle. All rights reserved.
LayoutsBorderPane borderpane=new BorderPane();borderpane.setTop(rect);borderpane.setLeft(rect2);borderpane.setCenter(rect3);borderpane.setRight(rect4);borderpane.setBottom(rect5);borderpane.setTopPos(Pos.CENTER);borderpane.setBottomPos(Pos.CENTER);getChildren().add(borderpane);
HBox hBox = new HBox();hBox.setSpacing(10);hBox.getChildren().addAll(sample1,
sample3, sample4, sample5);
VBox vb = new VBox(10);vb.getChildren().addAll(hBox, sample2);getChildren().add(vb);
Copyright© 2011, Oracle. All rights reserved.
Event Handling
• All of our events extend an Event object
• Event flow:
• Capturing
• Bubbling
• EventHandler callback for events
• setOnMouseClicked(EventHandler<MouseEvent>)
• addMouseHandler(MouseEventID, EventHandler)
• addMouseFilter(MouseEventID, EventHandler)
• Events can be consumed
Parent
Child
Cap
ture
Bubb
led u
p
Copyright© 2011, Oracle. All rights reserved.
Events Example
Rectangle rect = new Rectangle(150,0,60,60); ...
Text text = new Text(0,0, "Add a hover listener"); ...
Button buttonAdd = new Button("Add change listener"); ...
ChangeListener hoverListener = new ChangeListener() {
public void handle(Bean bean, PropertyReference<?> pr) {
if (rect.isHover()) {
text.setContent("hovered");
} else {
text.setContent("not hovered");
}}};
buttonAdd.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
rect.addChangeListener(Rectangle.HOVER, hoverListener);
text.setContent("listerer added");
}});
Button buttonRemove = new Button("Remove change listener"); ...
buttonRemove.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
rect.removeChangeListener(Rectangle.HOVER, hoverListener);
text.setContent("listerer removed");
}});
getChildren().addAll(rect, buttonAdd, buttonRemove, text);