La nouvelle version de JavaFX vient de sortir, comme prévu à temps pour JavaOne, et je dois avouer qu'elle restaure quelque peu la confiance érodée ces derniers temps que j'avais en cette plateforme.
Je n'ai plus l'impression d'avoir perdu mon temps à apprendre et tester ce langage et cette API !
Pourquoi cette perte de confiance ?
On avait peu de nouvelles officielles, donnant une impression de stagnation (malgré quelques indices), et je me demandais l'intérêt d'une plateforme RIA utilisant Swing pour les contrôles (surtout si ce n'est pas utilisable sur les mobiles), et les rapports de faibles performances sur les scènes avec de nombreux nodes étaient décourageantes.
Les release notes de JavaFX 1.2 font état de performances accrues, et l'auteur du benchmark Bubblemark rapporte un boost de trois fois la vitesse précédente sur cette application ! Même si cela ne marchera pas partout, c'est un résultat encourageant. JavaFX était plus rapide que ces concurrents (encore une fois, dans ce cas particulier), il les bat à plate-couture maintenant !
De plus, le package javafx.scene.control vient d'hériter d'une vingtaine de nouvelles classes d'un coup, dont de nombreux contrôles natifs ! Enfin !
Cette mise à jour s'annonce majeure (contrairement à la 1.1) : outre les améliorations sensibles ci-dessus, on a aussi quelques changements de syntaxe incompatible avec les versions précédentes... Cela nécessitera une mise à jour de certains de vos scripts, mais ça va dans le bon sens (modifications avant d'avoir trop de legacy code).
Par exemple, on n'a plus le droit d'omettre les séparateurs dans une séquence, donc [ 1 2 3 ]
devient illégal. C'est pas plus mal parce que c'était ambigu, voire faux dans certains cas : [ 1 -2 3 ]
ou [ "1" "2" "3" ]
ne donnaient pas le résultat attendu ! Et comme on peut toujours omettre virgule et point-virgule après une accolade fermante (voir code ci-dessous), la gène est vraiment mineure, voir inexistante (je trouve plus lisible des nombres séparés par des virgules, question d'habitude sans doute).
Autre modification mineure : certains mots-clés perdent leur caractère "magique" et peuvent être utilisés comme identificateurs.
Quoi d'autre ? Des classes de paire (simple mais utile pour faire des sortes de tableaux associatifs en JavaFX, un manque flagrant dans le langage), de propriétés, de ressources et de stockage. Par exemple :
import javafx.data.Pair;
import javafx.util.Properties;
import javafx.io.Storage;
import javafx.io.Resource;
import java.io.FileOutputStream;
import java.io.FileInputStream;
def FILE_NAME = "properties.java.txt";
def propFile = Storage { source: "properties.jfx.txt" }
var pairSequence: Pair[] =
[
Pair { name: "WWW", value: "HTML" }
Pair { name: "Sun", value: "JavaFX" }
Pair { name: "Adobe", value: "Flex" }
Pair { name: "Microsoft", value: "Silverlight" }
Pair { name: "WWW", value: "Ajax" }
Pair { name: "French", value: "Àvéc dès âccênts àrbîtrâïrês !" }
Pair { name: "Français", value: "Yes, I am..." }
Pair { name: "A=B", value: "true" }
Pair { name: "Foo Bar", value: "false" }
Pair { name: "#Foo", value: "bar" }
];
// Note that WWW is twice in the sequence!
var propsOut: Properties = Properties {};
function PutPair(props: Properties, pair: Pair)
{
props.put(pair.name, pair.value);
}
for (pair in pairSequence)
{
print("{pair.name} ");
PutPair(propsOut, pair);
}
println("");
// Writes information in source's path
// We loose one WWW...
var fosJ: FileOutputStream = new FileOutputStream(FILE_NAME);
propsOut.store(fosJ);
fosJ.close();
// Writes information in C:\Documents and Settings\PhiLho\Sun\JavaFX\Deployment\storage\muffin\
// (on Windows, obviously!) with a 78e9b9eb-1b6c06c9 (for exampe) file holding the data and
// a 78e9b9eb-1b6c06c9.muf file pointing where to extract temporarily the file
// (in the place where the .class files are).
var fosJFX = propFile.resource.openOutputStream(true);
propsOut.store(fosJFX);
fosJFX.close();
var propsIn: Properties = Properties {};
var fisJ: FileInputStream = new FileInputStream(FILE_NAME);
propsIn.load(fisJ);
fisJ.close();
println("{propsIn.get("Sun")} / {propsIn.get("WWW")} /"
"{propsIn.get("French")} / {propsIn.get("Français")} /"
"{propsIn.get("A=B")} / {propsIn.get("#Foo")}");
var fisJFX = propFile.resource.openInputStream();
propsIn.load(fisJFX);
fisJFX.close();
println("{propsIn.get("Sun")} / {propsIn.get("WWW")} /"
"{propsIn.get("French")} / {propsIn.get("Français")} /"
"{propsIn.get("A=B")} / {propsIn.get("#Foo")}");
Il y a aussi des classes pour faire des diagrammes (charts), pour lire des fils RSS et Atom, une classe Math doublon de la classe Java, plus de layout (simpliste, MigLayout reste utile) et de gestion de threads, un effet graphique de plus, etc.
Plus un meilleur support des mobiles et surtout des systèmes autres que Windows.
Dans l'ensemble, une mise à jour majeure à avoir d'urgence !