package observer.pattern;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;
import javax.swing.JPanel;
import observer.CourseRecord;
import observer.LayoutConstants;
/**
* This class represents a bar chart view of a vector of data. Uses the Observer
* pattern.
*/
@SuppressWarnings("serial")
public class BarChartObserver extends JPanel implements Observer {
/**
* Creates a BarChartObserver object
*
* @param data
* a CourseData object to observe
*/
public BarChartObserver(CourseData data) {
data.addObserver(this);
this.courseData = data.getUpdate();
this.setPreferredSize(new Dimension(2 * LayoutConstants.xOffset
+ (LayoutConstants.barSpacing + LayoutConstants.barWidth)
* this.courseData.size(), LayoutConstants.graphHeight + 2
* LayoutConstants.yOffset));
this.setBackground(Color.white);
}
/**
* Paint method
*
* @param g
* a Graphics object on which to paint
*/
public void paint(Graphics g) {
super.paint(g);
LayoutConstants.paintBarChartOutline(g, this.courseData.size());
for (int i = 0; i < courseData.size(); i++) {
CourseRecord record = (CourseRecord) courseData.elementAt(i);
g.setColor(Color.blue);
g.fillRect(
LayoutConstants.xOffset + (i + 1)
* LayoutConstants.barSpacing + i
* LayoutConstants.barWidth, LayoutConstants.yOffset
+ LayoutConstants.graphHeight
- LayoutConstants.barHeight
+ 2
* (LayoutConstants.maxValue - record
.getNumOfStudents()),
LayoutConstants.barWidth, 2 * record.getNumOfStudents());
g.setColor(Color.red);
g.drawString(record.getName(),
LayoutConstants.xOffset + (i + 1)
* LayoutConstants.barSpacing + i
* LayoutConstants.barWidth, LayoutConstants.yOffset
+ LayoutConstants.graphHeight + 20);
}
}
/**
* Informs this observer that the observed CourseData object has changed
*
* @param o
* the observed CourseData object that has changed
*/
public void update(Observable o, Object arg) {
CourseData data = (CourseData) o;
this.courseData = data.getUpdate();
this.setPreferredSize(new Dimension(2 * LayoutConstants.xOffset
+ (LayoutConstants.barSpacing + LayoutConstants.barWidth)
* this.courseData.size(), LayoutConstants.graphHeight + 2
* LayoutConstants.yOffset));
this.revalidate();
this.repaint();
}
private Vector<CourseRecord> courseData;
}