Java 动态JFreeChart未在更改时重新绘制
我正在利用JFreeChart库实时绘制遗传算法的进度 我正在使用Swing作为UI。我有一个面板,我在其中绘制算法的所有各种参数,还有一个ChartPanel对象。在调用算法的搜索方法(每次生成时更新图表的XYSeries对象)之前以及在搜索结束时绘制此对象,并精确绘制所有值 根据文档,ChartPanel对象在其各自的图表更新时被重新绘制。显然,Swing面板本身直到搜索完成后才被重新绘制,我调用repaint(),但是我能做些什么来修复这个问题呢 这是图表代码:Java 动态JFreeChart未在更改时重新绘制,java,swing,jfreechart,Java,Swing,Jfreechart,我正在利用JFreeChart库实时绘制遗传算法的进度 我正在使用Swing作为UI。我有一个面板,我在其中绘制算法的所有各种参数,还有一个ChartPanel对象。在调用算法的搜索方法(每次生成时更新图表的XYSeries对象)之前以及在搜索结束时绘制此对象,并精确绘制所有值 根据文档,ChartPanel对象在其各自的图表更新时被重新绘制。显然,Swing面板本身直到搜索完成后才被重新绘制,我调用repaint(),但是我能做些什么来修复这个问题呢 这是图表代码: public class
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;
}
}
在我的面板构造函数中,我将执行以下操作(这将绘制一个空图表):
这是当用户命令搜索时Swing框架在my 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());
感谢阅读。请确保您正在更新图表的数据集或系列,最好是直接更新。图表应该自动刷新
我建议购买,因为它包括各种各样的例子,包括动态图表。《开发者指南》的成本是支持JFreeChart开发的成本。我认为您可以在EDT中调用搜索过程,因为它无法重新绘制组件 为了从您尝试使用的代码更新面板,它可以更新UI并继续后台进程。你可以找到很多在互联网上使用的例子
或者你可以尝试使用后台搜索过程和更新用户界面。我认为这对你很有用
JFreeChart jf = // Your JFreeChart chart Object.
ChartPanel chartPanel = new ChartPanel(jf);
myPanel.add(chartPanel);
myPanel.repaint();
myPanel.revalidate();
您的问题似乎很清楚,但是提供一些代码会很好。谢谢,完成了。由于这是大学的工作,我补充了我能提供的一切。太好了。很好的问题,投了赞成票:)这当然可以解释为什么在搜索过程中菜单会被冻结。谢谢你给我指明了正确的方向!如果我需要任何进一步的帮助,我现在就开始工作,并更新原始帖子。我很高兴为您提供帮助,因为一个工作线程更新了更新图表(视图)的系列(模型)。
JFreeChart jf = // Your JFreeChart chart Object.
ChartPanel chartPanel = new ChartPanel(jf);
myPanel.add(chartPanel);
myPanel.repaint();
myPanel.revalidate();