添加数据后,如何使JFreeChart更新图?

时间:2018-09-17 19:37:11

标签: java user-interface actionlistener jfreechart

我已经制作了一个原型,以展示我正在尝试做的事情的概念:

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”方法,但我不知道该怎么做。您可以在那里看到我的尝试,但是没有成功。我想知道是否需要使用其他数据集或其他内容? Idk。

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个嵌套JPanel中的图表面板)。

0 个答案:

没有答案