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

2D Java Discussion :

[JFreeChart] récupérer les coordonnées d'un clic souris


Sujet :

2D Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 50
    Points : 39
    Points
    39
    Par défaut [JFreeChart] récupérer les coordonnées d'un clic souris
    Bonjour!
    Je voudrais récupérer les coordonnées d'un clic souris que l'on fait sur un diagramme. Le problème, c'est que j'arrive à accéder aux coordonnées mais elles sont en pixel et pas du tout de l'unité des coordonnées. Donc je voulais savoir s'il serait possible d'avoir ces coordonnées mais à l'échelle du graphique?
    Merci d'avance pour vos réponses!
    Rozie

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour Rozie

    Je suis stagiaire, et j'ai été confronté à la même question. Voila comment j'ai fait :

    1. surcharge de mon renderer afin de récuperer la variable "dataArea" que je stocke en variable globale de ma classe, et à laquelle j'accede par un getDrawItem()... un peu bourrin, mais j'ai pas trouvé mieux. Je ne surcharge que la méthode drawItem, et la seule ligne modifiée (par rapport au code source) est en gras.

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    public class MyItemRenderer extends StandardXYItemRenderer{
    
    	private Rectangle2D dataArea;
    
    	 /**
         * Draws the visual representation of a single data item.
         *
         * @param g2  the graphics device.
         * @param state  the renderer state.
         * @param dataArea  the area within which the data is being drawn.
         * @param info  collects information about the drawing.
         * @param plot  the plot (can be used to obtain standard color information 
         *              etc).
         * @param domainAxis  the domain axis.
         * @param rangeAxis  the range axis.
         * @param dataset  the dataset.
         * @param series  the series index (zero-based).
         * @param item  the item index (zero-based).
         * @param crosshairState  crosshair information for the plot
         *                        (<code>null</code> permitted).
         * @param pass  the pass index.
         */
        public void drawItem(Graphics2D g2, 
                             XYItemRendererState state,
                             Rectangle2D dataArea, 
                             PlotRenderingInfo info, 
                             XYPlot plot,
                             ValueAxis domainAxis, 
                             ValueAxis rangeAxis, 
                             XYDataset dataset,
                             int series, 
                             int item, 
                             CrosshairState crosshairState, 
                             int pass) {
    
        	this.dataArea = dataArea;
            boolean itemVisible = getItemVisible(series, item);
            // setup for collecting optional entity info...
            Shape entityArea = null;
            EntityCollection entities = null;
            if (info != null) {
                entities = info.getOwner().getEntityCollection();
            }
    
            PlotOrientation orientation = plot.getOrientation();
            Paint paint = getItemPaint(series, item);
            Stroke seriesStroke = getItemStroke(series, item);
            g2.setPaint(paint);
            g2.setStroke(seriesStroke);
    
            // get the data point...
            double x1 = dataset.getXValue(series, item);
            double y1 = dataset.getYValue(series, item);
            if (Double.isNaN(x1) || Double.isNaN(y1)) {
                itemVisible = false;
            }
    
            RectangleEdge xAxisLocation = plot.getDomainAxisEdge();
            RectangleEdge yAxisLocation = plot.getRangeAxisEdge();
            double transX1 = domainAxis.valueToJava2D(x1, dataArea, xAxisLocation);
            double transY1 = rangeAxis.valueToJava2D(y1, dataArea, yAxisLocation);
    //        chart.setDataArea(dataArea);
            
    
            if (false){
            	System.out.println("X :  " + x1 + " > " + transX1 + "      Y :  " + y1 + " > " + transY1);
            }
            
            
            if (getPlotLines()) {
                if (this.getDrawSeriesLineAsPath()) {
                    State s = (State) state;
                    if (s.getSeriesIndex() != series) {
                        // we are starting a new series path
                        s.seriesPath.reset();
                        s.setLastPointGood(false);
                        s.setSeriesIndex(series);
                    }
                    
                    // update path to reflect latest point
                    if (itemVisible && !Double.isNaN(transX1) 
                            && !Double.isNaN(transY1)) {
                        float x = (float) transX1;
                        float y = (float) transY1;
                        if (orientation == PlotOrientation.HORIZONTAL) {
                            x = (float) transY1;
                            y = (float) transX1;
                        }
                        if (s.isLastPointGood()) {
                            // TODO: check threshold
                            s.seriesPath.lineTo(x, y);
                        }
                        else {
                            s.seriesPath.moveTo(x, y);
                        }
                        s.setLastPointGood(true);
                    }
                    else {
                        s.setLastPointGood(false);
                    }
                    if (item == dataset.getItemCount(series) - 1) {
                        if (s.getSeriesIndex() == series) {
                            // draw path
                            g2.setStroke(getSeriesStroke(series));
                            g2.setPaint(getSeriesPaint(series));
                            g2.draw(s.seriesPath);
                        }
                    }
                }
    
                else if (item != 0 && itemVisible) {
                    // get the previous data point...
                    double x0 = dataset.getXValue(series, item - 1);
                    double y0 = dataset.getYValue(series, item - 1);
                    if (!Double.isNaN(x0) && !Double.isNaN(y0)) {
                        boolean drawLine = true;
                        if (getPlotDiscontinuous()) {
                            // only draw a line if the gap between the current and 
                            // previous data point is within the threshold
                            int numX = dataset.getItemCount(series);
                            double minX = dataset.getXValue(series, 0);
                            double maxX = dataset.getXValue(series, numX - 1);
                            if (this.getGapThresholdType() == UnitType.ABSOLUTE) {
                                drawLine = Math.abs(x1 - x0) <= this.getGapThreshold();
                            }
                            else {
                                drawLine = Math.abs(x1 - x0) <= ((maxX - minX) 
                                    / numX * getGapThreshold());
                            }
                        }
                        if (drawLine) {
                            double transX0 = domainAxis.valueToJava2D(x0, dataArea,
                                    xAxisLocation);
                            double transY0 = rangeAxis.valueToJava2D(y0, dataArea, 
                                    yAxisLocation);
    
                            // only draw if we have good values
                            if (Double.isNaN(transX0) || Double.isNaN(transY0) 
                                || Double.isNaN(transX1) || Double.isNaN(transY1)) {
                                return;
                            }
    
                            if (orientation == PlotOrientation.HORIZONTAL) {
                                state.workingLine.setLine(transY0, transX0, 
                                        transY1, transX1);
                            }
                            else if (orientation == PlotOrientation.VERTICAL) {
                                state.workingLine.setLine(transX0, transY0, 
                                        transX1, transY1);
                            }
    
                            if (state.workingLine.intersects(dataArea)) {
                                g2.draw(state.workingLine);
                            }
                        }
                    }
                }
            }
            
            // we needed to get this far even for invisible items, to ensure that
            // seriesPath updates happened, but now there is nothing more we need
            // to do for non-visible items...
            if (!itemVisible) {
                return;
            }
        }
    
    	public Rectangle2D getDataArea() {
    		return dataArea;
    	}
    
    	public void setDataArea(Rectangle2D dataArea) {
    		this.dataArea = dataArea;
    	}
    }
    2. Puis dans la classe dans laquelle tu travaille, ajoute ces deux méthodes de conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public double translateX(double x){
      return this.getDomainAxis().java2DToValue(x,ascanItemRenderer.getDataArea(),this.getDomainAxisEdge()); 
    }
     
    public double translateY(double y){
      return this.getRangeAxis().java2DToValue(y,ascanItemRenderer.getDataArea(),this.getRangeAxisEdge()); 
    }
    3. Tu peux faire l'inverse en utilisant valueToJava2D au lieu de java2DToValue.

    J'espère que ça t'aidera.

    Bon, j'ai découvert le java il y a un mois, alors y'a peut-être bcp bcp mieux ... Si c'est le cas je suis preneur de toute solution.

    Nicky

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Merci, j'avais déjà regardé ça mais c'est vrai que c'est un peu bourrin. J'ai trouvé une autre fonction beaucoup plus pratique!! Mais je n'ai pas le code sous les yeux!! Donc je le rajouterai lundi
    Rose

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 50
    Points : 39
    Points
    39
    Par défaut Comme promis
    Donc voici le code!!

    ValueAxis xAxis = plot.getDomainAxis();
    ValueAxis yAxis = plot.getRangeAxis();
    double mouseX = xAxis.java2DToValue(e.getX(), chartPanel.getScreenDataArea(), plot.getDomainAxisEdge());
    double mouseY = yAxis.java2DToValue(e.getY(), chartPanel.getScreenDataArea(), plot.getRangeAxisEdge());


    oui, donc ça ressemble à ce que tu as fait, mais là, pas besoin de surcharger
    Voili voilou!!!

    Rozie

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci bcp, c'est en effet beaucoup beaucoup plus simple !

    Je dois être un adepte du "pourquoi faire simple quand on peut faire compliqué" ...

    Encore merci

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Lol, moi aussi j'aime bien compliqué les choses!!! Mais je crois que t'es pire que moi
    En tout cas, de rien!!

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 31
    Points
    31
    Par défaut Merci beaucoup!
    Depuis hier je me galère à faire cela!
    Et auj je tombe sur ce post!

    Merci d'avoir poster ta solution Rozie, elle marche impec!

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    je sais que c'est une vieille discussion mais je suis bloqué.

    J'arrive à récupérer les coordonnées de la souris n'importe où dans ma fenêtre sauf dans le ChartPanel en utilisant l'écouteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame1.addMouseListener(this);

    J'ai donc essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chart1.addChartMouseListener(this);

    mais cette méthode n'est apparemment pas définie pour JFreeChart.

    Savez-vous comment faire ?

    Merci.
    Bonne journée.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/07/2010, 09h41
  2. [WD11] Récupérer les coordonnées d'une souris
    Par Redg9 dans le forum WinDev
    Réponses: 8
    Dernier message: 12/07/2010, 10h54
  3. [TASM] Récupérer les coordonnées de souris
    Par alibm dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 03/05/2009, 00h50
  4. Réponses: 3
    Dernier message: 31/12/2008, 14h39
  5. récupérer les coordonnées de la souris
    Par miKL64 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 14/10/2007, 21h43

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