用于XYPlot的JFreeChart setDataset

时间:2012-03-17 16:06:38

标签: java jfreechart

在我的文凭中我在SwingWorker课程中有一些时间昂贵的计算。 SwingWorker调用done方法时。所有结果都应放在图表上。关于结果 - 我不知道图例中有多少值。我做了一切,但图表没有刷新。根本不显示系列。我试着通过dataset.addSeries(someSeries)chart.getXYPlot().setDataset(someDataset)。在DynamicDataDemo1.java等示例项目中,他们只是添加新的点到系列而不刷新/重绘图形。为什么图形不刷新?我有add XYSeries方法向所有已注册的侦听器发送SeriesChangeEvent并自动刷新图表的信息。但我不知道会有多少XYSeries。无法理解我如何通过XYPlot的setDataset方法刷新图表。

public class OutputChart extends JPanel {

private JFreeChart chart;
private XYSeriesCollection dataset;
private ChartPanel chartPanel;

public OutputChart() {
    dataset = createDataset();  
    chart = createChart(dataset);   
    chartPanel = new ChartPanel(chart);   
    chartPanel.setPreferredSize(new java.awt.Dimension(800, 400));   
    add(chartPanel);
}

/**  
 * Creates a chart.  
 *   
 * @param dataset  the data for the chart.  
 *   
 * @return a chart.  
 */   
private static JFreeChart createChart(XYDataset dataset) {   

    JFreeChart chart = ChartFactory.createXYLineChart(   
        "Результаты вычислений алгоритма",// chart title   
        "N",                      // x axis label   
        "V",                      // y axis label   
        dataset,                  // data   
        PlotOrientation.VERTICAL,   
        true,                     // include legend   
        true,                     // tooltips   
        false                     // urls   
    );   

    chart.setBackgroundPaint(Color.white);   

    XYPlot plot = chart.getXYPlot();   
    plot.setBackgroundPaint(Color.lightGray);   
    plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));   
    plot.setDomainGridlinePaint(Color.white);   
    plot.setRangeGridlinePaint(Color.white);   

    plot.setDomainCrosshairVisible(true);   
    plot.setRangeCrosshairVisible(true);   

    XYLineAndShapeRenderer renderer    
        = (XYLineAndShapeRenderer) plot.getRenderer();   
    renderer.setShapesVisible(true);   
    renderer.setShapesFilled(true);   

    // change the auto tick unit selection to integer units only...   
    NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();   
    rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());   

    return chart;   

}

/**
 * Create  data set for chart
 * @return empty data set
 */
private XYSeriesCollection createDataset(){
    return new XYSeriesCollection();
}

    public void setDataset(XYSeries series){ //try through addSeries and setDataset of XYPlot.
         dataset.addSeries(series);
    }

    public void setDataset(XYDataset dataset){ //try through addSeries and setDataset of XYPlot.
         chart.getXYPlot().setDataset(dataset);
    }

}

1 个答案:

答案 0 :(得分:1)

example显示向({3}}添加(或删除)系列;不需要特别的努力。

只要应用程序正确使用DefaultXYDatasetXYSeriesCollection的实例(相关的XYDataset)应该可以正常工作。根据此event dispatch threadexample API中的建议,process()done()应符合该义务。

默认情况下,XYPlot将自己注册为DatasetChangeListener。确认未被禁用。

SwingWorker可能会解决这个问题。