import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
public class GraphView extends JPanel implements Observer {
/**
* The Model (Account) we are observing
*/
private Model model;
/**
* Our drawing parameters, try to do things in terms of this
*/
Rectangle barLoc = new Rectangle (20, 20, 200, 40);
public GraphView (Model model) {
// Stash arg
this.model = model;
// Sign us up as Observer
model.addObserver (this);
// Set up our panel
setBorder (new TitledBorder ("View"));
}
/**
* This will be called by our Model
*/
public void update (Observable observable, Object object) {//*1 Catch callback from model, and just repaint ourself
repaint(); //*1
}
public void paintComponent (Graphics g) { //*2 We call model for the actual data
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int balance = model.getBalance (); //*2
int range = 2000;
if (balance>range) balance = range;
if (balance< -range) balance = -range;
// Bar for balance
if (balance<0) { //*3 Draw graphic representation
g2.setColor (Color.RED); //*3
g2.fill (new Rectangle ( //*3
barLoc.x + ((balance+range) * barLoc.width/2) / range, //*3
barLoc.y, //*3
((-balance) * barLoc.width/2) / range, //*3
barLoc.height)); //*3
}
else { //*3
g2.setColor (Color.GREEN); //*3
g2.fill (new Rectangle ( //*3
barLoc.x + barLoc.width/2, //*3
barLoc.y, //*3
(balance * barLoc.width/2) / range, //*3
barLoc.height)); //*3
}
// Outline
g2.setColor (Color.BLACK);
g2.draw (barLoc); //*3
// Zero line
g2.drawLine (barLoc.x + barLoc.width/2, barLoc.y-10, //*3
barLoc.x + barLoc.width/2, barLoc.y+barLoc.height+10); //*3
// Legends
int ylegend = barLoc.y + barLoc.height + 15;
g2.drawString ("-" + String.valueOf (range), barLoc.x-10, ylegend);
g2.drawString ("0", barLoc.x + barLoc.width/2 -2, ylegend);
g2.drawString (String.valueOf (range), barLoc.x + barLoc.width -10, ylegend);
}
public Dimension getPreferredSize () {
return new Dimension (barLoc.x + barLoc.width + barLoc.x,
barLoc.y + barLoc.height + barLoc.y);
}
}