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 :

[Scene] décalage de l'échelle Area Chart


Sujet :

JavaFX

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut [Scene] décalage de l'échelle Area Chart
    Bonjour à tous,

    Voilà mon problème je cherche à faire une interface pour afficher le spectre audio (en dB).
    Le soucie sont les négatif comme vous pouvez le constater ici l'affichage se fait depuis le 0 et non depuis le bas de graphique...
    Nom : exemple.PNG
Affichages : 384
Taille : 62,9 Ko

    J’aimerai avoir quelle que chose comme sa
    Nom : exemple2.PNG
Affichages : 383
Taille : 63,0 Ko

    J'utilise une Area Chart mais si vous avez une solution avec autre chose je veux bien
    J'ai cherché à trouver des solutions sur le css ou sur les axe mais à ce jour rien...

    Merci a vous

    David

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 846
    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 846
    Points : 22 851
    Points
    22 851
    Billets dans le blog
    51
    Par défaut
    Alors, d'après mes test ça a tendance à déc***r parfois mais il est possible de faire que l'échelle logique de l'axe et ses labels soient différents. ex: tu fais un axe qui va de 0 à 60 et tu t'arranges pour afficher en labels de l'axe, une plage de valeurs qui va de -10db à 50db. Comme tu as déjà mis une fonction qui change les labels des axes tu trouveras tout seul facilement comment faire. Ensuite, en surchargeant layoutPlotChildre(), tu peux faire qu'une ligne noir soit affichée sur le 0db (qui correspondra à 10 dans cette nouvelle échelle).

    L'autre solution consiste bien sur à conserver l'échelle [-10, 50] et à surcharger complètement layoutPlotChildren() et refaire tout le layout de la forme attachée à la série soit-même pour afficher la bonne forme de graphe qui va bien (et donc ne pas appeler super.layoutPlotChildren()). Il faudra aller voir le code source de AreaChart dans l'OpenJFX pour s'en inspirer mais globalement ça reste easy à faire.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    C'est bon j'ai trouvé une solution grâce à toi même si je ne pense pas avoir directement utilisé ce que tu voulais me dire
    En fait j'ai changé la méthode toString

    Code java : 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
    static AreaChart<Number, Number> spectograme() {
    		final NumberAxis xAxis = new NumberAxis(0, Ressource.WIDHT, 8);
            final NumberAxis yAxis = new NumberAxis(-10, 50, 10);
    		final AreaChart<Number, Number> spectograme = new AreaChart<>(xAxis, yAxis);
            // setup chart
            spectograme.getStylesheets().add(AreaChartApp.class.getResource("a.css").toExternalForm());
            spectograme.setLegendVisible(false);
            spectograme.setTitle("Live Audio Spectrum Data");
            spectograme.setAnimated(false);
            xAxis.setLabel("Frequency Bands");
            yAxis.setLabel("Magnitudes");
            //yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis , null, "dB"));
            yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis) { 
     
                //@Override 
                public String toString(Number object) {
                	//System.out.println( object.intValue()-10);
                    return Integer.toString( object.intValue()-10); 
                } 
            });   
     
            return spectograme;
    	}

    Je pense que ce n'est pas une solution optimale car je veux développer un zoom par-dessus mais bon je pense réussir à me débrouiller avec ça.
    Merci beaucoup
    Si je trouve une solution plus propre je la posterai

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    bnojours j'ai réussi avec la méthode de bouye
    Code java : 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
     
    static AreaChart<Number, Number> spectograme = (new AreaChart<Number, Number>(xAxis, yAxis){
    		@Override 
    		protected void layoutPlotChildren() {
    			javafx.scene.chart.XYChart.Data<Number, Number>[] series1 = AreaChartApp.getSeries1();
    			//ici c'est pour le nombre le graphe que vous avez mois j'en est que 1
    			for (int seriesIndex=0; seriesIndex < 1; seriesIndex++) {
    				Number X = series1[seriesIndex].getXValue().doubleValue();
    				Number Y = series1[seriesIndex].getYValue().doubleValue();
    				Series<Number, Number> series = getData().get(seriesIndex);
    				//Series<Number, Number> series = getData().get(seriesIndex);
    				// DoubleProperty seriesYAnimMultiplier = seriesYMultiplierMap.get(series);
    				boolean isFirst = true;
    				double lastX = 0;
    				Path seriesLine = (Path)((Group)series.getNode()).getChildren().get(1);
    				Path fillPath = (Path)((Group)series.getNode()).getChildren().get(0);
    				seriesLine.getElements().clear();
    				fillPath.getElements().clear();
    				Data<Number, Number> item;
    				// for (Data<X, Y> item = series.begin; item != null; item = item.next) {
    				//ici c'est pour le nombre le valeur que vous avez moi j'en est WIDHT
    				for (int i = 0; i <  application.Ressource.WIDHT; i ++) {
    					item = series1[i];
    					double x = lastX = getXAxis().getDisplayPosition(item.getXValue());
    					//ici enfin c'est la que vous pouvez modifier l'origine du graphe avec +50 votre graphe couvrira la zone jusqu’à -50 
    					//vous pourrez éventuellement rencontré un bug d'affichage non résolut a l'heure actuelle 
    					//http://www.developpez.net/forums/showthread.php?t=1450663&referrerid=735672 
    					double y = getYAxis().getDisplayPosition(
    							getYAxis().toRealValue(getYAxis().toNumericValue(item.getYValue()) /*+50*/ /** seriesYAnimMultiplier.getValue()*/));
    					if (isFirst) {
    						isFirst = false;
    						fillPath.getElements().add(new MoveTo(x, getYAxis().getZeroPosition()));
    						seriesLine.getElements().add(new MoveTo(x, y));
    					} else {
    						seriesLine.getElements().add(new LineTo(x, y));
    					}
    					fillPath.getElements().add(new LineTo(x, y));
     
    					Node symbol = item.getNode();
    					if (symbol != null) {
    						final double w = symbol.prefWidth(-1);
    						final double h = symbol.prefHeight(-1);
    						symbol.resizeRelocate(x-(w/2), y-(h/2),w,h);
    					}
    				}
    				//System.out.println(fillPath.getElements().size());
    				if (fillPath.getElements().size() >= 1) {
     
    					fillPath.getElements().add(new LineTo(lastX, getYAxis().getZeroPosition()));
    				} else {
    					fillPath.getElements().add(new MoveTo(lastX, getYAxis().getZeroPosition()));
    				}
    				fillPath.getElements().add(new ClosePath());
     
    			}
    		}
     
    	}
     
    	);

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

Discussions similaires

  1. [Scene] Invertion Area Chart
    Par dada-06 dans le forum JavaFX
    Réponses: 4
    Dernier message: 18/06/2014, 17h15
  2. décalage des markers avec changement d'échelle
    Par frkdavid dans le forum IGN API Géoportail
    Réponses: 3
    Dernier message: 02/03/2010, 13h35
  3. décalage des marker avec changement d'échelle
    Par frkdavid dans le forum IGN API Géoportail
    Réponses: 12
    Dernier message: 25/02/2010, 15h28
  4. [E-03] Taille de Chart Area
    Par 20100. dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/11/2008, 07h37
  5. Probléme avec chart échelle log
    Par Mloody2000 dans le forum Débuter
    Réponses: 0
    Dernier message: 14/08/2008, 00h40

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