【问题标题】:JFreeChart setDataset for XYPlot用于 XYPlot 的 JFreeChart setDataset
【发布时间】:2012-04-02 20:04:28
【问题描述】:

在我的文凭中,我在SwingWorker 课程中有一些时间昂贵的计算。当SwingWorker 调用done 方法时。所有结果都应该放在图表上。关于结果 - 我不知道图例中有多少值。我做了这一切,但图表没有刷新。根本不显示系列。我尝试通过dataset.addSeries(someSeries)chart.getXYPlot().setDataset(someDataset)。在 DynamicDataDemo1.java 等示例项目中,它们只是向系列添加新点,而不是刷新/重绘图形。为什么图形不刷新?我有信息XYSeriesadd 方法向所有注册的听众发送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);
    }

}

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    这个example 显示向DefaultXYDataset 添加(或删除)系列;不需要特别的努力。

    只要应用程序正确使用event dispatch threadXYSeriesCollection 的实例(相关的XYDataset)应该可以类似地工作。正如 exampleSwingWorker API 中所建议的那样,process()done() 都应履行该义务。

    默认情况下,XYPlot 将自己注册为DatasetChangeListener。验证此功能未被禁用。

    sscce 可能会解决这个问题。

    【讨论】:

    • 对不起,我现在才发现我的错误。我在图表对象的错误实例中更新数据。我对自己的手感到非常失望。不过谢谢你的建议。我之前也检查过你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多