JFreeChart: данные исчезают после масштабирования и панорамирования
У меня есть диаграмма временных рядов JFreeChart, которая отображает коллекцию TimePeriodValuesCollection. Набор данных содержит два интервала. Данные отображаются правильно, и я могу перемещать (с помощью Ctrl-drag) вид. Проблема в том, что если я увеличиваю масштаб и перемещаю изображение вправо в увеличенном виде, второй интервал внезапно исчезает после того, как первый интервал больше не виден.
Все в порядке, если есть только один интервал, или если я не увеличиваю масштаб.
Любой мысли?
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;
}
}
1 ответ:
К сожалению, я понятия не имею, почему, но эта вариация может помочь охарактеризовать аномалию. Щелкните и перетащите, чтобы выбрать чуть больше, чем весь диапазон и все, кроме n дней домена, где n > 3. При перетаскивании влево, перемещаясь в будущее, вы увидите, что последний сегмент исчезнет через день 3, а затем снова появится примерно через n дней. КнопкаReset позволяет начать все сначала; обратите внимание, что тики отмечают полдень.
Добавление: на этом форуме thread , автор рассматривает проблему и предлагаетпатч .
Дополнение: Исправлена ошибка в идентификатор 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); } }
Comments