Как я могу заставить JFreeChart обновлять график при добавлении данных? - PullRequest
0 голосов
/ 17 сентября 2018

Я сделал прототип, чтобы показать концепцию того, что я пытаюсь сделать:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Driver {

    public static void main(String[] args) {
        JFrame main = new JFrame("Demo");
        Student s = new Student("8A", "This graph should update every time the values increment by 1", "Else", 1, 10, 2, 4, 5, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0);
        StudentGraphs sg = new StudentGraphs(s);
        main.setLayout(new BorderLayout());
        main.getContentPane().add(sg.getGraph1());

        main.setPreferredSize(new Dimension(500,500));

        JButton check = new JButton("Increment all values by 1");

        check.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                s.setTest1(s.getTest1()+1);
                s.setTest2(s.getTest1()+1);
                s.setTest3(s.getTest1()+1);
                s.setTest4(s.getTest1()+1);
                sg.refreshData(s);


            }

        });

        main.add(check, BorderLayout.SOUTH);
        main.pack();
        main.setVisible(true);
    }

}

(Этот класс ученика просто представляет случайную структуру данных, которую я только что сделал в качестве примера)

public class Student {

    private String className;
    private String firstName;
    private String lastName;
    private int targetGrade;
    private int test1, test2, test3, test4;
    private int java1, java2, java3, java4;
    private int term1, term2, term3, term4;
    private int overallPercent;
    private int overallGrade;
    private int residual;

    public Student(String className, String firstName, String lastName, int targetGrade, int test1, int test2, int test3, int test4,
            int java1, int java2, int java3, int java4, int term1, int term2, int term3, int term4, int overallPercent,
            int overallGrade, int residual) {
        this.className = className;
        this.firstName = firstName;
        this.lastName = lastName;
        this.targetGrade = targetGrade;
        this.test1 = test1;
        this.test2 = test2;
        this.test3 = test3;
        this.test4 = test4;
        this.java1 = java1;
        this.java2 = java2;
        this.java3 = java3;
        this.java4 = java4;
        this.term1 = term1;
        this.term2 = term2;
        this.term3 = term3;
        this.term4 = term4;
        this.overallPercent = overallPercent;
        this.overallGrade = overallGrade;
        this.residual = residual;
    }   



    @Override
    public String toString() {
        return "Student [className=" + className + ", firstName=" + firstName + ", lastName=" + lastName
                + ", targetGrade=" + targetGrade + ", test1=" + test1 + ", test2=" + test2 + ", test3=" + test3
                + ", test4=" + test4 + ", java1=" + java1 + ", java2=" + java2 + ", java3=" + java3 + ", java4=" + java4
                + ", term1=" + term1 + ", term2=" + term2 + ", term3=" + term3 + ", term4=" + term4
                + ", overallPercent=" + overallPercent + ", overallGrade=" + overallGrade + ", residual=" + residual
                + "]";
    }



    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getTargetGrade() {
        return targetGrade;
    }

    public void setTargetGrade(int targetGrade) {
        this.targetGrade = targetGrade;
    }

    public int getTest1() {
        return test1;
    }

    public void setTest1(int test1) {
        this.test1 = test1;
    }

    public int getTest2() {
        return test2;
    }

    public void setTest2(int test2) {
        this.test2 = test2;
    }

    public int getTest3() {
        return test3;
    }

    public void setTest3(int test3) {
        this.test3 = test3;
    }

    public int getTest4() {
        return test4;
    }

    public void setTest4(int test4) {
        this.test4 = test4;
    }

    public int getJava1() {
        return java1;
    }

    public void setJava1(int java1) {
        this.java1 = java1;
    }

    public int getJava2() {
        return java2;
    }

    public void setJava2(int java2) {
        this.java2 = java2;
    }

    public int getJava3() {
        return java3;
    }

    public void setJava3(int java3) {
        this.java3 = java3;
    }

    public int getJava4() {
        return java4;
    }

    public void setJava4(int java4) {
        this.java4 = java4;
    }

    public int getTerm1() {
        return term1;
    }

    public void setTerm1(int term1) {
        this.term1 = term1;
    }

    public int getTerm2() {
        return term2;
    }

    public void setTerm2(int term2) {
        this.term2 = term2;
    }

    public int getTerm3() {
        return term3;
    }

    public void setTerm3(int term3) {
        this.term3 = term3;
    }

    public int getTerm4() {
        return term4;
    }

    public void setTerm4(int term4) {
        this.term4 = term4;
    }

    public int getOverallPercent() {
        return overallPercent;
    }

    public void setOverallPercent(int overallPercent) {
        this.overallPercent = overallPercent;
    }

    public int getOverallGrade() {
        return overallGrade;
    }

    public void setOverallGrade(int overallGrade) {
        this.overallGrade = overallGrade;
    }

    public int getResidual() {
        return residual;
    }

    public void setResidual(int residual) {
        this.residual = residual;
    }

}

Здесь находятся графики, метод «refreshData» вызывается каждый раз, когда изменяются значения и график должен меняться, но я не знаю, как это сделать.Вы можете увидеть мою попытку там, но она не сработала.Мне интересно, если мне нужно использовать другой набор данных или что-то?ИДК.

import java.awt.Color;
import java.awt.Paint;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

public class StudentGraphs {


    public Student student;
    public JPanel graph1;
    ChartPanel cp;
    public JPanel graph2;

    public StudentGraphs(Student s) {
        student = s;
        graph1 = new JPanel();
        cp = generateGraph1(s);
        graph1.add(cp);
        //graph2 = generateGraph2(s);
    }

    //Generate graph JPanel
    private ChartPanel generateGraph1(Student student) {
        //JPanel graph = new JPanel();
        JFreeChart barChart = ChartFactory.createBarChart(student.getFirstName(), "Category", "Score", createDataset1(student), PlotOrientation.VERTICAL, true, true, false);

        formatGraphAppearance(barChart); // applying visual styles to the chart

        ChartPanel chartPanel = new ChartPanel(barChart);
        chartPanel.setPreferredSize(new java.awt.Dimension(300, 300));


        return chartPanel;
    }
    //Create Dataset of the Graph

    public CategoryDataset createDataset1(Student s) {
        final String termTestLabel = "Term Theory Test";
        final String javaTaskLabel = "Java Task";
        final String term1 = "Term 1";
        final String term2 = "Term 2";
        final String term3 = "Term 3";
        final String term4 = "Term 4";
        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        dataset.addValue(s.getTest1(), termTestLabel, term1);
        dataset.addValue(s.getTest2(), termTestLabel, term3);
        dataset.addValue(s.getTest3(), termTestLabel, term2);
        dataset.addValue(s.getTest4(), termTestLabel, term4);

        dataset.addValue(s.getJava1(), javaTaskLabel, term1);
        dataset.addValue(s.getJava2(), javaTaskLabel, term3);
        dataset.addValue(s.getJava3(), javaTaskLabel, term2);
        dataset.addValue(s.getJava4(), javaTaskLabel, term4);

        return dataset;
    }

    //REFRESH DATA OF THE GRAPH

    public void refreshData(Student s) {
        student = s;
        graph1 = generateGraph1(student);

        cp.repaint();
        graph1.repaint();
        System.out.println(student.toString());
    }


    private JPanel generateGraph2(Student student) {
        JPanel graph = new JPanel();
        JFreeChart lineChart = ChartFactory.createLineChart(student.getFirstName(), "Years", "Number of Schools", createDataset2(student), PlotOrientation.VERTICAL, true, true, false);

        formatGraphAppearance(lineChart); // applying visual styles to the chart

        ChartPanel chartPanel = new ChartPanel(lineChart);
        chartPanel.setPreferredSize(new java.awt.Dimension(300, 300));
        graph.add(chartPanel);
        return graph;
    }

    public DefaultCategoryDataset createDataset2(Student s) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(50, "Term Tests", "Term 1");
        dataset.addValue(70, "Term Tests", "Term 2");
        dataset.addValue(65, "Term Tests", "Term 3");
        dataset.addValue(33, "Term Tests", "Term 4");

        dataset.addValue(66, "Java Tasks", "Term 1");
        dataset.addValue(33, "Java Tasks", "Term 2");
        dataset.addValue(100, "Java Tasks", "Term 3");
        dataset.addValue(100, "Java Tasks", "Term 4");

        return dataset;
    }

    private void formatGraphAppearance(JFreeChart chart) {
        CategoryPlot plot = chart.getCategoryPlot();
        plot.setDomainGridlinePaint(Color.darkGray);
        plot.setRangeGridlinePaint(Color.DARK_GRAY);
        plot.setDomainGridlinePaint(Color.black);
        plot.setOutlineVisible(false);

        plot.setBackgroundPaint(null);
        chart.setBackgroundPaint(null);

        Paint[] colors = {
                new Color(149, 184, 209),      // blue
                new Color(184, 224, 210),      // red
                new Color(214, 234, 223),      // green
        };

        // change the default colors
        for (int i = 0; i < 4; i++) {
            plot.getRenderer().setSeriesPaint(i, colors[i % colors.length]);
        }
    }

    public JPanel getGraph1() {
        return graph1;
    }

    public void setGraph1(JPanel graph1) {
        this.graph1 = graph1;
    }

    public JPanel getGraph2() {
        return graph2;
    }

    public void setGraph2(JPanel graph2) {
        this.graph2 = graph2;
    }


}

И да, это в значительной степени демо, если вы запустите его вместе, вы сразу же сможете увидеть, что я пытаюсь сделать.Если бы вы могли показать мне, как сделать обновление графика в этом примере, было бы здорово, чтобы я мог интегрировать его в свое оригинальное приложение.Также побочный вопрос, если ChartPanel нужно перекрасить, нужно ли перекрашивать каждый другой JPanel, внутри которого он находится?(например, панель диаграммы, расположенная в 3 других вложенных JPanels).

...