в моем дипломе у меня есть дорогостоящий расчет в классе 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);
}
}