2

TimePeriodValuesCollection を表示する JFreeChart 時系列グラフがあります。データセットには 2 つの間隔が含まれています。データは正しく表示され、ビューを (Ctrl キーを押しながらドラッグして) パンすることができます。問題は、ズームインし、ズームされたビューでビューを右にパンすると、最初の間隔が表示されなくなった後、2 番目の間隔が突然消えることです。

間隔が 1 つしかない場合、またはズームインしなくても、すべて問題ありません。

何かご意見は?

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;
    }
}
4

1 に答える 1

4

悲しいことに、その理由はわかりませんが、この変化は異常を特徴づけるのに役立つかもしれません. クリック アンド ドラッグして、すべての範囲よりもわずかに多く、ドメインのn日を除くすべてを選択します ( n > 3)。コントロール キーを押しながら左にドラッグし、未来に向かってパンすると、3 日後に最後のセグメントが消え、その後、約n日後に再び現れます。ボタンで最初からやり直すことができます。目盛りは正午を示すことに注意してください。Reset

補遺: このフォーラム スレッドで、作成者は問題を調査し、パッチを提案します。

補遺:バグ 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);
    }
}
于 2012-08-22T02:07:37.647 に答える