import java.awt.Graphics;
import java.awt.Point;
import java.awt.Color;
import javax.swing.*;
import java.lang.Math;
import ch.Timer;
/**
* Graph Klasse zur Darstellung von Kurvenverläufen
*
* @author robo.fr ( Nickname ) christoph(at)roboterclub-freiburg.de
*
* Feb.2008
*
*/
public class Graph extends JPanel // ein Graph ist ein Fensterobjekt
{
public String fenstername;
public Point fensterDimension; // Point ist hier kein Punkt, sondern Länge und Breite
private Point[] daten;
private final int datenLaenge;
private int datenIndex;
private JFrame graphFenster;
public Axis achsen;
private int xAchsePos;
private int yAchsePos;
public Graph(String graphName)
{
fenstername=graphName;
fensterDimension=new Point();
fensterDimension.x=320;
fensterDimension.y=240;
xAchsePos=fensterDimension.y/2;
yAchsePos=40;
datenLaenge=128;
daten=new Point[datenLaenge]; // Punkte der Kurve
datenIndex=0;
graphFenster=new JFrame();
graphFenster.setTitle(fenstername);
graphFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
graphFenster.add(this);
graphFenster.setSize(fensterDimension.x,fensterDimension.y);
graphFenster.setVisible( true );
}
public Graph()
{
this("Graph");
}
/**
* Wert aus dem Datenarray graphisch darstellen
*
* @author robo.fr ( Nickname ) christoph(at)roboterclub-freiburg.de
*
* Feb.2008
*
*/
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g); // original paintComponent aus JPanel aufrufen
g.setColor(Color.blue);
double y=0;
if(datenIndex>0)
{
for(int n=0;n<(datenIndex-2);n++)
{
double scalex=1;
double scaley=1/5.0;
int p1x=(int)(daten[n].x*scalex);
int p1y=(int)(daten[n].y*scaley);
int p2x=(int)(daten[n+1].x*scalex);
int p2y=(int)(daten[n+1].y*scaley);
g.drawLine(yAchsePos+p1x,xAchsePos-p1y,yAchsePos+p2x,xAchsePos-p2y);
y=daten[n+1].y;
}
}
// Achsen zeichnen
g.setColor(Color.gray);
g.drawLine(0,xAchsePos,fensterDimension.x,xAchsePos);
g.drawLine(yAchsePos,0,yAchsePos,fensterDimension.y);
// Beschriftung
g.drawString(""+y, fensterDimension.x/2, 10 );
//g.drawString(""+y, 0, xAchsePos);
}
/**
*
* Fügt dem Graph einen neuen Wert hinzu
* der interne Index wird automatisch erhöht
*
* @author robo.fr ( Nickname ) christoph(at)roboterclub-freiburg.de
*
* Feb.2008
*
*/
public void addWert(int wert)
{
Point a=new Point();
a.x=datenIndex;
a.y=wert;
if(datenIndex<(datenLaenge)) // noch Platz im Array vorhanden
{
daten[datenIndex]=a;
datenIndex++;
}
else // Array voll, Kurve verschieben
{
// Arraywerte nach unten verschieben
for(int n=0;n<(datenLaenge-1);n++)
{
Point k;
k=daten[n+1];
k.x=n*2;
k.y=k.y;
daten[n]=k;
//daten[n]=daten[n+1];
}
//daten[datenLaenge-1]=a;
daten[datenIndex-1]=a;
}
repaint();
}
/**
* Demo: langsam neue Datenpunkte zum Graph hinzufügen und darstellen
*/
public static void main(String[] args)
{
Graph g=new Graph("test");
// Fensterrahmen erzeugen
//JFrame fenster=new JFrame(g.fenstername);
JFrame fenster=g.graphFenster;
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//JLabel l=new JLabel("<html>Anzeigegraph
[b] fett [/b]</html>");
//g.add(l);
//l.setLocation(50,50); // geht nicht
//JButton knopf=new JButton("init");
//g.add(knopf);
fenster.setSize(g.fensterDimension.x,g.fensterDimension.y);
fenster.add( g); // Graph zum Fenster hinzufügen
fenster.setVisible(true);
try {Thread.sleep(1000);} catch (InterruptedException e){};
for(int n=0;n<200;n++)
{
g.addWert((int)(Math.random()*100));
System.out.println("test");
try {Thread.sleep(20);} catch (InterruptedException e){};
//fenster.setVisible(false);
}
//fenster.dispose();
System.out.println("Ende");
}
}