java fx 2.0による次世代アプリケーション開発 · java fx...

65
<Insert Picture Here> Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社 Java Embedded Global Business Unit 佐藤 芳樹 2011519

Upload: others

Post on 04-Sep-2019

21 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

<Insert Picture Here>

Java FX 2.0による次世代アプリケーション開発

日本オラクル株式会社 Java Embedded Global Business Unit佐藤 芳樹2011年5月19日

Page 2: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。

OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。

Page 3: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

What’s JavaFXJAVAFX 2.0

本発表の内容は2011/5/19時点で、Early Access版の情報を元に構成されていますβ版及びGA版では変更が発生する内容がある点を御理解下さい。

Page 4: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFXとはJavaリッチクライアントプラットフォームの進化系

クロスプラットフォームのRIA開発・実行環境

魅力的なアプリケーションによる特別なユーザ体験を提供

巨大なJavaエコシステムを最大限に活用

4

RIA:リッチインターネットアプリケーションとは動的で表現力豊かなWebアプリケーションの総称(Applet, DHTML, Flash/Air, SilverlightもRIA)

Page 5: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFXのRIAアプリケーション例

5

MLB.com Vancouver2010.com

Oracle Beehive Client

Page 6: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 7: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 8: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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技術で投資リスクや開発コストを削減

Page 9: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX 2.0とは生まれ変わったJavaFXの特徴②

高性能描画パイプライン• PRISMハードウェアアクセラレーションとGlassツールキット

埋め込みブラウザ• Webkitベースのレンダラ

新しいメディア再生エンジン• GStreamerベース

ブラウザプラグイン• アプレットのPRISM実行

50以上の多彩なUIコンポーネント• チャート,メニュー,テーブル,パネル等に加え、CSSサポート

Swing相互連携

9

Page 10: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 11: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 12: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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構築

Page 13: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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のクロスプラットフォームマルチメディアライブラリ

Page 14: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 15: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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);

Page 16: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX Demo

Page 17: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Ensemble

17

Page 18: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Brick Breaker

18

Page 19: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Display Shelf

19

Page 20: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Key Stroke Motion

20

Page 21: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

How to JavaFXJAVAFXアプリケーション開発

Page 22: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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以降!

Page 23: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 24: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 25: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 26: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 27: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX Script

Alternatives

Page 28: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 29: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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)

Page 30: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

}

Page 31: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX with Groovy

31

Groovyとは?

Java用のスクリプト言語

Groovyを使う利点• Javaと密接でほぼ全ての機能を利用可能

• 動的型付け

• クロージャでイベント処理実装

• 省略構文やビルダー機能で宣言的なGUI記述が可能• e.g.) Swing向けのGriffon

Page 32: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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利用例

Page 33: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX with Scala

Scalaとは?オブジェクト指向と関数型をミックスし、型推論、アクター、Traits/Mix-inなど何でもできる

Scalaを使う利点• JavaFXスクリプトのように、GUIプログラミングを容易にする

多くの機能を保有

• 静的型付け可能

• クロージャ

• 宣言的記述

• DSLサポート

33

Page 34: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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アプリ

Page 35: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

多言語連携

その他の選択肢• JavaScript (Rhino)

• Clojure

• Jython

• JavaFX 1.3 (Visage)

DSL実装の提供は?• OracleからJava以外のBuilder, DSL実装が提供される訳ではない

• コミュニティが、自由に開発・保守・改良したものを利用する

35

(なので安心)

Page 36: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX Graphic

Components

Page 37: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 38: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 39: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 40: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 41: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 42: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Controls

42

Many more...

Page 43: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Charts

43

Page 44: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 45: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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);

Page 46: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX Animation

Page 47: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

2種類のアニメーション

47

Page 48: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 49: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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の並行・連続

Page 50: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 51: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX

Beans and Binding

Page 52: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 53: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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>でラッピングされ監視可能

Page 54: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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で不足の場合に実装若干性能が良い

Page 55: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Webサービス

Webサービスサポート• HttpRequestクラス

• XML, JSONパーサ, XPathサポート

55

Page 56: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Roadmap

Page 57: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

JavaFX 2.0ロードマップ5/1にEAプロセス完了

57

まもなくβリリース!

イマココ

5/1End of EA

Q3 CY12

Page 58: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 59: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 60: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Page 61: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Page 62: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

Copyright© 2011, Oracle. All rights reserved.

Layouts

• Pane

• AnchorPane

• BorderPane

• FlowPane

• GridPane

• HBox

• StackPane

• TilePane

• VBox

Page 63: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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);

Page 64: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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

Page 65: Java FX 2.0による次世代アプリケーション開発 · Java FX 2.0による次世代アプリケーション開発 日本オラクル株式会社Java Embedded Global Business

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);