Java 动态JFreeChart未在更改时重新绘制

Java 动态JFreeChart未在更改时重新绘制,java,swing,jfreechart,Java,Swing,Jfreechart,我正在利用JFreeChart库实时绘制遗传算法的进度 我正在使用Swing作为UI。我有一个面板,我在其中绘制算法的所有各种参数,还有一个ChartPanel对象。在调用算法的搜索方法(每次生成时更新图表的XYSeries对象)之前以及在搜索结束时绘制此对象,并精确绘制所有值 根据文档,ChartPanel对象在其各自的图表更新时被重新绘制。显然,Swing面板本身直到搜索完成后才被重新绘制,我调用repaint(),但是我能做些什么来修复这个问题呢 这是图表代码: public class

我正在利用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;
    }
}
在我的面板构造函数中,我将执行以下操作(这将绘制一个空图表):

这是当用户命令搜索时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();