JFreeChart: data disappears after zooming and panning

I have a JFreeChart time series chart that displays a TimePeriodValuesCollection. The data set contains two intervals. The data is displayed correctly, and I can pan (using Ctrl-drag) the view. The problem is that if I zoom in and I pan the right view in an enlarged view, the second interval suddenly disappears after the first interval is no longer visible.

Everything is in order if there is only one interval, or if I do not increase.

Any thoughts?

SSCCE:

public class DisappearingTest { public static final SimpleDateFormat oracleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { buildFrame(); } }); } private static void buildFrame() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JPanel chartPanel = null; try { chartPanel = createChartPanel(); } catch (ParseException e) { e.printStackTrace(); } f.add(chartPanel); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } static JPanel createChartPanel() throws ParseException { TimePeriodValues timePeriodValues = new TimePeriodValues("Test"); Date startDate1 = oracleDateFormat.parse("2011-01-01"); Date endDate1 = oracleDateFormat.parse("2011-12-31"); timePeriodValues.add(new Second(startDate1), 0.3); timePeriodValues.add(new Second(endDate1), 0.3); Date startDate2 = oracleDateFormat.parse("2012-01-01"); Date endDate2 = oracleDateFormat.parse("2015-12-31"); timePeriodValues.add(new Second(startDate2), 0.5); timePeriodValues.add(new Second(endDate2), 0.5); TimePeriodValuesCollection dataSet = new TimePeriodValuesCollection(); dataSet.addSeries(timePeriodValues); JFreeChart chart = ChartFactory.createTimeSeriesChart("Title", "Time", "Value", dataSet, true, true, false); XYPlot plot = chart.getXYPlot(); plot.setDomainPannable(true); plot.setRangePannable(true); ChartPanel chartPanel = new ChartPanel(chart); return chartPanel; } } 
+2
source share
1 answer

Unfortunately, I have no idea why, but this option can help characterize the anomaly. Click and drag to select a little more than the entire range, and everything except n days in the domain, where n> 3. When you control the drag to the left, pan to the future, you will see that the last segment disappears after the 3rd day and then reappear after about n days. The Reset button lets you get started; note that the marks mark noon.

Appendix: In this forum> the author explores the problem and offers a patch .

Application: Fixed in bug ID 3561093 .

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.data.time.Day; import org.jfree.data.time.TimePeriodValues; import org.jfree.data.time.TimePeriodValuesCollection; /** * @see http://stackoverflow.com/a/12065474/230513 */ public class DisappearingTest { private static ChartPanel chartPanel; private static ValueAxis range; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { buildFrame(); } }); } private static void buildFrame() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); initChartPanel(); f.add(chartPanel, BorderLayout.CENTER); JPanel panel = new JPanel(); panel.add(new JButton(new AbstractAction("Reset") { @Override public void actionPerformed(ActionEvent e) { chartPanel.restoreAutoBounds(); range.setLowerBound(0); range.setUpperBound(1); } })); f.add(panel, BorderLayout.SOUTH); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } static void initChartPanel() { TimePeriodValues values = new TimePeriodValues("Test"); values.add(new Day(1, 1, 2012), 0.2); values.add(new Day(2, 1, 2012), 0.2); values.add(new Day(3, 1, 2012), 0.8); values.add(new Day(1, 2, 2012), 0.8); TimePeriodValuesCollection data = new TimePeriodValuesCollection(); data.addSeries(values); JFreeChart chart = ChartFactory.createTimeSeriesChart( "Title", "Time", "Value", data, true, true, false); XYPlot plot = chart.getXYPlot(); plot.setDomainPannable(true); range = plot.getRangeAxis(); range.setLowerBound(0); range.setUpperBound(1); chartPanel = new ChartPanel(chart); chartPanel.setMouseWheelEnabled(true); } } 
+4
source

Source: https://habr.com/ru/post/1438392/


All Articles