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 :

Copier des éléments d’une série «*LineChart.Series*» dans une autre série de données


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 Copier des éléments d’une série «*LineChart.Series*» dans une autre série de données
    Bonjour,

    Je débute dans la programmation Java FX et je rencontre un problème pour copier/supprimer des séries de données d’une série LineChart.Series<Double, Double> vers une autre série LineChart.Series<Double, Double>.

    La méthode «addElementToSerie» est utilisée pour stocker des couples de valeurs dans «series». Cette série de données rassemble l’ensemble des données collectées pour chacune des séries de données.

    Je désire utiliser la série «seriesToDisplay» pour y stocker les éléments contenus dans la série «series». Pour ce faire , j’ai créé la méthode «refreshDisplayOfSeries()».


    Code DataSignal : 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
     
    public class DataSignal {
    	private final SimpleStringProperty nomSerie ;
        	private final SimpleBooleanProperty showSerie ;
     
    	private LineChart.Series<Double, Double> series = new LineChart.Series<Double, Double>();
        	private LineChart.Series<Double, Double> seriesToDisplay = new LineChart.Series<Double, Double>();
    	…
     
    	//Getters et Setters public Series<Double, Double> getSeries() {
    		return series;
    	}
    	…
     
    public void addElementToSerie(Double time, Double AmplSignal) {
    	series.getData().add(new XYChart.Data<Double, Double>(time, AmplSignal));
    	compteur++;
    }
     
    public void refreshDisplayOfSeries(){
    	System.out.println("Mise à jour des données à afficher");
    	seriesToDisplay.getData().clear();
     
    	if (this.getShowSerie() == true){	
    		seriesToDisplay.getData().addAll(this.getSeries()); //Commande qui provoque une erreur
    	}
    }
    }

    Pour résumer, je ne parviens pas à copier les éléments d’une série à l’autre.

    Autre problème, j’ai besoin d’extraire des infos statistiques sur les couples de valeurs stockées dans les séries de données. Je ne parviens pas à accéder à ces valeurs une fois qu’elles sont stockées.
    J’ai essayé des commandes du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     startTime = Double.valueOf(series.getData().get(0).getXValue());
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int index = series.getData().lastIndexOf(series);
    pour tenter d’extraire le nombre de valeurs stockées. Malheureusement sans résultats, cette dernière commande me retourne systématiquement -1.

    Merci d’avance pour votre aide.

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public Series<Double, Double> getSeries() {
    		return series;
    	}
     
    public void refreshDisplayOfSeries(){
    	System.out.println("Mise à jour des données à afficher");
    	seriesToDisplay.getData().clear();
     
    	if (this.getShowSerie() == true){	
    		seriesToDisplay.getData().addAll(this.getSeries()); //Commande qui provoque une erreur
    	}
    }
    Cette commande ne peut pas fonctionner puisque tu essaie d'ajouter dans seriesToDisplay.getData() une Series<Double, Double> (ce que retourne getSeries()) et non pas une Collection<XYChart.Data<Double, Double>> (ce qu'elle attend).
    Ça aurait été bien de mettre l'erreur en question d'ailleurs.

    Donc, en théorie, ça plutôt devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seriesToDisplay.getData().addAll(this.getSeries().getData());
    Je dis bien en théorie car l'API de chart de JavaFX semble régulièrement avoir des problèmes au niveau des types génériques, ce qui fait qu'un tel appel peut ne pas fonctionner (principalement en JDK7).
    Si ça ne passe pas il faudra faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Object value : this.getSeries().getData()) {
      seriesToDisplay.getData().add((XYChart.Data) value);
    }
    Et perso pour raison de performances, je ferai plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ArrayList<XYChart.Data> dataList = new ArrayList<>(this.getSeries().getData().size());
    for (Object value : this.getSeries().getData()) {
     dataList.add((XYChart.Data) value);
    }
    seriesToDisplay.getData().setAll(dataList);
    dataList.clear();
    De plus, c'est une mauvaise idée que d'essayer de partager les mêmes data entre deux séries surtout si au final les deux apparaissent a l’écran : une data contient un noeud graphique qui est utilisé par l'affichage, or un même noeud graphique ne peut pas être présent a deux endroits dans le SceneGraph (ce que tentera de faire le graphique puisque la même donnée appartient a deux séries distinctes).
    Si une seule est affichée, ça devrait passer par contre.

    Alternativement, tu peux tout aussi bien te fendres au début d'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    seriesToDisplay.setData(series.getData());
    Ce qui réglera le problème une bonne fois pour toute (plus besoin de recopier quoi que ce soit puisque c'est la même liste qui est partagée entre les deux séries - a tester) mais ça serait bon que tu nous expliques le besoin d'avoir deux séries contenant exactement les mêmes données.
    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
    Merci pour ces éléments de réponse.
    Pour resituer le contexte, je développe une interface graphique dont un module permet de manipuler des séries de données pour faire du traitement du signal.
    Les séries de données sont importées par l'utilisateur sous forme de fichier de données.

    Je pensais donc travailler de la manière suivante :

    => Je génère une liste de données contenant l'ensemble des données importées ou générées par les différents traitements qui seront appliqués. A moins que l'utilisateur ne choisisse de supprimer une série, chaque série de données est conservée et stockée.

    => L’utilisateur doit avoir la possibilité d'afficher uniquement certaines séries de données sous forme de graphiques. J'affiche dans une tableview l'ensemble des noms des séries importées par l'utilisateur ou générées par l'un des traitements proposés. L'utilisateur coche (via une checkbox) les séries qu'il souhaite voir apparaître sous forme de graphe.
    Je pensais donc générer une nouvelle liste contenant uniquement les série à afficher. Seule cette liste sera utilisée pour l'affichage. D'où mon idée de dupliquer certains éléments de la série de données "series" (servant à stocker l'ensemble des série) vers une série "seriesToDisplay" (contenant uniquement les séries de données à afficher).

    J'étais à la base plutôt parti sur l'idée de stocker les données sous forme de tableaux à deux dimensions, mais ne connaissant pas à l'avance le nombre de valeurs contenues dans les fichier importés par l'utilisateur, je préfère passer directement par des listes de données.
    Si vous avez une idée de procéder plus pertinent, elle sera bien entendu la bienvenue.

  4. #4
    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
    Cela se tient.

    Bien qu’adaptée au stockage, je suis un peu moins enclin à utiliser Series et Data pour les données sources d'un point de vue conceptuel (c'est surtout que ce sont des classes liées a XYChart mais, bon, c'est vrai qu'elles peuvent servir à stocker tes données). Sinon une simple ObservableList<Point2D> ou ObservableList<Pair<Double, Double>> peut servir a faire la même chose (le problème de la classe Point2D c'est qu'une instance contient plein de méthodes qui ne te serviront a rien et donc alourdissent ton usage mémoire).

    Bien que ça soit plus simple et plus lisible de vider a chaque fois la liste d'affichage, je préfère cependant réutiliser les Data existantes plutôt que de devoir sans arrêt en reallouer des nouvelles. Enfin quand cela est possible (si le graphe est anime le résultat n'est pas forcement top par exemple au niveau des axes).

    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
    public void refreshDisplayOfSeries(){
    	System.out.println("Mise à jour des données à afficher");
            final int sourceNumber = source.size();
            final int destinationNumber = seriesToDisplay.getData().size()
            final int currentDataNumber = Math.min(sourceNumber , destinationNumber );
            // Update existing data.
            for (int dataIndex = 0 ; dataIndex < dataNumber ; dataIndex++ ) {
                 final Pair<Double, Double> value = source.get(dataIndex);
                 final XYChart.Data data = seriesToDisplay.getData().get(dataIndex);
                 data.setX(pair.getKey());
                 data.setY(pair.getValue());
            }
            // Add new data if needed.
            for (int dataIndex = currentDataNumber ; dataIndex < sourceNumber ; dataIndex++ ) {
                 final Pair<Double, Double> value = source.get(dataIndex);
                 final XYChart.Data data = new XYChart.Data();
                 data.setX(pair.getKey());
                 data.setY(pair.getValue());
                 seriesToDisplay.getData().add(data);
            }
            // Remove extra data if needed.
            for (int dataIndex = sourceNumber ; dataIndex < destinationNumber ; dataIndex++ ) {
                 final XYChart.Data data = seriesToDisplay.getData().remove(sourceNumber );
            }
    }
    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 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
    Je pense effectivement que stocker les données dans une liste de type ObservableList<Pair<Double, Double>> paraît plus adapté à mon cas.
    Je vais apporter les modifs nécessaires à mon code.
    Encore merci pour l'aide apportée ...

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

Discussions similaires

  1. copier dans une feuille et coller dans une autre feuille
    Par papa64 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/07/2011, 23h06
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. insertion dans une table puis update dans une autre table
    Par uptoditime dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/10/2007, 18h08
  4. Recherche de valeur dans une feuille et affichage dans une autre
    Par Zebulon777 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/05/2007, 09h40
  5. Réponses: 3
    Dernier message: 06/09/2006, 09h06

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