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:\
(J'ai ajouté la souris à la main pour que vous compreniez le décalage)
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 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 sourisJ'pense que ma ligne de code est fausse mais je ne sais pas quoi mettre à la place :\
(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);
Partager