【问题标题】:Dynamic JFreeChart not redrawing on changes动态 JFreeChart 不重绘更改
【发布时间】:2013-10-30 11:32:01
【问题描述】:

我正在使用 JFreeChart 库来实时绘制遗传算法的进度。

我在 UI 中使用 Swing。我有一个面板,我在其中绘制算法的所有各种参数,以及一个 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());

感谢您的阅读。

【问题讨论】:

  • 您的问题似乎很清楚,但是提供一些代码会很好。谢谢。
  • 完成。因为这是大学工作,所以我补充了我能提供的所有内容。
  • 优秀。好问题,赞成:)

标签: java swing jfreechart


【解决方案1】:

确保您正在更新图表的数据集或系列,最好是直接更新。图表应该会自行刷新。

我建议购买JFreeChart developer guide,因为它包含各种示例,包括动态图表。开发者指南的费用是支持 JFreeChart 开发的费用。

【讨论】:

  • 作为example,一个工作线程更新了更新图表(视图)的系列(模型)。
【解决方案2】:

我认为您在 EDT 中调用搜索过程是因为它无法重绘组件。

要从代码更新您的面板,请尝试使用SwingWorker,它可以更新 UI 并继续后台进程。您可以在互联网上找到很多使用示例。

或者您可以尝试使用Executors 进行后台搜索过程和更新UI。

【讨论】:

  • 这当然解释了为什么菜单在搜索过程中被冻结。感谢您为我指明正确的方向!如果我需要任何进一步的帮助,我会立即着手处理并更新原始帖子。
  • 很高兴为您提供帮助
【解决方案3】:

我认为这对你有用

JFreeChart jf = // Your JFreeChart chart Object.
ChartPanel chartPanel = new ChartPanel(jf);
myPanel.add(chartPanel);
myPanel.repaint();
myPanel.revalidate();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多