JFreeChart setDataset для XYPlot - PullRequest
       2

JFreeChart setDataset для XYPlot

1 голос
/ 17 марта 2012

в моем дипломе у меня есть дорогостоящий расчет в классе SwingWorker. Когда SwingWorker вызывать done метод. Весь результат должен быть нанесен на график. Насчет результата - я не знаю сколько будет значений в легенде. Я сделал все это, но диаграмма не обновилась. Не показывать сериалы вообще. Я пробую через dataset.addSeries(someSeries) и chart.getXYPlot().setDataset(someDataset). В примерах проектов, таких как DynamicDataDemo1.java и т. Д., Они просто добавляют новую точку в серию, а не обновляют / перерисовывают графику. Почему графика не обновилась? У меня есть информация, что add метод XYSeries отправляет SeriesChangeEvent всем зарегистрированным слушателям и автоматически обновляет график. Но я не знаю, сколько будет XYSeries. Не могу понять, как я могу обновить график с помощью setDataset метода XYPlot.

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 Ответ

1 голос
/ 18 марта 2012

Этот пример показывает добавление (или удаление) серии к (или из) a DefaultXYDataset; никаких особых усилий не требуется.

Экземпляр XYSeriesCollection, связанный с XYDataset, должен работать аналогично, если приложение правильно использует поток диспетчеризации событий . Как предлагается в этом примере и API SwingWorker, либо process(), либо done() должны выполнить это обязательство.

По умолчанию XYPlot регистрируется как DatasetChangeListener. Убедитесь, что это не было отключено.

sscce может пролить свет на проблему.

...