Utiliser le projet Undecorator dans une vue GroovyFX

Undecorator est un projet intéressant pouvant donner une allure plus attrayante et moderne à vos applications JavaFX ; plus précisément, il donne un look particulier à l'objet Stage de votre application, qui est le conteneur de plus haut niveau, en le débarrassant des décorations qui rappellent sur quel système l'on est.Mais de plus, Undecorate ajoute ses propres icônes, un menu système, et la possibilité glisser/déplacer l'application au moyen de la souris, et plus encore.

Une des manières d'intégrer Undecorator dans une application JavaFX est de passer par la création d'une instance de UndecoratorScene qui est une sous-classe de javax.scene.Scene. Pour cela, vous devez bien sûr utiliser la librairie Undecorator.jar, qui contient classes et ressources graphiques, ainsi que des fichiers CSS.

Mais comment intégrer Undecorator dans une application JavaFX qui a recourt au projet GroovyFX et à son puissant builder SceneGraphBuilder ?

Le builder SceneGraphBuilder implémente le DSL de GroovyFX dans le but de construire des vues JavaFX de manière plus concise et claire. Son implémentation repose sur la classe FactoryBuilderSupport, dont nous allons pouvoir tirer partie.

En effet, nous pouvons enregistrer notre propre classe pour, dans notre cas, fabriquer un objet Scene qui soit de type insidefx.undecorator.UndecoratorScene, lorsque l'on rencontre un noeud scene. La classe UndecoratedSceneFactory, dont le code source est en fichier attaché à cet article, étend la classe groovyx.javafx.factory.SceneFactory ; cette factory est enregistrée dans l'objet SceneGraphBuilder juste avant la construction de la vue, comme illustré dans le code ci-dessous :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.odelia.javafx

import javafx.scene.Scene
import static groovyx.javafx.GroovyFX.start

start {
    // Register a UndecoratedSceneFactory instance as factory for the scene node
    def sgb = delegate
    sgb.registerFactory "scene", new UndecoratedSceneFactory(Scene)

    // Your UI
    def root = region(minWidth: 750, minHeight: 400) {
        hbox(padding: 20, translateY: 120) {
            text(text: "GroovyFX", style: "-fx-font-size: 70pt") {
                fill linearGradient(endX: 0, stops: [palegreen, seagreen])
            }
            text(text: "Undecorator", style: "-fx-font-size: 70pt") {
                fill linearGradient(endX: 0, stops: [black, dodgerblue])
                effect dropShadow(color: dodgerblue, radius: 25, spread: 0.25)
            }
        }
    }

    stage(title: "GroovyFX-Undecorator", visible: true) {
        scene(root: root)
    }.with {
        minWidth = it.scene.undecorator.minWidth
        minHeight = it.scene.undecorator.minHeight
    }
}


Fichier(s) :