JavaFX: Stage{} - auf dem Weg zum Node-basierten GUI-System
JavaFX unterscheidet derzeit zwischen den GUI-Elementen von Swing
(javafx.ext.swing) und den grafischen Elementen wie Rechteck, Kreis
von Scene Graph
(javafx.scene.*). Dies ist eine recht künstliche
Unterscheidung, die dazu führt, dass es für beide Komponenten eigene Layout-Manager
gibt und grafische Elemente über Canvas{} relativ künstlich
in eine Swing-GUI eingebettet werden. Mit dem "node-centric"-Approach wird diese
Unterscheidung aufgehoben und alle Elemente, GUI und Grafik, als Nodes
behandelt werden. Zwei Schritte hierzu sind javafx.application.*
und Stage{}.
James Weaver hat darüber bereits am 9. Juli berichtet, kurz nachdem die erste Stage-Implementierung veröffentlicht wurde.
javafx.application.*
javafx.application.* enthält folgende Klassen, in denen
die dargestellten Inhalte als Nodes verwaltet werden.
- Applet
- Application
- Dialog
- Frame
- Stage
- Window
Umbenennung innerhalb von javafx.ext.swing.*
Den bisher schon existierenden GUI-Klassen gleichen Namens in
javafx.ext.swing.* wurde ein Swing vorangestellt,
um Namenskonflikte zu umgehen.
- SwingApplication
- SwingDialog
- SwingFrame
- SwingWindow
Damit bisherige GUI-Programme für javafx.ext.swing.* mit der aktuellen
JavaFX-Version laufen muss also beispielsweise Frame{} in
SwingFrame{} umbenannt werden. Weitere Änderungen sind nicht
nötig.
Stage{}
Neu hinzugekommen in javafx.application.* ist Stage{}.
Stage{} ist der neue Container für die Nodes der grafischen Elemente
und in Zukunft zudem für die GUI-Elemente, die sich dann gemeinsam
mit den grafischen Elementen in einer Hierarchie befinden, so dass keine
unterschiedlichen Layout-Manager mehr benötigt werden. Stage{}
enthält folgende Attribute:
- content Node[]
- Der dargestellte Inhalt basierend auf
Node{}. - fill Paint
- Der Hintergrund, z.B.
color.WHITE. - height Integer
- Die Höhe der
Stage{}, die sich an die des Fensters/Applets anpasst. - width Integer
- Die Breite der
Stage{}, die sich an die des Fensters/Applets anpasst.
Beispiel: Hello World!
import javafx.application.*;
import javafx.scene.*;
import javafx.scene.text.*;
import javafx.scene.paint.*;
Frame{
closeAction: function(): Void {java.lang.System.exit(0);}
title : 'Stage: Hello World!'
width : 270
height : 150
visible: true
stage: Stage{
fill : Color.WHITE
content: Text {x : 60
y : 40
content : 'Hello World!'
font : Font{size: 24}
}// Text
}// Stage
}// Frame
Beispiel: Resize Frame
width und height lassen sich dazu nutzen, den
Inhalt von Stage{} an die Größe des Fensters anzupassen.
import javafx.application.*;
import javafx.scene.geometry.*;
import javafx.scene.paint.*;
Frame{
var stageRef: Stage;
closeAction: function(): Void {java.lang.System.exit(0);}
title : 'Stage: Resize Frame'
width : 240
height : 240
visible : true
stage: stageRef = Stage{
fill : Color.WHITE
content: Rectangle{x : 10
y : 10
width : bind stageRef.width - 20
height: bind stageRef.height - 20
fill : Color.BLUE
}// Rectangle
}// Stage
}// Frame
Neben diesen grafischen Elementen wird man in Zukunft auch die GUI-Elemente
aus javafx.ext.swing innerhalb von Stage.content
benutzen können - solange sie nicht als Nodes vorliegen kann man
sie mit Hilfe des weiterhin vorhandenen ComponentView{} einbinden.
Und für das Layout werden sich in javafx.scene.layout.* voraussichtlich
bekannte Layout-Manager wie FlowPanel{} und GridPanel{}
wiederfinden.
Beispiele auf dieser Site
Was ist mit javafx.ui.* und javafx.gui.*?
Das in älteren JavaFX Script-Beispielen vorhandene javafx.ui.*-Paket
wurde während der JavaFX-Entwicklung in javafx.gui.* und dieses
in javafx.ext.swing.* umgewandelt. JavaFX wird von Sun als Open
Source-Projekt entwickelt, so dass man solche Entwicklungen
live verfolgen kann. Mit der Veröffentlichung der Vorschauversion des SDK (angekündigt
für diesen Juli) dürfte sich die API dann so langsam stabilisieren.
Literatur
- Shannon Hickey, "Upcoming name / class change", 07-Jul-2008, openjfx gui-dev ML
- James Weaver, "The JavaFX SDK Packages are Taking Shape", 27-Jun-2008, learnjavafx.typepad.com
- James Weaver, "Setting the 'Stage' for the JavaFX SDK", 09-Jul-2008, learnjavafx.typepad.com
- alexsch, "July is almost 1/2 over ...", 16-Jul-2008, java.net Forums
- James L. Weaver, "Fwd: svn commit: r3244 - trunk/runtime/src/share/classes/javafx/application/Stage.fx", 09-Jul-2008, openjfx gui-dev ML
