Обновить данные на JFreeChart - PullRequest
1 голос
/ 21 мая 2019

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);
        }
    }
}

1 Ответ

1 голос
/ 22 мая 2019

Ваш ActionListener обновляет tempCtr, но вам нужно обновить набор данных диаграммы, чтобы обновить диаграмму:

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

Полный пример ниже иллюстрирует результат после двойного нажатия кнопки; он фокусируется на существенной проблеме и иллюстрирует несколько дополнительных моментов:

  • Создание и управление объектами Swing GUI * только 1010 * в потоке диспетчеризации событий .

  • Переопределить getPreferredSize() на вмещающем JPanel, как показано здесь , чтобы установить начальный размер ограждающей панели.

  • Используйте GridLayout или GridBagLayout с ограничениями по умолчанию, чтобы позволить диаграмме адаптироваться при изменении размера вмещающего контейнера.

image

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);
    }
}
...