Was mir auf die Schnelle noch aufgefallen ist:
- der Konstruktor der Klasse darf keinen Rückgabewert (also auch kein "void") definieren
Vielen Dank für den Hinweis. Der war sehr nützlich, in meiner neuen Klasse habe ich nämlich den selben Fehler gemacht und ich konnte ihn nicht finden, bis ich den Post gelesen habe.
Warum? Datenkapselung, Lesbarkeit, Wiederverwendbarkeit, ...
...
Abgesehen davon könntest du so 2 Asuros gleichzeitig an 2 Schnittstellen bedienen.
Ist schon klar. Mir scheint die Objektorientierung eher für Graphik-Anwendungen nützlich. Deshalb habe ich versucht, eine Klasse zu schreiben, welche die Messwerte der IR-Schnittstelle als Graph darstellt. Im ersten Schritt sind hier die Kommunikationsfunktionen noch nicht eingebunden und es werden einfach nur Zufallswerte dargestellt.
Leider flackert das Fenster immer, wenn ein neuer Punkt gezeichnet wird. Die Kurve wurde nur aktualisiert, wenn ich das Fenster mit "visible" ein-und ausschalte. Da müsste es eine andere Methode geben. Leider habe ich keine gefunden.
Code:
import java.awt.Graphics;
import java.awt.Point;
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;
private Point fensterDimension; // Point ist hier kein Punkt, sondern Länge und Breite
private Point[] daten;
private final int datenLaenge;
private int datenIndex;
private Graph()
{
fenstername="Graph";
fensterDimension=new Point();
fensterDimension.x=320;
fensterDimension.y=240;
datenLaenge=64;
daten=new Point[datenLaenge]; // Punkte der Kurve
datenIndex=0;
}
/**
* 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
if(datenIndex>0)
{
for(int n=0;n<(datenIndex-1);n++)
{
int k=fensterDimension.y/2;
g.drawLine(daten[n].x,k-daten[n].y,daten[n+1].x,k-daten[n+1].y);
}
}
}
/**
*
* 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-2);n++)
{
daten[n]=daten[n+1];
}
daten[datenLaenge-1]=a;
}
}
/**
* Demo: langsam neue Datenpunkte zum Graph hinzufügen und darstellen
*/
public static void main(String[] args)
{
JFrame graph1=new JFrame("Graph");
graph1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Graph g=new Graph();
graph1.setSize(g.fensterDimension.x,g.fensterDimension.y);
graph1.add( g);
Timer t=new Timer();
for(int n=0;n<100;n++)
{
g.addWert((int)(Math.random()*100));
graph1.setVisible(true);
t.msleep(200);
graph1.setVisible(false);
}
System.out.println("Ende");
}
}
Lesezeichen