当前位置: 首页 > 知识库问答 >
问题:

如何在JFreeChart条形图中更新数据集

周培
2023-03-14

我得到了一个JFrame,在这个框架中有一个JPanel,JPanel中有一个JFreeChart(chart从一个方法中获取数据集),这个图表被添加到JPanel中创建的ChartPanel,然后ChartPanel被添加到JPanel中。此外,我在JPanel中获得了JComboBox,如果我更改了JComboBox中的选项,ActionListener将更新DataSet的值。返回dataset的方法从JComboBox中获取一个字符串(dataset的数据依赖于JComboBox的输出)。因此,如果我在JComboBox中更改选项,我将希望用新的数据集更新JFreeChart,并将其显示在屏幕上。我知道我需要在ActionListener中添加代码,但我不知道我应该在那里添加什么,有什么方法更新已经创建的JFreeChart吗?

private class PanelChart extends JPanel { {
    this.setLayout(new BorderLayout());

    // Create Dataset
    //method GUIImplementation.GetDataForChart takes as an input value of combobox

    CategoryDataset dataset = GUIImplementation.GetDataForChart(comboBoxCrimeTypeChart.getSelectedItem().toString());


    //Create chart
    JFreeChart crimeNumberBarChart = ChartFactory.createBarChart(
        "Number of crimes by type", //Chart Title
        "Fallen within", // Category axis
        "Number of crimes", // Value axis
        dataset,
        PlotOrientation.VERTICAL,
        true,true,false
        );
    ChartPanel panelCrimeNumberBarChart = new ChartPanel(crimeNumberBarChart);
    this.add(panelCrimeNumberBarChart, BorderLayout.CENTER);

    PanelChartSouth panelChartSouth = new PanelChartSouth(); //there is a combobox
    this.add(panelChartSouth, BorderLayout.SOUTH);
}}

private class ChartButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == backChart) {
            SizeAndTitleSetter(0);
            SwapPanelChart(0);
        } else if(e.getSource() == comboBoxCrimeTypeChart) { //comboBoxCrimeTypeChart is a JComboBox from PanelChartSouth
            String crimeType = comboBoxCrimeTypeChart.getSelectedItem().toString();
            System.out.println(crimeType);
            dataset = GUIImplementation.GetDataForChart(crimeType); // dataset updated
        }
    }
}

到目前为止,我只是设法通过从JFrame中删除PanelChart来更新该图表,然后创建新的PanelChart并将其添加到JFrame,并使用repaint和Revalidate。如果我在JComboBox中更改一次选项,它就有效了,第二次更改后,屏幕上的一切都开始刹车,旧的图表不想消失,新的图表在它下面,如果我调整屏幕大小,我可以看到它。

共有1个答案

柯翔
2023-03-14

您可以更新现有图表的数据集,如以下示例所示;当您更新模型(数据集)时,监听情节(视图)将相应地更新自己;categoryDataSet的具体实现通常提供合适的变异器。

DefaultCategoryDataset model = …
…
@Override
public void actionPerformed(ActionEvent e) {
    model.setValue(…);
}

可以使用相关图的setDataSet()方法替换现有图表的数据集。

CategoryPlot plot = (CategoryPlot) chart.getPlot();
…
@Override
public void actionPerformed(ActionEvent e) {
    plot.setDataset(…);
}

虽然在技术上可以像这里所建议的那样替换封闭视图组件,但通常更好的做法是像这里所建议的那样更新或替换模型。

 类似资料:
  • 问题内容: 我想循环更改条形图数据,但我不知道该怎么做。我的代码: 问题答案: 更新 模型 ,随后将显示侦听 视图 。动画更新,而不会阻塞事件调度线程,使用; 根据需要调用。 经测试:

  • 主要内容:什么是JFreeChart 条形图,JFreeChart 条形图的示例什么是JFreeChart 条形图 条形图是用矩形表示分组数据的图表。条形的高度或长度是代表条形的值的命题。 下图显示了 JFreeChart 库中包含的一些条形图的演示版本: JFreeChart 条形图的示例 让我们以人口数量作为样本数据。 年份 美国(百万) 中国(百万) 印度(百万) 2005年 10 15 20 2010年 15 20 25 2015年 20 25 30 以下代码根据上述

  • 我使用chart.js在我的网页上有一个BarChart。 我在其中添加了两个数据点 现在我想要更新那些条A和B,而不是删除它们并再次添加它们(我已经想好了如何做到这一点)。我想让它们垂直移动以适应它们的新值,但我无法找到如何访问图表中已经存在的数据。 没有什么比得上 其中第一个值将是存储数据的索引(F.E.)。 我该怎么做呢?

  • 我有一个抛物线图,抛物线方程的系数存储在数组中。在(mousemotionlistener)中,抛物线的系数被更改,我想用新的系数实时更新抛物线图。我怎么才能让这一切发生?

  • 问题内容: 我正在尝试创建一个条形图,该条形图从for循环内生成一个数据集。 数据是。现在,当数据经过所有这些操作并生成图形时,仅显示值5的条。值10的分隔条在哪里?有人知道我在做什么错吗?任何帮助表示赞赏。谢谢 编辑:这是条形图的代码: 问题答案: 我猜你在犯一个小错误,那就是。因此,每次将每个项目添加到一个单独的对象中,并使用具有最后一个值的最终实例来创建图表时,这就是在图表中仅获得最后一个值

  • 我已经在网上搜索了足够多的东西,但没有运气。 我已经创建了一个堆叠的3D条形图,其中我无法更改默认颜色。我试了所有提供的建议。 EvenI使用了,但它不起作用。与图表、情节和渲染器中的创作顺序有关吗? 当我打印行和列时,我得到以下信息: