【问题标题】:JFreeChart change data in an existing bar chartJFreeChart 更改现有条形图中的数据
【发布时间】:2023-04-08 20:20:01
【问题描述】:

我想循环更改条形图数据,但我不知道该怎么做。我的代码:

DefaultCategoryDataset barChartData = new DefaultCategoryDataset();
        barChartData.setValue(0,  "Values","1");
        barChartData.setValue(0,  "Values","2");
        barChartData.setValue(0,  "Values","3");


        JFreeChart barChart = ChartFactory.createBarChart("Proxi", "Sensors", "Value", barChartData, PlotOrientation.VERTICAL, false, true, false);

        CategoryPlot barchrt = barChart.getCategoryPlot();

        barchrt.setRangeGridlinePaint(Color.ORANGE);

        ChartPanel barPanel = new ChartPanel(barChart);
        barPanel.setBounds(0, 0, 731, 456);
        contentPane.add(barPanel);

【问题讨论】:

    标签: java jfreechart bar-chart


    【解决方案1】:

    更新 model 和监听 view 将随之而来。要在不阻止event dispatch thread 的情况下为更新设置动画,请使用javax.swing.Timer,如here 所示;根据需要调用stop()

    经测试:

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.util.Random;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.data.category.DefaultCategoryDataset;
    
    /**
     * @see https://stackoverflow.com/a/21267585/230513
     */
    public class Test {
    
        private static final String ROW_KEY = "Values";
        private static final Random r = new Random();
    
        private void display() {
            JFrame f = new JFrame("Test");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            final DefaultCategoryDataset model = new DefaultCategoryDataset();
            model.setValue(1, ROW_KEY, "1");
            model.setValue(2, ROW_KEY, "2");
            model.setValue(3, ROW_KEY, "3");
            JFreeChart chart = ChartFactory.createBarChart("Proxi", "Sensors",
                "Value", model, PlotOrientation.VERTICAL, false, true, false);
            ChartPanel barPanel = new ChartPanel(chart) {
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(320, 240);
                }
            };
            f.add(barPanel);
            f.add(new JButton(new AbstractAction("Update") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    model.setValue(r.nextDouble() * 3, ROW_KEY, "2");
                }
            }), BorderLayout.SOUTH);
    
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new Test().display();
                }
            });
        }
    }
    

    【讨论】:

    • 谢谢,我还需要从另一个对象发送此图表的数据,这会在循环中更改它的值。所以我需要在 Test 类中创建方法 updateChart ,这样我就可以在循环中传输数据,但是如果我在 run 方法中创建这样的线程,我会初始化 Test 类的对象,我无法在下面的代码中访问它。你能建议如何实现这一点吗?
    • 我会在后台使用SwingWorkerpublish() 并在process() 中更新模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多