IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Dynamique CSS Load


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Par défaut Dynamique CSS Load
    Bonjour,

    Dans l'application que je gère je souhaite donné la possibilité à l'utilisateur de choisir les couleurs et la taille de police qu'il désire.

    J'ai essayé deux méthodes qui ne sont pas forcement les mieux adaptées et j'ai pu lire sur stackoverflow notamment qu'avec javafx 8 on aurait du avoir l'arrivé de cette possibilité ?

    Mes deux méthodes sont les suivantes :

    - la première consiste à faire du setStyle sur chaque éléments à chaque actions de types pressed, exit, entered, etc ... mais cette méthode n'est pas propres et pose problème sur les menuitem.

    - la seconde méthode consiste à créer un CSS en mettant des noms à remplacer exemple : fx-background-color : {COLOR_BACKGROUND}
    la seconde méthode est surement celle qui m'intéresse le plus mais je me pose plusieurs questions.

    Concernant les performances celles ci est elle viable ?
    Peux ton charger un string (totalité du fichier) dans un getStyleSheet ?
    Comment pourrais je m'y prendre pour le passer à ma fenêtre (sachant que setStyle ne marche pas sur une Scene et que je ne souhaite pas enregistrer de fichiers) ?

    Les préférences de l'utilisateurs seront stockées via l'API Preference.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    À mon avis, setStyle() pose de nombreux soucis parmi lesquels le fait qu'il faille parcourir toute l’arborescence des nœuds, et ce de chacune des scènes qu'on a d'actives (dans le cas ou on a plusieurs fenêtres ou même des scènes en attente d’être affichées). Or pas mal de contrôles ne permettent pas de voir leur contenu (getChildren() pas publique, remplacé par getNode(), getItem(), getItems(), getContent(), getTabs(), etc. ou alors caché derrière une skin à laquelle on a pas accès. Et ce sans parler bien sur des contrôles qui ne sont pas vraiment des nœuds de la scène en fait (ex : les barres de menu, les menu et leurs contenus qui peuvent ou pas être des menus natifs suivants qu'on est dans une barre menu système ou pas ou encore les infobulles qui peuvent être natifs ou soft), idem pour les boites de dialogue, etc...

    Donc oui la seconde méthode me semble être celle vers laquelle je m'orienterai le plus naturellement. D'autant plus que c'est ce que fait déjà SceneBuilder : si on modifie un CSS de preview attaché à la scène en développement (Menu Preview -> Scene Style Sheet -> Add a Style Sheet...), il le recharge et applique les modifications automatiquement (sur certaines version intermédiaires cette fonctionnalité déconne parfois mais grosso-modo c'est ainsi depuis la version 2).

    J'imagine, mais il faudrait aller vérifier dans le code source, que lorsque le fichier a été choisi, il met en place quelques chose de similaire à un WatchService qui lorsque le fichier a été modifié ré-applique les CSS. En allant explorer le code source, il semble bien qu'il suffisse d'invoquer applyCSS() sur le nœud racine pour rappliquer tous les feuilles de style. Par contre je n'ai pas vraiment trouvé ou ni comment il surveille l’état modifier des fichiers (WatchService est utilisé pour la gestion de la bibliothèque de composants).

    EDIT - ah si, il semble qu'il utilise une classe custom nommée com.oracle.javafx.scenebuilder.kit.util.FileWatcher qui fait du polling de manière régulière sur des fichiers via un java.util.Timer (voir aussi com.oracle.javafx.scenebuilder.app.DocumentWatchingController#fileWatcherDidWatchTargetModification()). C'est un peu bizarre, ça fait un peu doublon avec WatchService et surtout ça fait un polling actif alors que la classe du JDK fait un polling passif. Et après pour forcer la mise a jour d'un fichier CSS, ils l’enlèvent et le réinsèrent (au mème indice) dans la liste getStyleSheets() (voir com.oracle.javafx.scenebuilder.kit.util.Deprecation#reapplyCSS()).

    Coté performance, euh... faut tester quoi... souvent dans SceneBuilder le rechargement est instantané, mais parfois on peut avoir 1-2 s d’écran noir. De plus l'utilisation d'un fichier CSS foire peut faire pas mal planter l'affichage (mais ici de la partie qu'on est en train d'editer et non pas de toute l'app)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Par défaut
    Si j'ai bien compris ta réponse on peut modifier un fichier contenu dans l'exécutable ?

    J'étais parti du principe que j'avais mon fichier CSS avec mes mots à remplacer.
    L'utilisateur choisissait ses couleurs à la validation j'appelais une classe qui contient des observers.
    Cette classe charge le fichier CSS dans un StringBuilder je remplace tous les mots {COLOR_BACKGROUND} ...
    Et la je ne sais pas trop quoi en faire du StringBuilder étant donné qu'à priori on ne peut passer qu'un fichier et non son contenu ...
    Création d'un fichier temporaire que je passerais et supprimerais dans la foulée ? (mais si reload du fichier c'est mort).


    Etonnant que personne n'est essayé de gérer (surtout oracle ) une fonctionnalité comme celle ci.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Ben des éléments de réponse ont été donnés (dont certains par toi-même) :
    • Tu génères un fichier temporaire contenant le CSS (soit génération complète soit remplacement de tokens / regexp, comme tu veux, de toute maniere tu feras les tests pour savoir ce qui fonctionne le mieux dans ton cas) ;
    • Tu surveilles ce fichier pour savoir quand il est modifié ;
    • Quand il est modifié tu le réapplique aux CSS de la scène.


    Allez hop, au boulot, y a pus qu'a...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    			StringBuilder test = new StringBuilder();
     
    			BufferedReader rd = new BufferedReader(
    					new FileReader(PlwLauncher.class.getResource("/css/blue/menu.css").getFile()));
     
    			String inputLine = "";
     
    			while ((inputLine = rd.readLine()) != null) {
    				test.append(inputLine).append("\n");
    			}
     
    test.replace("toto", "tata");
     
    			System.out.println(test.toString());
     
    			scene.getStylesheets().add(...);

    Voila je ne sais pas comment m'y prendre la ... Je ne peux pas rajouter directement un String dans le getStylesheets ?

    Comment passer par un fichier temporaire ?? Je ne veux pas enregistrer ce fichier donc pour la création je vois mais pour le remplir sans connaitre son path et vu que je ne veux pas l'enregistrer ... ?

    Help ME !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Novembre 2013
    Messages : 159
    Par défaut
    Trouvé la solution est encore crade mais si vous avez des idées n'hésitez pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    			StringBuilder test = new StringBuilder();
     
    			BufferedReader rd = new BufferedReader(
    					new FileReader(PlwLauncher.class.getResource("/css/blue/menu.css").getFile()));
     
    			String inputLine = "";
     
    			while ((inputLine = rd.readLine()) != null) {
    				test.append(inputLine).append("\n");
    			}
     
    			File temp = null;
     
    			try {
    				temp = File.createTempFile("fileCSS", ".tmp");
    				System.out.println(temp.getAbsolutePath());
    			} finally {
    				temp.delete();
    			}
     
    			BufferedWriter fichier = new BufferedWriter(new FileWriter(temp.getAbsolutePath()));
    			fichier.write(test.toString());
    			fichier.close();

Discussions similaires

  1. Flex Chargement dynamique css
    Par sorilazer dans le forum Flex
    Réponses: 0
    Dernier message: 22/04/2011, 01h21
  2. Fonctionnement menu dynamique CSS
    Par deathbiscuit dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 07/12/2010, 13h25
  3. Contour menu dynamique css
    Par kervano dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 31/01/2010, 11h50
  4. [FAQ][MX 2004] MP3 loadé dynamiquement
    Par WriteLN dans le forum Flash
    Réponses: 19
    Dernier message: 04/02/2004, 13h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo