シーングラフ
JavaFX シリーズ目次
- JavaFX 2.1のインストール (Windows 編)
- NetBeans で JavaFX (Windows 編)
- JavaFX 2.1 のインストール (Linux 編)
- JavaFX で Hello, World!
- シーングラフ
- コントロール その 1
前回の Hello, World! の時に GUI はツリー構造で表せるということを書きました。
たとえば、下の絵に示した GUI はこんな構造になります。
[Scene]-[VBox]-+-[HBox]-+-[Label] | +-[TextField] | +-[Button] +-[WebView]
このような GUI を表すツリー構造を JavaFX ではシーングラフと呼びます。
グラフといっても、棒グラフとか円グラフとかのグラフではなく、グラフ理論のグラフです。
もともと、シーングラフは 3D CG で使われていた言葉で、Java 3D もシーングラフを使用して 3D CG を構築します。でも、3D に限定する必要はまったくなく Adobe の Illsutrator などもシーングラフを使っています。
今までの Swing も同じようにツリー構造で GUI を表していました。しかし、ツリーに追加できるのは Swing のコンポーネントだけという違いがあります。JavaFX ではコントロールはもちろん、四角や丸などの今までは Java 2D で描画していた要素もシーングラフに記述することができます。
たとえば、下の GUI は...
[Scene]-[Group]-+-[Circle] +-[GridPane]-+-[Label] +-[TextField] +-[Label] +-[TextField]
Swing であれば、Circle は Java 2D で書かなくてはいけなかったので、JComponent のサブクラスを作成して paintComponent メソッドをオーバーライドする必要がありました。
でも、JavaFX だったら、単純にシーングラフに追加すればいいだけです。
現状、JavaFX は 3D の機能は限定的なのですが、視点の位置 (カメラ) やライトなどもシーングラフに記述することができます。
しかし、前回も書いたように Java だとシーングラフが分かりにくい。ということで、これからは FXML が主流になると思います。
たとえば、はじめのブラウザの場合、FXML がどうなるかというと、こんな感じ。
<?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import javafx.scene.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.web.*?> <VBox xmlns:fx="http://javafx.com/fxml" prefWidth="1000" prefHeight="740" fx:controller="custombrowser.CustomBrowser"> <children> <HBox> <children> <Label text="URL:" /> <TextField prefColumnCount="40" /> <Button text="Load" /> </children> </HBox> <WebView /> </children> </VBox>
でも、これだけじゃステージに該当するコントロールが表示されるだけです。
ブラウザには何も表示されませんし、ボタンを押しても何も変化はありません。FXML は GUI の構造を記述することはできますが、振る舞いは記述できません*1。振る舞いは Java で書く必要があります。
ということは FXML で書いた要素と Java を連携させる必要があります。次回はそこら辺について書く予定です。
*1:厳密には書くことができるのですが、それはまた別の機会に書きます。