在我的文凭中我在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);
}
}
答案 0 :(得分:1)
此example显示向({3}}添加(或删除)系列;不需要特别的努力。
只要应用程序正确使用DefaultXYDataset
,XYSeriesCollection
的实例(相关的XYDataset
)应该可以正常工作。根据此event dispatch thread和example API中的建议,process()
或done()
应符合该义务。
默认情况下,XYPlot
将自己注册为DatasetChangeListener
。确认未被禁用。
SwingWorker
可能会解决这个问题。