jfreechart - How to change the TimeSeries and TimeSeriesCollection to XYSeries and XYCollection respectively in java? -
based on example, code draging point in chart. want replace timeseries
object xyseries
because dont want months in x-axis; want series of number point1
, point2
, point3
, on, , want same logic. when replacing xyseries
not getting how change logic xyseries
.
package com.example.java; import org.jfree.chart.*; import org.jfree.chart.axis.valueaxis; import org.jfree.chart.entity.chartentity; import org.jfree.chart.entity.entitycollection; import org.jfree.chart.entity.xyitementity; import org.jfree.chart.labels.standardxyserieslabelgenerator; import org.jfree.chart.plot.xyplot; import org.jfree.chart.renderer.xy.xyitemrenderer; import org.jfree.chart.renderer.xy.xylineandshaperenderer; import org.jfree.data.time.month; import org.jfree.data.time.timeseries; import org.jfree.data.time.timeseriescollection; import org.jfree.data.xy.xydataset; import org.jfree.ui.applicationframe; import org.jfree.ui.refineryutilities; import java.awt.*; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.awt.event.mousemotionlistener; import java.awt.geom.point2d; import java.awt.geom.rectangle2d; @suppresswarnings("serial") public class seriesandpointdragandmove extends applicationframe implements chartmouselistener, mouselistener, mousemotionlistener { public static void main(string paramarrayofstring) { seriesandpointdragandmove seriesandpointdragandmove = new seriesandpointdragandmove( "plot"); seriesandpointdragandmove.pack(); refineryutilities.centerframeonscreen(seriesandpointdragandmove); seriesandpointdragandmove.setvisible(true); } boolean canmove = false; double finalmovepointy = 0; chartrenderinginfo info = null;; double initialmovepointy = 0; jfreechart jfreechart = null; chartpanel localchartpanel = null; timeseries localtimeseries = new timeseries("series"); // xyseries localtimeseries1 = new xyseries("series"); //test timeseriescollection timeseriescollection = new timeseriescollection(); // xyseriescollection timeseriescollection1 = new xyseriescollection();//test xyitementity xyitementity = null; public seriesandpointdragandmove(string paramstring) { super(paramstring); jfreechart = chartfactory.createtimeserieschart( "velocity point plot", "points (index)", "velocity (m/s)", createdataset(), true, true, false); localchartpanel = new chartpanel(jfreechart); localchartpanel.addchartmouselistener(this); localchartpanel.addmousemotionlistener(this); localchartpanel.addmouselistener(this); localchartpanel.setpreferredsize(new dimension(750, 500)); localchartpanel.setautoscrolls(false); localchartpanel.setmousezoomable(false); this.info = localchartpanel.getchartrenderinginfo(); xyplot localxyplot = (xyplot) jfreechart.getplot(); xyitemrenderer localxyitemrenderer = localxyplot.getrenderer(); localxyitemrenderer.setseriesstroke(0, new basicstroke(2.0f)); xylineandshaperenderer localxylineandshaperenderer = (xylineandshaperenderer) localxyplot .getrenderer(); localxylineandshaperenderer.setbaseshapesvisible(true); localxylineandshaperenderer.setseriesfillpaint(0, color.white); localxylineandshaperenderer.setusefillpaint(true); localxylineandshaperenderer .setlegenditemtooltipgenerator(new standardxyserieslabelgenerator( "tooltip {0}")); valueaxis range = localxyplot.getrangeaxis(); range.setlowerbound(0); // set lower limit can't move in -ve // range range.setupperbound(20); // set upper limit per app. needs setcontentpane(localchartpanel); } public void chartmouseclicked(chartmouseevent paramchartmouseevent) { } public void chartmousemoved(chartmouseevent paramchartmouseevent) { } public xydataset createdataset() { // // (int = 0; <6 ; i++) { // localtimeseries.add(i,4); // // } localtimeseries.add(new month(1, 2002), 4); localtimeseries.add(new month(2, 2002), 4); localtimeseries.add(new month(3, 2002), 4); localtimeseries.add(new month(4, 2002), 4); localtimeseries.add(new month(5, 2002), 4); localtimeseries.add(new month(6, 2002), 4); localtimeseries.add(new month(7, 2002), 4); localtimeseries.add(new month(8, 2002), 4); localtimeseries.add(new month(9, 2002), 4); localtimeseries.add(new month(10, 2002), 4); localtimeseries.add(new month(11, 2002), 4); localtimeseries.add(new month(12, 2002), 4); timeseriescollection.addseries(localtimeseries); // timeseriescollection1.addseries(localtimeseries1); return timeseriescollection; } public void mouseclicked(mouseevent e) { } public void mousedragged(mouseevent e) { // @ time use 1 of them. //movetimeseries(e); // comment or uncomment enable or disable series // movement movepoint(e); // comment or uncomment enable or disable selected // point movement } public void mouseentered(mouseevent e) { } public void mouseexited(mouseevent e) { canmove = false; // stop movement if cursor moved out chart // area initialmovepointy = 0; localchartpanel.setcursor(new cursor(cursor.default_cursor)); } public void mousemoved(mouseevent e) { } public void mousepressed(mouseevent e) { int x = e.getx(); // initialized point whenenver mouse pressed int y = e.gety(); entitycollection entities = this.info.getentitycollection(); chartmouseevent cme = new chartmouseevent(jfreechart, e, entities .getentity(x, y)); chartentity entity = cme.getentity(); if ((entity != null) && (entity instanceof xyitementity)) { xyitementity = (xyitementity) entity; } else if (!(entity instanceof xyitementity)) { xyitementity = null; return; } if (xyitementity == null) { return; // return if not pressed on series point } point pt = e.getpoint(); xyplot xy = jfreechart.getxyplot(); rectangle2d dataarea = localchartpanel.getchartrenderinginfo() .getplotinfo().getdataarea(); point2d p = localchartpanel.translatescreentojava2d(pt); initialmovepointy = xy.getrangeaxis().java2dtovalue(p.gety(), dataarea, xy.getrangeaxisedge()); canmove = true; localchartpanel.setcursor(new cursor(cursor.hand_cursor)); } public void mousereleased(mouseevent e) { // stop dragging on mouse released canmove = false; initialmovepointy = 0; localchartpanel.setcursor(new cursor(cursor.default_cursor)); } public void movepoint(mouseevent me) { try { if (canmove) { int itemindex = xyitementity.getitem(); point pt = me.getpoint(); xyplot xy = jfreechart.getxyplot(); rectangle2d dataarea = localchartpanel.getchartrenderinginfo() .getplotinfo().getdataarea(); point2d p = localchartpanel.translatescreentojava2d(pt); finalmovepointy = xy.getrangeaxis().java2dtovalue(p.gety(), dataarea, xy.getrangeaxisedge()); double difference = finalmovepointy - initialmovepointy; if (localtimeseries.getvalue(itemindex).doublevalue() + difference > xy.getrangeaxis().getrange().getlength() || localtimeseries.getvalue(itemindex).doublevalue() + difference < 0.0d) { initialmovepointy = finalmovepointy; } // retrict movement upper , lower limit (upper limit // should per application needs) double targetpoint = localtimeseries.getvalue(itemindex) .doublevalue() + difference; if (targetpoint > 15 || targetpoint < 0) { return; } else localtimeseries.update(itemindex, targetpoint); jfreechart.firechartchanged(); localchartpanel.updateui(); initialmovepointy = finalmovepointy; } } catch (exception e) { system.out.println(e); } } public void movetimeseries(mouseevent me) { try { if (canmove) { point pt = me.getpoint(); xyplot xy = jfreechart.getxyplot(); rectangle2d dataarea = localchartpanel.getchartrenderinginfo() .getplotinfo().getdataarea(); point2d p = localchartpanel.translatescreentojava2d(pt); finalmovepointy = xy.getrangeaxis().java2dtovalue(p.gety(), dataarea, xy.getrangeaxisedge()); double difference = finalmovepointy - initialmovepointy; (int = 0; < localtimeseries.getitemcount(); i++) { system.out.println(localtimeseries.getitemcount()); if (localtimeseries.getvalue(i).doublevalue() + difference > xy.getrangeaxis().getrange().getlength() || localtimeseries.getvalue(i).doublevalue() + difference < 0.0d) { initialmovepointy = finalmovepointy; } } // retrict movement upper , lower limit (upper limit // should per application needs) (int = 0; < localtimeseries.getitemcount(); i++) { double targetpoint = localtimeseries.getvalue(i) .doublevalue() + difference; if (targetpoint > 50 || targetpoint < 0) { return; } } (int = 0; < localtimeseries.getitemcount(); i++) { double targetpoint = localtimeseries.getvalue(i) .doublevalue() + difference; localtimeseries.update(i, targetpoint); } jfreechart.firechartchanged(); localchartpanel.updateui(); initialmovepointy = finalmovepointy; } } catch (exception e) { system.out.println(e); } } }
as both accept xydataset
, both use xylineandshaperenderer
internally, essential step replace chartfactory
:
// chartfactory.createtimeserieschart(…); chartfactory.createxylinechart(…);
the remaining changes substitute xyseries
accessors/mutators , construct gui on event dispatch thread.
import java.awt.*; import java.awt.event.mouseevent; import java.awt.event.mouselistener; import java.awt.event.mousemotionlistener; import java.awt.geom.point2d; import java.awt.geom.rectangle2d; import org.jfree.chart.*; import org.jfree.chart.axis.valueaxis; import org.jfree.chart.entity.chartentity; import org.jfree.chart.entity.entitycollection; import org.jfree.chart.entity.xyitementity; import org.jfree.chart.labels.standardxyserieslabelgenerator; import org.jfree.chart.plot.plotorientation; import org.jfree.chart.plot.xyplot; import org.jfree.chart.renderer.xy.xyitemrenderer; import org.jfree.chart.renderer.xy.xylineandshaperenderer; import org.jfree.data.xy.xydataset; import org.jfree.data.xy.xyseries; import org.jfree.data.xy.xyseriescollection; import org.jfree.ui.applicationframe; import org.jfree.ui.refineryutilities; /** * @see http://stackoverflow.com/a/38711095/230513 * @see http://www.jfree.org/forum/viewtopic.php?f=3&t=30569 */ public class seriesandpointdragandmove extends applicationframe implements chartmouselistener, mouselistener, mousemotionlistener { public static void main(string[] args) { eventqueue.invokelater(new runnable() { @override public void run() { seriesandpointdragandmove app = new seriesandpointdragandmove("plot"); app.pack(); refineryutilities.centerframeonscreen(app); app.setvisible(true); } }); } private boolean canmove = false; private double finalmovepointy = 0; private chartrenderinginfo info = null; private double initialmovepointy = 0; private jfreechart jfreechart = null; private chartpanel chartpanel = null; private xyseries series = new xyseries("series"); private xyseriescollection collection = new xyseriescollection(); private xyitementity xyitementity = null; public seriesandpointdragandmove(string paramstring) { super(paramstring); jfreechart = chartfactory.createxylinechart( "drag point", "points (index)", "velocity (m/s)", createdataset(), plotorientation.vertical, true, true, false); chartpanel = new chartpanel(jfreechart) { @override public dimension getpreferredsize() { return new dimension(640, 480); } }; chartpanel.addchartmouselistener(this); chartpanel.addmousemotionlistener(this); chartpanel.addmouselistener(this); chartpanel.setautoscrolls(false); chartpanel.setmousezoomable(false); this.info = chartpanel.getchartrenderinginfo(); xyplot localxyplot = (xyplot) jfreechart.getplot(); xyitemrenderer localxyitemrenderer = localxyplot.getrenderer(); localxyitemrenderer.setseriesstroke(0, new basicstroke(2.0f)); xylineandshaperenderer localxylineandshaperenderer = (xylineandshaperenderer) localxyplot.getrenderer(); localxylineandshaperenderer.setbaseshapesvisible(true); localxylineandshaperenderer.setseriesfillpaint(0, color.white); localxylineandshaperenderer.setusefillpaint(true); localxylineandshaperenderer.setlegenditemtooltipgenerator( new standardxyserieslabelgenerator("tooltip {0}")); valueaxis range = localxyplot.getrangeaxis(); range.setlowerbound(0); range.setupperbound(20); setcontentpane(chartpanel); } @override public void chartmouseclicked(chartmouseevent paramchartmouseevent) { } @override public void chartmousemoved(chartmouseevent paramchartmouseevent) { } public xydataset createdataset() { (int = 0; < 8; i++) { series.add(i, 4); } collection.addseries(series); return collection; } @override public void mouseclicked(mouseevent e) { } @override public void mousedragged(mouseevent e) { movepoint(e); } @override public void mouseentered(mouseevent e) { } @override public void mouseexited(mouseevent e) { canmove = false; // stop movement if cursor out chart area initialmovepointy = 0; chartpanel.setcursor(new cursor(cursor.default_cursor)); } public void mousemoved(mouseevent e) { } public void mousepressed(mouseevent e) { int x = e.getx(); // initialized point whenenver mouse pressed int y = e.gety(); entitycollection entities = this.info.getentitycollection(); chartmouseevent cme = new chartmouseevent(jfreechart, e, entities .getentity(x, y)); chartentity entity = cme.getentity(); if ((entity != null) && (entity instanceof xyitementity)) { xyitementity = (xyitementity) entity; } else if (!(entity instanceof xyitementity)) { xyitementity = null; return; } if (xyitementity == null) { return; // return if not pressed on series point } point pt = e.getpoint(); xyplot xy = jfreechart.getxyplot(); rectangle2d dataarea = chartpanel.getchartrenderinginfo() .getplotinfo().getdataarea(); point2d p = chartpanel.translatescreentojava2d(pt); initialmovepointy = xy.getrangeaxis().java2dtovalue(p.gety(), dataarea, xy.getrangeaxisedge()); canmove = true; chartpanel.setcursor(new cursor(cursor.hand_cursor)); } @override public void mousereleased(mouseevent e) { // stop dragging on mouse released canmove = false; initialmovepointy = 0; chartpanel.setcursor(new cursor(cursor.default_cursor)); } public void movepoint(mouseevent me) { if (canmove) { int itemindex = xyitementity.getitem(); point pt = me.getpoint(); xyplot xy = jfreechart.getxyplot(); rectangle2d dataarea = chartpanel.getchartrenderinginfo() .getplotinfo().getdataarea(); point2d p = chartpanel.translatescreentojava2d(pt); finalmovepointy = xy.getrangeaxis().java2dtovalue(p.gety(), dataarea, xy.getrangeaxisedge()); double difference = finalmovepointy - initialmovepointy; if (series.gety(itemindex).doublevalue() + difference > xy.getrangeaxis().getrange().getlength() || series.gety(itemindex).doublevalue() + difference < 0.0d) { initialmovepointy = finalmovepointy; } // retrict movement upper , lower limit (upper limit // should per application needs) double targetpoint = series.gety(itemindex).doublevalue() + difference; if (targetpoint > 15 || targetpoint < 0) { return; } else { series.update(integer.valueof(itemindex), double.valueof(targetpoint)); } jfreechart.firechartchanged(); chartpanel.updateui(); initialmovepointy = finalmovepointy; } } public void moveseries(mouseevent me) { if (canmove) { point pt = me.getpoint(); xyplot xy = jfreechart.getxyplot(); rectangle2d dataarea = chartpanel.getchartrenderinginfo() .getplotinfo().getdataarea(); point2d p = chartpanel.translatescreentojava2d(pt); finalmovepointy = xy.getrangeaxis().java2dtovalue(p.gety(), dataarea, xy.getrangeaxisedge()); double difference = finalmovepointy - initialmovepointy; (int = 0; < series.getitemcount(); i++) { system.out.println(series.getitemcount()); if (series.gety(i).doublevalue() + difference > xy.getrangeaxis().getrange().getlength() || series.gety(i).doublevalue() + difference < 0.0d) { initialmovepointy = finalmovepointy; } } // retrict movement upper , lower limit (upper limit // should per application needs) (int = 0; < series.getitemcount(); i++) { double targetpoint = series.gety(i) .doublevalue() + difference; if (targetpoint > 50 || targetpoint < 0) { return; } } (int = 0; < series.getitemcount(); i++) { double targetpoint = series.gety(i) .doublevalue() + difference; series.update(integer.valueof(i), double.valueof(targetpoint)); } jfreechart.firechartchanged(); chartpanel.updateui(); initialmovepointy = finalmovepointy; } } }
Comments
Post a Comment