【问题标题】:Update data on JFreeChart更新 JFreeChart 上的数据
【发布时间】:2019-05-21 20:33:59
【问题描述】:

JFreeChart 没有像我预期的那样更新。

我有下面的代码。有 2 个面板,一个带有增量按钮,一个带有显示数据的图表。

每按一次+1按钮,就应该更新数据;但图表未显示新数据。

非常感谢您的任何帮助。

public class GUItest3 extends JFrame  {
    private JPanel evoTabbedPanel, outputPanel;
    float tempCtr;

    public GUItest3(){
        tempCtr = 0;
        JToolBar toolBar = new JToolBar();
        toolBar.setFloatable(false);
        JButton incrementorButton = new JButton ("+1");
        incrementorButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) { 
                tempCtr++;}
        });
        toolBar.add(incrementorButton);
        evoTabbedPanel = new JPanel();
        evoTabbedPanel.add(toolBar);
        MyGraphPanel myGraphPanel = new MyGraphPanel();
        outputPanel = new JPanel();
        outputPanel.setLayout(new GridBagLayout());
        outputPanel.add(myGraphPanel);
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Generations", evoTabbedPanel);
        tabbedPane.addTab("Output", outputPanel);
        getContentPane().add(tabbedPane);
        pack();
        setVisible(true);
    }    

    class MyGraphPanel extends JPanel {
        JFreeChart myChart;
        ChartPanel chartPanel;
        XYSeriesCollection myDataset;

        private MyGraphPanel(){
            XYSeries myData = new XYSeries( "My data" );
            myData.add(1.0, 1.0);
            myData.add(2.0, tempCtr);

            myDataset = new XYSeriesCollection();          
            myDataset.addSeries(myData);
            myChart = ChartFactory.createXYLineChart("My chart", "X axis", "Y axis", 
                    myDataset, PlotOrientation.VERTICAL, true, true, false);

            chartPanel = new ChartPanel(myChart);
            this.add(chartPanel);
        }
    }
}

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    您的ActionListener 更新tempCtr,但您需要更新图表的数据集才能更新图表:

    @Override
    public void actionPerformed(ActionEvent e) {
        XYSeries mySeries = myGraphPanel.myDataset.getSeries(0);
        mySeries.addOrUpdate(tempCtr, Math.pow(2, tempCtr));
        tempCtr++;
    }
    

    下面的完整示例说明了单击按钮两次后的结果;它侧重于基本问题并说明了一些附加要点:

    • event dispatch thread 上构造和操作 Swing GUI 对象。

    • 在封闭的JPanel 上覆盖getPreferredSize(),如here 所示,以建立封闭面板的初始大小。

    • 使用 GridLayoutGridBagLayout 和默认约束,以允许图表在调整封闭容器大小时进行调整。

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    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.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;
    
    public class GUItest3 {
    
        float tempCtr;
    
        private void display() {
            JFrame f = new JFrame("Test");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            MyGraphPanel myGraphPanel = new MyGraphPanel();
            f.add(myGraphPanel, BorderLayout.CENTER);
            f.add(new JButton(new AbstractAction("+1") {
                @Override
                public void actionPerformed(ActionEvent e) {
                    XYSeries mySeries = myGraphPanel.myDataset.getSeries(0);
                    mySeries.addOrUpdate(tempCtr, Math.pow(2, tempCtr));
                    tempCtr++;
                }
            }), BorderLayout.SOUTH);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        class MyGraphPanel extends JPanel {
    
            JFreeChart myChart;
            ChartPanel chartPanel;
            XYSeriesCollection myDataset;
    
            private MyGraphPanel() {
                setLayout(new GridLayout());
                XYSeries myData = new XYSeries("My data");
                myData.add(tempCtr, tempCtr++);
                myData.add(tempCtr, tempCtr++);
                myDataset = new XYSeriesCollection();
                myDataset.addSeries(myData);
                myChart = ChartFactory.createXYLineChart("My chart", "X axis", "Y axis",
                    myDataset, PlotOrientation.VERTICAL, true, true, false);
                chartPanel = new ChartPanel(myChart);
                this.add(chartPanel);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(512, 256);
            }
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new GUItest3()::display);
        }
    }
    

    【讨论】:

    • 谢谢,这真的很有帮助。你说使用事件调度线程,是不是我的?!如果不是,请你解释一下为什么不?
    • 您的示例缺少main(),所以我提一下以供参考;只要 GUItest3 构造函数在 EDT 上运行,您可能就可以了;我以为extends JFrame 只是为了说明,我只是注意到我在编辑后忘记了删除它;已更新。
    猜你喜欢
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多