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 :

Problème d'affichage dans une Webview sur une nouvelle fenêtre


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 141
    Par défaut Problème d'affichage dans une Webview sur une nouvelle fenêtre
    Bonjour à tous,

    J'étudie actuellement le portage d'une application réalisée en RealBasic vers JavaFX. Cette application utilise intensivement l'affichage de cartes à travers un composant browser. Le code HTML est généré dynamiquement à partir de données (traces GPS) et envoyé comme une chaine de caractères au composant browser. A noter que je connais très bien RealBasic alors que je connais peu Java. J'espère progresser à travers ce projet.

    Tout le processus décrit ci dessus devrait être pouvoir être reproduit avec une webwiew et un loadContent. J'ai développé une appli test comprenant une fenêtre mère comportant un bouton permettant de charger un fichier texte (la trace GPS). Si le fichier est correctement décodé, un bouton "Carte" devient visible. Ce bouton génère un fichier HTML affichant la trace et demande l'affichage du code HTML dans une webview intégrée à une nouvelle fenêtre. Jusque là tout va bien la carte s'affiche correctement. On referme la fenêtre, on clique à nouveau sur le bouton carte, la webwiew reste désespéremment vide... Si je charge un autre fichier trace, la trace ne s'affiche pas. Tout se passe comme si la webview ne fonctionnait qu'une fois.

    Après les nombreuses heures passées la dessus j'ai découvert que le javascript devait être probablement à l'origine du problème... Si je passe une chaine comportant un simple "Hello World", je peux l'afficher indéfiniment avec mon bouton carte. Plus étonnant, j'ai un code HTML de carte beaucoup plus simpliste au niveau javascript, je peux aussi l'afficher indéfiniment... A noter que le code plus complexe fonctionne correctement au premier affichage...

    Le bouton Carte de la fenêtre mère déclenche la procédure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    private void afficheCarte()  {
            if (myTrace.isDecodage()) { 
                // Classe de construction et d'affichage de la carte dans une nouvelle fenêtre        
                ShowMap myMap = new ShowMap();
                myMap.showFullScreen(myTrace);          
            }        
        }
    La classe ShowMap comporte :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
        private static WebEngine eng = null; 
        private static WebView viewMap = null; 
     
        // Sans cette procédure je n'affichais qu'une seule fois
        // quelque soit la chaine HTML
     
        protected WebView getWebView() {
            if (eng == null) { 
                viewMap = new WebView(); 
                //webView.setContextMenuEnabled(false); 
                eng = viewMap.getEngine(); 
            } 
            return viewMap; 
     } 
     
        public void showFullScreen(traceGPS currTrace)  {        
            // la classe MapVisu génère le code HTML    
            map_visu visuMap = new map_visu(currTrace);
            if (visuMap.isMap_OK()) {
                AnchorPane anchorPane = new AnchorPane();  
                WebView viewMap = getWebView();            
                //WebView viewMap = new WebView();   
                //WebEngine eng = viewMap.getEngine();
                AnchorPane.setTopAnchor(viewMap, 10.0);
                AnchorPane.setLeftAnchor(viewMap, 10.0);
                AnchorPane.setRightAnchor(viewMap, 10.0);
                AnchorPane.setBottomAnchor(viewMap, 10.0);
                anchorPane.getChildren().add(viewMap);                    
                eng.getLoadWorker().stateProperty().addListener((ObservableValue<? extends Worker.State> observableValue, Worker.State oldValue, Worker.State newValue) -> { 
                    System.out.printf("%s -> %s", oldValue, newValue).println();                
     
                });
                String sDebug = visuMap.getMap_HTML(); 
                // sDebug peut être éventuellement initialisé par un simple HelloWorld
                eng.loadContent(sDebug);
                StackPane subRoot = new StackPane();
                subRoot.getChildren().add(anchorPane);
                Scene secondScene = new Scene(subRoot, 900, 600);
                Stage subStage = new Stage();
                // On veut que cette fenêtre soit modale
                subStage.initModality(Modality.APPLICATION_MODAL);
                subStage.setScene(secondScene); 
               // subStage.setMaximized(true);          
                subStage.show();                                
            }
     
        }
    Au niveau de la console au premier affichage de la carte j'ai bien la sortie attendue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    READY -> SCHEDULED
    SCHEDULED -> RUNNING
    RUNNING -> SUCCEEDED
    Après fermeture de la fenêtre et un nouveau clic sur le bouton Carte j'obtiens ceci :

    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
     
    SUCCEEDED -> READY
    READY -> SCHEDULED
    SCHEDULED -> RUNNING
    RUNNING -> SUCCEEDED
    SUCCEEDED -> READY
    SUCCEEDED -> READY
    READY -> SCHEDULED
    READY -> SCHEDULED
    SCHEDULED -> RUNNING
    SCHEDULED -> RUNNING
    RUNNING -> SUCCEEDED
    RUNNING -> SUCCEEDED
    SUCCEEDED -> READY
    SUCCEEDED -> READY
    READY -> SCHEDULED
    READY -> SCHEDULED
    SCHEDULED -> RUNNING
    SCHEDULED -> RUNNING
    RUNNING -> SUCCEEDED
    RUNNING -> SUCCEEDED
    Quelqu'un a t il une idée ?

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    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 904
    Billets dans le blog
    54
    Par défaut
    Pas beaucoup d’idée sur le coup. As-tu essaye en créant une nouvelle WebView a chaque fois au lieu de réutiliser la même ?
    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
    Mars 2004
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 141
    Par défaut
    Merci d'avoir pris le temps de lire le message...

    As-tu essaye en créant une nouvelle WebView a chaque fois
    J'avais commencé par là ... et je n'avais qu'un seul affichage dans tous les cas de figure... Ensuite, dans mes lectures il me semblait avoir compris que le webengine ne pouvait être instancié qu'une seule fois.. C'est en introduisant la procedure getWebView que cela a fonctionné avec du code simple...

    Je trouve rageant de bloquer la dessus car je commençais à bien m'amuser avec JavaFX...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 141
    Par défaut
    J'ai trouvé la solution... Rien à voir avec le webengine...

    Le code javascript généré dynamiquement pour l'affichage n'était pas bon... Pour l'anecdote cela est dû à mon piètre niveau en Java. La classe de construction de mon code HTML était ainsi faite :

    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
     
    public class map_pm {
     
        private static StringBuilder jsTabPoints = new StringBuilder();
     
        public map_pm(traceGPS tracePM, boolean isReduc)
        {            
            cartePM(tracePM);  // qui apelle genData      
        } 
     
     
        private static boolean genData(traceGPS tracePM)  {
     
            // blabla..
            jsTabPoints.append(...   // itéré un certain nombre de fois..
         }
    Avec le code ci dessus, j'ai eu la surprise de constater qu'une nouvelle instanciation de map_pm ne remettait pas à zéro le stringbuilder. Les séquences d'append ajoutaient les chaines au précédent passage générant ainsi un code HTML buggué empêchant l'affichage..

    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
     
    public class map_pm {
     
        private static StringBuilder jsTabPoints;
     
        public map_pm(traceGPS tracePM, boolean isReduc)
        {      
            jsTabPoints = new StringBuilder();
            cartePM(tracePM);  // qui apelle genData      
        } 
     
     
        private static boolean genData(traceGPS tracePM)  {
     
            // blabla..
            jsTabPoints.append(...   // itéré un certain nombre de fois..
         }
    Avec ce code, le stringbuilder est bien remis à zéro à chaque instanciation... Je pensais qu'un new map_pm() engendrait obligatoirement une nouvelle instance du stringbuilder.

    Donc le webengine fonctionne à peu près normalement... Désolé d'avoir pollué le forum avec un faux problème.

    Je dis "à peu près normalement" car j'ai eu quelques surprises en cliquant de nombreuses fois sur mon bouton carte. Au bout de trois ou quatre génération, avec un code HTML rigoureusement identique, la carte s'affiche complètement dézoomée... Le code HTML (assez conséquent) est dans une string et chargé par webengine.loadContent. Si j'écris le contenu de la string dans un fichier sur le disque et chargé par un eng.load("file:///"..., l'affichage est toujours bon... J'ai fait des test chrono, l'écriture sur le disque n'est pas trop pénalisante...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/06/2015, 13h21
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  3. [PB 9] Affichage d'un bouton sur une ligne d'une datawindow
    Par Dark Ryus dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 23/10/2008, 09h13
  4. Réponses: 6
    Dernier message: 12/10/2008, 20h03
  5. problème d'affichage d'un menu sur une image de fond
    Par Nata31 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/06/2006, 07h53

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