我有一个JFreeChart时间序列图表,显示TimePeriodValuesCollection。数据集包含两个间隔。数据显示正确,我可以平移(使用Ctrl-拖动)视图。问题是如果我放大,并且我在缩放视图中向右平移视图,第二个间隔在第一个间隔不再可见后突然消失。
一切正常,如果只有一个间隔,或者我不放大。
有什么想法吗?
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;
}
}
答案 0 :(得分:4)
可悲的是,我不知道为什么,但这种变化可能有助于表征异常。点击并拖动以选择稍微超过所有范围和除 n 天之外的所有范围,其中 n > 3.当你控制 - 向左拖动,向未来平移时,你会看到最后一段在第3天后消失,然后重新出现关于 n 天后。 重置按钮允许重新开始;请注意中午的标记。
附录:在此forum thread中,作者检查了问题并提出patch。
附录:已修复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);
}
}