import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.Random;
import javax.swing.*;
public class HiBars implements Runnable {
HiBarPanel hiBarPanel = new HiBarPanel();
Random seed = new Random();
int DATA_MAX = 100;
long delay = 20*1000;
public HiBars() {
Thread thread = new Thread(this);
thread.setPriority(Thread.NORM_PRIORITY);
thread.start();
}
public void run() {
while(true) {
hiBarPanel.setData(getData(), DATA_MAX);
try {
Thread.sleep(delay);
} catch(InterruptedException e) {
break;
}
}
}
private int[] getData() {
int[] data = new int[4];
for(int i = 0; i < data.length; i++) {
data[i] = seed.nextInt(DATA_MAX+1);
}
return data;
}
private JPanel getContent() {
return hiBarPanel;
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new HiBars().getContent());
f.setSize(400,400);
f.setLocation(200,200);
f.setVisible(true);
}
}
class HiBarPanel extends JPanel {
int[] data;
int maxValue = 10;
final int PAD = 20;
public void setData(int[] data, int maxValue) {
this.data = data;
this.maxValue = maxValue;
System.out.printf("data = %s%n", java.util.Arrays.toString(data));
repaint();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
// Draw ordinate.
g2.draw(new Line2D.Double(PAD, PAD, PAD, h-PAD));
// Draw abcissa.
g2.draw(new Line2D.Double(PAD, h-PAD, w-PAD, h-PAD));
double xInc = (double)(w - 2*PAD)/data.length;
double scale = (double)(h - 2*PAD)/maxValue;
Path2D.Double path = new Path2D.Double();
// Draw data.
double x = PAD;
double y = h - PAD;
path.moveTo(x, y);
for(int i = 0; i < data.length; i++) {
x = PAD + i*xInc;
y = h - PAD - scale*data[i];
path.lineTo(x, y);
path.lineTo(x+xInc, y);
}
path.lineTo(x+xInc, h-PAD);
g2.setPaint(new Color(220,220,210));
g2.fill(path);
g2.setPaint(Color.blue);
g2.draw(path);
}
}