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 :

[Binding] Afficher / masquer une série de données dans un graphe


Sujet :

JavaFX

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut [Binding] Afficher / masquer une série de données dans un graphe
    Bonjour,

    Je développe l'interface graphique d'un logiciel permettant d'importer et de traiter des séries de données. Lorsqu'une série de données est importée par l'utilisateur, elle est stockée dans une classe DataSignal (nom de la série, couples des valeurs stockées sous forme de liste, propriété d'affichage de la série dans le graphe sous forme de boolean...).

    L'ensemble des séries de données importées sont stockées dans une liste (listeDataSeries) affichées dans un tableau.
    Ce tableau contient une colonne pour le nom de la série, une checkbox permettant à l'utilisateur de choisir si il veut l'afficher ou non dans un graphe, et un bouton pour supprimer la série.
    L'état de la checkbox est lié à la propriété showSerieProperty() de la classe permettant de savoir si l'utilisateur souhaite afficher ou non la série de données dans le graphe.

    Je rencontre un problème lorsque je souhaite désactiver l'affichage d'une série de données.

    N'ayant pas réussi à lier directement le contenu de la liste à afficher dans le graphe (dataToPlot) aux propriétés showSerieProperty() des différentes séries de données contenues dans listeDataSeries, j'ai dupliqué le contenu de la série de données dans une liste de données intitulée SeriesToDisplay().
    En fonction de l'état de showSerieProperty(), cette série est vide ou contient les données à afficher.
    Lors de l'importation d'une série, j'importe directement le contenu de SeriesToDisplay dans la liste dataToPlot qui est directement utilisée pour l'affichage.
    Le problème intervient lorsque j'efface dans la classe DataSignal le contenu de SeriesToDisplay. J'ai en retour un message d'erreur dans la console. Le dernier couple de valeur n'est pas effacé. Cette erreur est cohérente étant donné que je cherche à supprimer une série de données utilisée dans une autre variable du programme...

    La solution que j'ai utilisé n'est donc clairement pas optimale et cela me pose des problèmes pour la suite dans le développement de mon code.

    Auriez vous une solution pour lier proprement les propriétés d'affichage des différentes séries de données importées par l’utilisateur aux séries de données affichées à l'écran.
    Merci par avance.

    Voici un extrait de la classe DataSignal :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    public class DataSignal {
    private SimpleStringProperty nomSerie ;
    private SimpleBooleanProperty showSerie ;
     
    private LineChart.Series<Double, Double> series = new LineChart.Series<Double, Double>();
    private LineChart.Series<Double, Double> seriesToDisplay = new LineChart.Series<Double, Double>();
     
    //.......
     
    public DataSignal(String nSerie, Boolean sSerie) {
            this.nomSerie = new SimpleStringProperty(nSerie);
            this.showSerie = new SimpleBooleanProperty(sSerie);  
     
            series.setName(this.getNomSerie());
            seriesToDisplay.setName(this.getNomSerie());
     
            this.showSerie.addListener(new ChangeListener<Boolean>(){
            	public void changed (ObservableValue<? extends Boolean>ov, Boolean t, Boolean t1){
            	        if (t1){
            		       seriesToDisplay.getData().addAll(series.getData());
            		       //System.out.println(seriesToDisplay.getData().size()+" données "+getNomSerie()+" ont été ajoutées");
            	        }else{
              		       seriesToDisplay.getData().clear();
           			       //System.out.println("Les données contenues dans "+getNomSerie()+" ont été supprimées");
            	        }
            	}
            });
     
     
           //......
    }
     
            // Routine permettant d'ajouter des valeurs à la série de données considérée => utilisée lors de l'importation des séries de données
            public void addElementToSerie(Double time, Double AmplSignal) {
                   series.getData().add(new XYChart.Data<Double, Double>(time, AmplSignal));
    	       seriesToDisplay.getData().add(new XYChart.Data<Double, Double>(time, AmplSignal));  
    	}
     
        // Getters and Setters
        public String getNomSerie() { return nomSerie.get(); }
        public void setNomSerie(String nSerie) { 
        	nomSerie.set(nSerie); 
        	series.setName(this.getNomSerie());
        	seriesToDisplay.setName(this.getNomSerie());
        }
        //.......
     
        public Boolean getShowSerie() { return showSerie.get(); }
        public void setShowSerie(Boolean sSerie) { showSerie.set(sSerie); }
        public BooleanProperty showSerieProperty() { return showSerie; }
     
        // Getters et Setters permettant l'accès aux différentes séries de données. 
        public Series<Double, Double> getSeries() { return series; }
        public void setSeries(LineChart.Series<Double, Double> series) {  this.series = series;  }
     
        public Series<Double, Double> getSeriesToDisplay() { return seriesToDisplay; }
        public void setSeriesToDisplay(Series<Double, Double> seriesToDisplay) { this.seriesToDisplay = seriesToDisplay; }
     
        //......

    Un partie du code associé au contrôleur principal de mon programme
    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
     
    		// Lorsqu'une nouvelle série de données est importée, ou lorsqu'une série est supprimée, le contenu de dataToPLot est automatiquement modifié en conséquence
                    // Lorsqu'une série est ajoutée à listeDataSeries, son contenu est automatiquement affiché, on transfert automatiquement les séries de données dans dataToPLot
                     listeDataSeries.addListener(new ListChangeListener() {
    			@Override
    			public void onChanged(ListChangeListener.Change change) {
    				while (change.next()) {
    					if (change.wasAdded()){
    						System.out.println("Une série de données a été ajoutée ! ");
    						dataToPLot.add(listeDataSeries.get(change.getFrom()).getSeriesToDisplay());
    						System.out.println(listeDataSeries.get(change.getFrom()).getNomSerie());
    					}
    					if (change.wasRemoved()){
    						System.out.println("Une série de données a été supprimée ! ");
    						dataToPLot.remove(change.getFrom()); 
    					} 	
    				}
    			}
    		});
     
     
                    // Test qui n'a pas fonctionné et qui ne permet pas de détecter les changements apportés à la propriété showSerieProperty via la checkbox 
    		/*for(DataSignal p:listeDataSeries){
    			p.showSerieProperty().addListener(new ChangeListener<Boolean>() {
    	            @Override
    	            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
    	            	System.out.println("Changement observé sur la série "+p.getNomSerie());
    	            }
    			});
    		}*/

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Quelque chose comme ça peut-etre ? Si j'ai bien compris le problème (pas sur).

    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
    // A faire pour chaque série.
    dataSignal.showSerieProperty().addListener(observable -> requestUpdateVisibleList());
     
     
    private PauseTansition updateTimer;
     
    private requestUpdateVisibleList() {
       if (updateTimer == null) {
          updateTimer = new PauseTransition(Duration.millis(750);
          updateTimer.setOnFinished(actionEvent -> updateVisibleList());
       }
       updateVisibleList.stop();
       updateVisibleList.playFromStart();
    }
     
    private void updateVisibleList() {
        final FilteredList<DataSignal> visibleSeries = new FilteredList(listeDataSeries, dataSignal -> dataSignal.isShowSerie());
        chart.getData().setAll(visibleSeries);
    }
    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 du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Bonjour,
    Merci beaucoup pour cette réponse, j'ai tardé à répondre car je rencontre des soucis lorsque je souhaite supprimer un élément qui a été déactivé puis réactivé en utilisant cette fonction de filtre.
    J'ai passé pas mal de temps à essayer d'isoler ce problème et de comprendre d'où ça peut venir.
    J'utilise la commande suivante pour filtrer une liste des séries de données à afficher dans un graphe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    visibleSeries = listeDataSeries.filtered(p->p.isShowSerie());
    listeDataSeries contient l'ensemble des séries de données, et visibleSeries uniquement celles à afficher.

    J'ai fait pas mal de tests de mon code pour tester les possibilités offertes à l'utilisateur final. J'ai rencontré une config qui me pose des problèmes.
    Après avoir désélectionné puis re-seléctionné une série de donnée, je tente de la supprimer à travers la commande visibleSeries.remove(index); où index correspond à l'index de la série en question.

    Lorsque la fonction de filtre n'a pas été utilisée, la série de données se supprime correctement.
    Dans le cas contraire, j'ai en retour un message d'erreur.

    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
    49
    50
    Exception in thread "JavaFX Application Thread" java.lang.UnsupportedOperationException
    	at java.util.AbstractList.remove(AbstractList.java:161)
    	at testsdatasinseriesmanipulation.TestsDatasInSeriesManipulation$2.handle(TestsDatasInSeriesManipulation.java:79)
    	at testsdatasinseriesmanipulation.TestsDatasInSeriesManipulation$2.handle(TestsDatasInSeriesManipulation.java:62)
    	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    	at javafx.event.Event.fireEvent(Event.java:198)
    	at javafx.scene.Node.fireEvent(Node.java:8216)
    	at javafx.scene.control.Button.fire(Button.java:185)
    	at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    	at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    	at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    	at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    	at javafx.event.Event.fireEvent(Event.java:198)
    	at javafx.scene.Scene$MouseHandler.process(Scene.java:3724)
    	at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452)
    	at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728)
    	at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461)
    	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348)
    	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382)
    	at com.sun.glass.ui.View.handleMouseEvent(View.java:553)
    	at com.sun.glass.ui.View.notifyMouse(View.java:925)
    	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    	at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
    	at com.sun.glass.ui.win.WinApplication$$Lambda$37/96639997.run(Unknown Source)
    	at java.lang.Thread.run(Thread.java:745)
    Aurez vous une idée sur la façon de contourner ce problème.
    Merci par avance.

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur projet
    Inscrit en
    Juin 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2014
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Après avoir réfléchi 5 minutes, une solution simple est de changer la propriété de la série pour qu'elle soit filtrée et ne soit pas contenue dans visibleSeries.
    Désolé du dérangement

Discussions similaires

  1. Masquer une série de données sur un graphique
    Par Lameth dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/07/2008, 01h26
  2. Réponses: 5
    Dernier message: 10/01/2008, 08h47
  3. Réponses: 14
    Dernier message: 02/07/2007, 09h30
  4. Réponses: 9
    Dernier message: 04/12/2005, 18h57
  5. Réponses: 4
    Dernier message: 29/11/2004, 16h51

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