Projet MVC-CD Initiation à JavaFX 2.0 Créé par M. Jaouadi, le 25 mars 2015 Modifié par M. Jaouadi, le 30 mars 2015 Page 1 sur 11 Table des matières 1 Préambule ....................................................................................................................................... 3 2 JavaFX .............................................................................................................................................. 3 3 Architecture de JavaFX .................................................................................................................... 3 4 Structure d’une application en JavaFX ............................................................................................ 4 4.1 Graphe de scène...................................................................................................................... 4 4.2 Exemple : ................................................................................................................................. 6 5 Les composants standards (Controls) : ........................................................................................... 7 6 Les conteneurs (Layout-Pane) : ....................................................................................................... 8 7 Migration Swing JavaFX : ............................................................................................................ 9 8 La séparation des préoccupations:................................................................................................ 10 9 Référence externe au projet ......................................................................................................... 11 Page 2 sur 11 1 Préambule Ce document expose d’abord une initiation théorique à JavaFX une technologie considérée comme étant l’avenir pour le développement d'interfaces graphiques en Java. Notre choix s’est fixé sur cette technologie afin d’améliorer la réactivité de nos IHM, et favoriser la séparation MVC. De plus, la communauté java SE s’oriente vers considérer JavaFX le successeur de Swing pour sa librairie d’interface utilisateur (Client UI library). Ceci a été clairement déclaré dans la documentation d’Oracle [Oracle-01]. Dans cette perspective et afin de maintenir le cycle de vie du plugin et assurer la prospérité de tout le projet, une migration de l’environnement Swing vers JavaFX est pertinente. 2 JavaFX Le JavaFX est un langage de programmation orienté interface graphique. Cette technologie est en faveur des applications internet riches qui se comportent sur des multiples plateformes. JavaFX évolue vers le multimédia à travers le traitement des images, la création de media player, et l’intégration audio et vidéo. Ces applications ont l’avantage d’être exécuté sur le web, sur le bureau, (Desktop) ainsi que sur mobile, et même sur télévision. La nouvelle version JavaFX 2 .0 donne la possibilité de développer en deux modes : - Mode procédural : à travers les classes java. - Mode déclaratif : en utilisant la syntaxe XML. 3 Architecture de JavaFX L'architecture technique de JavaFX est composée de plusieurs couches qui reposent sur la machine virtuelle Java (JVM). Seulement la couche API est publique, les autres peuvent subir des changements au fil des versions. Ceci permet d’éviter tout problème de compatibilité. [IHM-01] Figure 1 Diagramme d’architecture de JavaFX [Oracle-02] Quantum Toolkit : permet de lier le « Prism » et la boîte à outils de fenêtrage « Glass » ensemble et les rendre accessibles à la couche JavaFX. Elle gère également les règles relatives aux Threading et à la manipulation des événements. Page 3 sur 11 Prism : pipeline graphique permet d’effectuer la rastérisation et le rendu (rendering) des scènes JavaFX. Glass Windowing Toolkit : est responsable de fournir des services d'exploitation natifs, tels que la gestion des fenêtres, des minuteries et des surfaces. 4 Structure d’une application en JavaFX La structure des composants dans une application JavaFX est basée sur la métaphore du théâtre. Le conteneur de niveau le plus élevé est le stage, à l’intérieur du stage se trouve la scène, cette scène contient le graphe de scène, c’est-à-dire la structure hiérarchique des éléments graphiques dans l’interface. Toutes classes créées doivent hériter de la classe mère Application : Public class Main extends Application Stage est la fenêtre principale indispensable pour l’affichage. C’est l’équivalent de java.awt.Frame en Java. Stage primaryStage.show() ; //afficher la fenêtre principale. Scene contient tous les éléments de notre interface graphique. Elle compose une page dans l’application. Scene Container + layout Container + layout ... Scene scene=new Scene(root,500,400); Une Scène est associée par la suite à la fenêtre principale Stage : Compenents Controls Compenents Controls Compenents Controls primaryStage.setScene(scene); Nodes : ce sont les éléments visuels de la scène : les containers et les composants de JavaFX. 4.1 Graphe de scène Le graphe de scène contient tous les éléments qui composent une interface utilisateur, des groupes, des dispositions, des contrôles et des formes. Ces objets sont des nœuds qui héritent de la classe mère Node. Cette classe comporte de nombreuses sous-classes. Les feuilles de l'arbre sont généralement constitués de composants visibles (boutons, champs texte…) et les nœuds intermédiaires (y compris la racine) sont généralement des éléments de structuration (souvent invisibles), typiquement des conteneurs ou panneaux de différents types (HBox, VBox, BorderPane,…). La famille des nœuds dans une scène est présentée dans la figure ci-dessous : Page 4 sur 11 ChoiceBox ColorPicker ComboBoxBare Combobox Button CheckBox ButtonBase Hyperlink Control Labeled Cell ListView Label MenuBar TitledPane Group MenuButton ToggleButton Slider TabPane TextInputControl ToolBar Prarent TreeView AnchorPane Region WebView Axis Chart Pane javaFX.scene.node Shape Canvas ImageView BorderPane FlowPane GridPane Arc HBox Cercle StackPane Line TilePane Polygon VBox Rectangle Text Page 5 sur 11 4.2 Exemple : public class Main extends Application { @Override public void start(Stage stage) { Group root = new Group(); Scene scene = new Scene(root, 500, 500, Color.BLACK); Rectangle r = new Rectangle(25,25,250,250); r.setFill(Color.BLUE); root.getChildren().add(r); stage.setTitle("JavaFX Scene Graph Demo"); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } } Page 6 sur 11 5 Les composants standards (Controls) : Figure 2 JavaFX UI Controls Page 7 sur 11 6 Les conteneurs (Layout-Pane) : BorderPane Top Left Center Right Buttom HBox Current VBox Date 1 2 3 StackPane GridPane FlowPane TitlePane AnchorPane Page 8 sur 11 7 Migration Swing JavaFX : Swing Components JButton JavaFX Controls Button JLabel Label JTextField TextField JDialog ____ Border Layout BorderPane ____ Accordion JTable TableView JTree TreeView TreeTableView ____ Structure de Swing : Jframe + ContentPane Container Compenent + LayoutManager Structure de JavaFX Container Stage Scene Control +Layout FXML Page 9 sur 11 8 La séparation des préoccupations: Developpeur Designer UX Code java Main.java User interface View.fxml Designer graphique Style application.css Contrôleur Controller.java Prise en charge de CSS JavaFX offre la possibilité d’appliquer les feuilles de style dans la scène graphique et ses composants comme les styles CSS destinées aux composants HTML dans un navigateur. Pour apporter un style à une scene : Scene.getStylesheets(String url) Pour appliquer un Look ande Feel : setUserAgentStylesheet(String url) Le look and feel standard de JavaFX 2.0 est Caspian par contre celui de javaFX 8.0 est Modena Caspian setUserAgentStylesheet(STYLESHEET_CASPIAN) Modena setUserAgentStylesheet(STYLESHEET_ Modena) Page 10 sur 11 Génération du FXML C’est le développement en utilisant l’approche déclarative. Un fichier FXML est un fichier au format XML dont la syntaxe est conçue pour décrire l'interface (la vue) avec ses composants, ses conteneurs, sa disposition. Tableau 1 Mapping Java-XML Java Button b = new Button() ; b.setText("Hello World"); new BorderPane().setCenter(new Button("Hello World")); FXML <Button> <Button text= " Hello World"> <BorderPane><center><Button text= "Hello World"/></center></BorderPane> 9 Référence externe au projet [Oracle-01] JavaFX Foire aux questions http://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html [Oracle-02] Architecture de JavaFX http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-architecture.htm [IHM-01] Cours IHM-1 : JAVAFX http://jacques.bapst.home.hefr.ch/ihm1/cours/ihm1_all_4up.pdf Page 11 sur 11