I have made a prototype to show a concept of what I'm trying to do:
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);
}
}
(This student class is just representative of a random data structure I just made as an example)
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;
}
}
This is where the graphs are, the "refreshData" method is called every time the values are modified and the graph should change, but i don't know how to do that. You can see my attempt there but it didn't work. I'm wondering if i need to use a different dataset or something? 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;
}
}
And yeah this is pretty much the demo, if you run it together you should immediately be able to see what I'm trying to do. If you could show me how to make the graph live update on this example it would be great so I can integrate it into my original application. Also a side question, if the ChartPanel needs to be repainted, do I have to repaint every single other JPanel that it is within? (e.g. Chart Panel residing into 3 other nested JPanels).