动态JFreeChart不重绘更改

时间:2013-10-30 11:32:01

标签: java swing jfreechart

我正在利用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());

感谢您的阅读。

3 个答案:

答案 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();