décembre
2011
Un collègue m’a fait remarqué la semaine dernière que la version RC1 de NetBeans 7.1 est disponible. Étant donné qu’il y avait pas mal de bugs dans la version Beta (celle qui a été publiée durant la JavaOne 2011 pour la sortie de JavaFX 2.0), c’était intéressant de changer.
Comme de bien entendu, les projets précédemment créés ne sont pas compatibles avec la nouvelle version. Il faut donc en recréer des nouveaux, ce qui est toujours une perte de temps monstrueuses surtout quand il s’agit de recréer les liaisons et dépendances inter-projets ou encore aller fouiller dans ses scripts ANT pour trouver des bouts de code customisés et vérifier qu’ils fonctionnent encore.
Il y a eut un petit changement dans le packaging des applications JavaFX. Ains, désormais, les CSS sont compilés lorsqu’une application est packagée dans un JAR.
Par exemple le code suivant:
ClassLoader loader = getClass().getClassLoader();
URL cssURL = loader.getResource(__DIR__ + "resources/MonApp.css");
scene.getStylesheets().add(cssURL.toExternalForm());
Fonctionne lorsque l’application est directement lancée depuis NetBeans (car NetBeans lance désormais la version non-packagée des classes qui se trouvent dans le répertoire build du projet) mais plus lorsqu’on exécute le JAR ou que ce projet est inclus dans un autre (NullPointerException sur cssURL.toExternalForm()).
Note : ici __DIR__ est une classe custom qui permet de lier un répertoire de ressource a un package donné (comme l’ancienne variable de script __DIR__ en JavaFX 1.x) ce qui permet d’éviter d’écrire des chemins d’accès en dur dans le code, évitant ainsi de s’arracher les cheveux en cas de refactoring de packages.
Une rapide inspection du JAR montrera que le fichier CSS est absent et a été remplacé par un fichier bss du même nom.
Ainsi il faudra remplacer le code plus haut par :
ClassLoader loader = getClass().getClassLoader();
URL cssURL = loader.getResource(__DIR__ + "resources/MonApp.css"); // text CSS.
if (cssURL == null) {
cssURL = loader.getResource(__DIR__ + "resources/MonApp.bss"); // binary CSS.
}
scene.getStylesheets().add(cssURL.toExternalForm());
Il est toutefois possible de configurer cela dans les options du projet en décochant la case Properties->Build->Packaging->Binary Encode JavaFX CSS File.
La compilation dans NetBeans produit des messages d’avertissements inintéressants, ainsi on trouvera :
Warning: offlineAllowed not supported by this version of JavaFX SDK deployment Ant task. Please upgrade JavaFX to 2.0.2 or higher.
Or bien sur cette version n’est pas encore disponible pour le moment.
À noter que le post de Richard Bair concernant l’open-sourcing des contrôles fait état qu’une version 2.1 est en route également.
The following query exposes the list of bugs and features for UI controls presently targeted at 2.1.
7 Commentaires + Ajouter un commentaire
Commentaires récents
- Back from the future… dans
- Back from the future… dans
- Static linking = does not Compute dans
- Paquetage x 2 dans
- Why you little… dans
[…] Collection Passage a NetBeans 7.1 RC1, CSS & JavaFX 2.0.2, 2.1 par bouye (05/12/2011 00:14) Un collègue m’a fait remarqué la semaine dernière que la […]
Sans code ni aperçu de la structure du projet ou de l’endroit où sont les divers fichiers, difficile à dire d’où vient le problème. C’est plus le genre de trucs à poster sur le forum qu’ici.
Bonjour, je me retrouve avec un autre problème avec le fichier CSS, a vrai dire la même scene sans aucune modification de code j’ai crée une form Swing pour porter cette scène dessus. La classe est dans le même package que l’ancienne classe Application purement JavaFX alors je ne sais pas pourquoi ça me donne encore le NullPointerException sur
__DIR__ est une classe perso que j’ai créée pour combler un vide apparu lors du passage en 2.0.
En 1.x, __DIR__ est une variable de script globale ( == une variable statique) qui permet de récupérer l’URL relative du package actuel de la classe courante ce qui permet d’accéder aux ressources (image, sons, etc.) utilisées par cette même classe (que ce soit dans une arborescence non-compressée -le répertoire build de NetBeans- ou dans un JAR), ce qui évite de devoir taper en dur un chemin d’accès pour un ClassLoader (ex: loader.getResource(« org/spc/ofp/project/movit/resource/MonApp.css »; chose que NetBeans ne comprends pas du tout lorsqu’on fait du refactoring et qu’on renomme un package par exemple. Ce qui oblige donc a aller manuellement changer le code après avoir fait le refactoring).
package org.spc.ofp.java.lang; <br />
<br />
/** <br />
* This class is inspired by the old (@code __DIR__} script level (AKA static) variable from JavaFX Script (JavaFX 1.x) which allowed to get access to resources in packages and JARs. <br />
* @author Fabrice Bouyé (fabriceb@spc.int) <br />
*/ <br />
public class __DIR__ { <br />
<br />
/** <br />
* The __DIR__ value. <br />
*/ <br />
private String value; <br />
<br />
/** <br />
* Creates a new instance. <br />
* @param object The parent object. <br />
* @throws NullPointerException If {@code object} is {@code null}. <br />
*/ <br />
public __DIR__(Object object) throws NullPointerException { <br />
this(object.getClass()); <br />
} <br />
<br />
/** <br />
* Creates a new instance. <br />
* @param aClass The parent class. <br />
* @throws IllegalArgumentException If {@code aClass} is {@code null}. <br />
*/ <br />
public __DIR__(Class aClass) throws IllegalArgumentException { <br />
if (aClass == null) { <br />
throw new IllegalArgumentException("aClass cannot be null."); // NOI18N <br />
} <br />
value = aClass.getPackage().getName().replaceAll("\.", "/") + "/"; // NOI18N <br />
} <br />
<br />
/** <br />
* Return the __DIR__ value. <br />
* @return <br />
*/ <br />
public String __DIR__() { <br />
return value; <br />
} <br />
<br />
/** <br />
* {@inheritDoc} <br />
*/ <br />
@Override <br />
public String toString() { <br />
return value; <br />
} <br />
} <br />
A vrai dire c’est une bonne chose qu’il fasse ça pour nous automatiquement, car vraiment utiliser Ant pour créer le fichier binaire du fichier CSS , ça aller nous faire chier, j’ai lu les truc là de ant-javafx, mais bon sinon à quoi ça sert les IDE.
ça ne marche pas avec __DIR__ peut être je ne comprend pas bien comment l’implementer ,Mais moi je ne suis pas une personne au solution unique j’ai bricoler et ça marche
Un grand merci arce que j’avais du mal à utiliser mon fichiers CSS toujours ça me donne une exception NullpointerException
Mais je vois comme si les deux bout de code sont égaux :
[CODE]
URL cssURL = loader.getResource(__DIR__ + « resources/MonApp.css »); // text CSS.[/CODE] et ça [CODE]
cssURL = loader.getResource(__DIR__ + « resources/MonApp.bss »); // binary CSS. [/CODE]