Salut à tous,

Je suis en train de créer un XYSeries à partir d'une JTable. Tout fonctionne bien, et je peux obtenir mes données du tableau pour deux colonnes sur mon plot. Maintenant, j'essaye d'ajouter un crosshair sur mon plot qui suis ma souris et qui, au clic, se bloque (et débloque au clic suivant) et renvois les valeurs (les index de tous objets présent) d'une des 4 zones formées par le crosshair (choisissable par des checkbox je pense).

J'ai le code suivant pour le crosshair, mais je n'arrive pas à le faire suivre ma souris sur les axes X et Y... Ca marche pour l'axe X, mais l'axe Y est complètement à coté de la plaque:\

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
			@Override
		    public void chartMouseMoved(ChartMouseEvent event) {
		        Rectangle2D dataArea = chartPanel.getScreenDataArea();
		        JFreeChart chart = event.getChart();
		        XYPlot plot = (XYPlot) chart.getPlot();
		        ValueAxis xAxis = plot.getDomainAxis();
		        ValueAxis yAxis = plot.getRangeAxis();
		        double x = xAxis.java2DToValue(event.getTrigger().getX(), dataArea, 
		                RectangleEdge.BOTTOM);
		        double y = 	yAxis.java2DToValue(event.getTrigger().getY(), dataArea, 
		                RectangleEdge.BOTTOM);
 
		        		//DatasetUtilities.findYValue(plot.getDataset(), 0, x);
		        System.out.println(x+"<X Y>"+y);
 
		        xCrosshair.setValue(x);
		        yCrosshair.setValue(y);
		    }
(J'ai ajouté la souris à la main pour que vous compreniez le décalage)

Nom : Capture d’écran 2015-07-09 à 12.10.54.png
Affichages : 636
Taille : 96,0 Ko

J'ai repris le code de l'exemple suivant : (ici le crosshair suis l'axe X mais va d'objet en objet sur l'axe Y)

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
 
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.panel.CrosshairOverlay;
import org.jfree.chart.plot.Crosshair;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.RectangleEdge;
 
/**
 * A demo showing crosshairs that follow the data points on an XYPlot.
 */
public class CrosshairOverlayDemo1 extends JFrame implements ChartMouseListener {
 
    private ChartPanel chartPanel;
 
    private Crosshair xCrosshair;
 
    private Crosshair yCrosshair;
 
    public CrosshairOverlayDemo1(String title) {
        super(title);
        setContentPane(createContent());
    }
 
    private JPanel createContent() {
        JFreeChart chart = createChart(createDataset());
        this.chartPanel = new ChartPanel(chart);
        this.chartPanel.addChartMouseListener(this);
        CrosshairOverlay crosshairOverlay = new CrosshairOverlay();
        this.xCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f));
        this.xCrosshair.setLabelVisible(true);
        this.yCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f));
        this.yCrosshair.setLabelVisible(true);
        crosshairOverlay.addDomainCrosshair(xCrosshair);
        crosshairOverlay.addRangeCrosshair(yCrosshair);
        chartPanel.addOverlay(crosshairOverlay);
        return chartPanel;
    }
 
    private JFreeChart createChart(XYDataset dataset) {
        JFreeChart chart = ChartFactory.createXYLineChart("Crosshair Demo", 
                "X", "Y", dataset);
        return chart;
    }
 
    private XYDataset createDataset() {
        XYSeries series = new XYSeries("S1");
        for (int x = 0; x < 10; x++) {
            series.add(x, x + Math.random() * 4.0);
        }
        XYSeriesCollection dataset = new XYSeriesCollection(series);
        return dataset;
    }
 
    @Override
    public void chartMouseClicked(ChartMouseEvent event) {
        // ignore
    }
 
    @Override
    public void chartMouseMoved(ChartMouseEvent event) {
        Rectangle2D dataArea = this.chartPanel.getScreenDataArea();
        JFreeChart chart = event.getChart();
        XYPlot plot = (XYPlot) chart.getPlot();
        ValueAxis xAxis = plot.getDomainAxis();
        double x = xAxis.java2DToValue(event.getTrigger().getX(), dataArea, 
                RectangleEdge.BOTTOM);
        double y = DatasetUtilities.findYValue(plot.getDataset(), 0, x);
        this.xCrosshair.setValue(x);
        this.yCrosshair.setValue(y);
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                CrosshairOverlayDemo1 app = new CrosshairOverlayDemo1(
                        "JFreeChart: CrosshairOverlayDemo1.java");
                app.pack();
                app.setVisible(true);
            }
        });
    }
 
}

Par ailleurs, mon code comprend la fonction suivante : Quand je clic sur un objet dans mon plot, celui-ci est dupliqué dans une nouvelle série (d'une autre couleur et forme)(les carrés rouge sur l'image ci-dessus) et va sélectionner la ligne le concernant dans mon JTable. Du coup, pour la fonctionnalité du crosshair il faudrait gardé ceci si aucune checkbox n'est cochée, sinon récupérer l'une ou les zones sélectionnée.

Voila, pour résumé, je cherche déjà à fixer le problème de ma crosshair qui ne suis pas ma souris sur l'axe Y, puis dans un second temps réussir à obtenir tout les objets (et le int correspondant à leur index de la serie) d'une des 4 zones. Pour la partie qui lie tout ceci au tableau j'pense m'en sortir

J'espère que je n'en demande pas trop :\
Merci en tout cas à vous,

Cordialement,

Zénome

EDIT: J'ai pensé pour la selection des 4 zones utiliser les opérateurs > et < pour passer en revue toutes les valeurs de mon tableau et sélectionner celles qui correspondent.
Exemple, en haut à droite :
if(valeurDeLaColonne1>valeurDuX && valeurDeLaColonne2>valeurDuY) { on sélectionne }

EDIT 2 : Bon ca marche pour la selection des zones, cependant j'ai toujours l'axe Y qui n'est pas au meme endroit que ma souris J'pense que ma ligne de code est fausse mais je ne sais pas quoi mettre à la place :\

Nom : Capture d’écran 2015-07-09 à 16.32.06.png
Affichages : 643
Taille : 266,4 Ko

(Ma souris n'était pas à l'intersection des deux crosshairs)


EDIT 2 : J'ai reussi , c'était tout con ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
double y = 	yAxis.java2DToValue(event.getTrigger().getY(), dataArea, 
		                RectangleEdge.LEFT);