我正在利用JFreeChart库实时绘制遗传算法的进度。
我正在使用Swing作为UI。我有一个面板,我绘制算法的所有各种参数,以及ChartPanel对象。在我调用算法的搜索方法(在每一代更新图表的XYSeries对象)之前和搜索结束时绘制此对象,并准确绘制所有值。
根据文档,ChartPanel对象在更新其相应图表时会重新绘制。显然,Swing面板本身在搜索完成之后才会重新绘制,我会调用repaint(),但是我该怎么做才能解决这个问题?
这是图表代码:
public class XYSeriesDemo {
private static final long serialVersionUID = 1L;
private XYSeries series;
private JFreeChart chart;
public XYSeriesDemo(String str) {
series = new XYSeries(str);
XYSeriesCollection data = new XYSeriesCollection(series);
chart = createChart(data);
}
public XYSeries getSeries() {
return series;
}
public ChartPanel getChartPanel() {
return new ChartPanel(chart);
}
private JFreeChart createChart(final XYDataset data) {
JFreeChart chart = ChartFactory.createXYLineChart(
"Best fitness across generations",
"Generation",
"Fitness",
data,
PlotOrientation.VERTICAL,
true,
true,
false
);
XYPlot plot = chart.getXYPlot();
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
axis = plot.getRangeAxis();
axis.setAutoRange(true);
return chart;
}
}
在我的面板构造函数中,我正在执行以下操作(这会得到一个空图表):
demo = new XYSeriesDemo("Best fitness");
this.add(demo.getChartPanel());
当用户订购搜索时,这是Swing框架在我的JPanel对象中调用的方法:
public void solve() {
gen = new Random(seed);
XYSeries s = demo.getSeries();
GeneticAlgorithm ga = new GeneticAlgorithm(pop, crossoverP, mutationP,
eliteSize, maxGens, gen, s);
best = ga.search();
state = State.SOLVED;
time = ga.getTime() / 1E9;
}
在每一代中,算法中的搜索方法都是:
series.add(generation, pop.getBestFitness());
感谢您的阅读。
答案 0 :(得分:1)
确保您正在更新图表的数据集或系列,理想情况下是直接更新。图表应该刷新自己。
我建议购买JFreeChart developer guide,因为它包含各种示例,包括动态图表。开发人员指南的成本是支持JFreeChart开发的。
答案 1 :(得分:1)
我认为你在EDT中调用你的搜索过程是因为它无法重新绘制组件。
要从代码更新面板,请尝试使用SwingWorker,它可以更新UI并继续后台进程。您可以在Internet上找到许多使用示例。
或者您可以尝试使用Executors进行后台搜索过程和更新用户界面。
答案 2 :(得分:0)
我认为这对你有用
JFreeChart jf = // Your JFreeChart chart Object.
ChartPanel chartPanel = new ChartPanel(jf);
myPanel.add(chartPanel);
myPanel.repaint();
myPanel.revalidate();