Utiliser une source de données REST dans une application JavaFX avec DataFX

L'un des points forts du projet DataFX est de faciliter la récupération et l'utilisation de données externes dans une application JavaFX. Dans cet article, à l'aide de GroovyFX et du système GRAPE du langage Groovy, voyons comment atteindre ce simple objectif : afficher dans une application JavaFX des données provenant d'une source de données distante et décrites au format JSON.

Pour simplifier les choses, j'ai utilisé le script Groovy présenté plus loin ; celui-ci permettra de récupérer par une méthode GET sur l'URL http://localhost:5050/, le document JSON suivant, donnant une liste d'utilisateurs identifiés par leurs prénoms et noms :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
    "users": [
        {
            "firstname": "Guillaume",
            "lastname": "Laforge"
        },
        {
            "firstname": "Cédric",
            "lastname": "Champeau"
        },
        {
            "firstname": "Bertrand",
            "lastname": "Goetzmann"
        }
    ]
}

La source de données REST

Voici ci-dessous le script Groovy, ratpackrestsource.groovy (en fichier attaché), mettant à disposition les données au format JSON, et tirant parti du framework Ratpack. Notez au passage avec quelle facilité les données de réponse sont générées grâce au builder JsonBuilder du langage Groovy.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@GrabResolver("https://oss.jfrog.org/artifactory/repo")
@Grab("io.ratpack:ratpack-groovy:0.9.9")
import static ratpack.groovy.Groovy.ratpack
import groovy.json.JsonBuilder

// You can change anything in the ratpack {} closure without needing to restart

ratpack {
    handlers {
        get {
            def data = [
                [firstname: 'Guillaume', lastname: 'Laforge'],
                [firstname: 'Cédric', lastname: 'Champeau'],
                [firstname: 'Bertrand', lastname: 'Goetzmann']
            ]

            def builder = new JsonBuilder([users: data])

            response.send 'application/json', builder.toString()
        }
    }
}

Je précise à nouveau que le document JSON sera disponible sur l'URL http://localhost:5050/ (une fois le script démarré), et que, bien sûr, on pourrait utiliser tout autre outil ou framework pour générer des données structurées de manière identique.

L'application JavaFX

L'application JavaFX sera codée avec un simple script GroovyFX (datafxrestsource1.groovy, qui est en fichier attaché) ; libre à vous de créer une application JavaFX compilée écrite en Java/Groovy, en reprenant tout ou partie des éléments mis en démonstration dans le script. Le but de notre application va être d'afficher la liste des utilisateurs dans un contrôle d'interface utilisateur JavaFX ListView.

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
31
32
@Grab(group='org.codehaus.groovyfx', module='groovyfx', version='0.4.0')
import static groovyx.javafx.GroovyFX.start
@Grab(group='io.datafx', module='datasources', version='8.0.7')
@Grab(group='org.glassfish', module='javax.json', version='1.0.4')
import io.datafx.provider.ListDataProvider
import io.datafx.io.RestSource
import io.datafx.io.converter.JsonConverter
import groovy.transform.ToString


@ToString
class User {
    String firstname
    String lastname
}

def converter = new JsonConverter("users", User)
def source = new RestSource("http://localhost:5050/", converter)
def dataProvider = new ListDataProvider(source)

start {
    stage(title: 'DataFXRestSource1', width: 800, height: 500, visible: true) {
        scene {
            vbox(spacing: 10, padding: 10) {
                listView(prefHeight: 400, items: bind(dataProvider.data))
                button('Retrieve', onAction: {
                    dataProvider.retrieve()
                })                          
            }
        }
    }
}

L'application JavaFX consiste simplement en une scène comportant deux contrôles d'interface utilisateur de types ListView et Button ; on a rattaché au bouton une action (prenant la forme d'une Closure Groovy) qui déclenche la récupération des données au travers du fournisseur de données et la méthode retrieve(). Référencé par la variable dataProvider, ce fournisseur de données est de type ListDataProvider, permettant la gestion d'une collection d'objets de type User, accessible au travers de la méthode getData().
En effet, le fournisseur de données est lié à la source de données de type RestSource qui accède au service REST délivrant les données au format JSON. Justement, ces données étant dans un format JSON, on a recours à un objet de type JsonConverter qui, pour chaque objet de la liste JSON de clé users, crée un objet Java User correspondant.
Comme on a défini une liaison entre la propriété items de la ListView d'une part et la collection dataProvider.data (qui est une liste observable d'objets User) d'autre part, dès lors que l'on exécute retrieve(), et bien la liste est mise à jour automatiquement !

J'espère que ce court article vous aura donné envie d'en savoir plus sur DataFX ! Dans un prochain article, j'aborderai l'affichage des données utilisateurs dans une table.


Fichier(s) :