# Kurve - Zeitachse



## maexchen (20. Nov 2006)

Hallo!

Ich will eine Kurve darstellen, auf der x-Achse soll die Zeit in Sekunden dargestellt werden. Das ganze erfolgt mit JFreeChart, mein Problem aber ist, dass ich nicht weiß wie ich die Zeitachse von Null beginnend definier.
Habe folgenden Code, aber da nimmt das Programm immer die momantene Zeit vom System.


```
final TimeSeries series = new TimeSeries("Random Data");
        
        Second current = new Second();
        System.out.println (current);
        double value = 100.0;
        for (int i = 0; i < 40; i++) {
            try {
                value = value + Math.random() - 0.5;
                series.add(current, new Double(value));
                current = (Second) current.next();
            }
            catch (final SeriesException e) {
                System.err.println("Error adding to series");
            }
        }
```


----------



## SlaterB (20. Nov 2006)

sind das allgemein bekannte Klassen die du da im Nebensatz erwähnst?

naja, schlaue Menschen finden auch so die API 
http://www.jfree.org/jfreechart/api/gjdoc/index.html

hier alle möglichen Second-Konstruktoren,
vielleicht geht dir dann ein Licht auf

```
Constructor Summary

Second()
    Constructs a new Second, based on the system date/time.

Second(Date time)
    Constructs a second.

Second(Date time, TimeZone zone)
    Creates a new second based on the supplied time and time zone.

Second(int second, int minute, int hour, int day, int month, int year)
    Creates a new second.

Second(int second, Minute minute)
    Constructs a new Second
```


----------



## maexchen (20. Nov 2006)

Danke, aber das hilft mir nicht weiter. Denn mit Second () bekomm ich ja die Zeit meines Systems. Gibts andere Vorschläge?

PS: Weiß jemand ob es sowas wie scrollbar oder scrollpane auch im jfreechart gibt? Hab bis jetzt nichts in die Richtung gefunden.


----------



## SnooP (20. Nov 2006)

ich hätte jetzt gedacht, das new Second(0,0) geht...


----------



## maexchen (20. Nov 2006)

Hab ich auch gedacht, aber es kommt dann die Meldung: The constructor is undefined. Man muss 6 Zahlen eingeben, aber dass will ich ja nicht.


----------



## SlaterB (20. Nov 2006)

was spricht denn gegen die 6 Zahlen:
new Second(0,0,0,0,0,0)
wobei man extern natürlich gar nicht abschätzen kann, was das für Auswirkungen hat,

aber gehts dir nicht darum eine andere Zeit in der Sekunde zu haben?
das geht nur über einen anderen Konstruktor

new Second(0,0) geht nicht, weil da ja von einem Minute-Objekt die Rede ist,
also müsste man dort schauen, vielleicht gibts Minute(0),

konsquent wäre aber ein Konstruktor Minute(int min, Hour hour) oder so, 
so dass das Spiel dann wieder von vorne losgeht


----------



## maexchen (20. Nov 2006)

Ich will einfach nur eine Zeitachse, die in der Sekunde Null beginnt. Minute (0) ist das gleiche wie mit Second.


----------



## SlaterB (20. Nov 2006)

was gegen
new Second(0,0,0,0,0,0) 
spricht hast du noch nicht gesagt,

aber wie viele hier kennen sich denn schon mit JFreeChart aus?
dagegen gibt es auf der JFreeChart-Seite ein Forum mit lauter Experten,
die bestimmte weiter helfen können


----------



## Guest (21. Nov 2006)

Hallo!

Folgendes Problem, habe 2 Programme nun zusammengefügt und habe nun zweimal die Methode main, was muss ich da ändern, damit mein Programm richtig läuft. Nur das main wegnehmen reicht nicht aus.


```
public class LOAD extends ApplicationFrame {
       
    public LOAD(final String title) {
        
        
        super(title);
        final XYDataset dataset = createDataset();
        final JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        chartPanel.setMouseZoomable(true, false);
        chartPanel.getZoomInFactor();
        setContentPane(chartPanel);
        
          System.out.println ("Zoom: " + chartPanel.getZoomInFactor());

    private XYDataset createDataset() {
        
        final TimeSeries series = new TimeSeries("Random Data");
        
        Day current = new Day();
        System.out.println (current);
        double value = 100.0;
        for (int i = 0; i < 40; i++) {
            try {
                value = value + Math.random() - 0.5;
                series.add(current, new Double(value));
                current = (Day) current.next();
            }
            catch (final SeriesException e) {
                System.err.println("Error adding to series");
            }
        }
        return new TimeSeriesCollection(series);
    }
    
       private JFreeChart createChart(final XYDataset dataset) {
        return ChartFactory.createTimeSeriesChart(
            "Test", 
            "Date", 
            "Value", 
            dataset,
            false, 
            false, 
            false
        );
    }
    
    
    public static void main(String[] a)throws IOException {
        sumLines("eingabe1.txt");
    }
    static void sumLines(String filename) throws IOException {
      LineNumberReader lnr = new LineNumberReader(new FileReader(filename));
      lnr.setLineNumber(1);
      StreamTokenizer stok = new StreamTokenizer(lnr);
      stok.parseNumbers();
      stok.eolIsSignificant(true);
      stok.nextToken();
      while (stok.ttype != StreamTokenizer.TT_EOF) {
        int lineno = lnr.getLineNumber();
        double sum = 0;
        while ((stok.ttype != StreamTokenizer.TT_EOL)&&(stok.ttype !=StreamTokenizer.TT_EOF)) {
          if (stok.ttype == StreamTokenizer.TT_NUMBER)
            sum += stok.nval;
          stok.nextToken();
        }
        System.out.println("Sum of line " + lineno + " is " + sum);
        stok.nextToken();
      }
    }

    public static void main(final String[] args) {

        final String title = "ECG-VIEWER";
        final LOAD demo = new LOAD(title);
        demo.pack();     
        
        demo.setVisible(true);

    }

}
```


----------



## SlaterB (21. Nov 2006)

zunächst mal musst du dir logisch überlegen,
was dein Programm machen soll, also z.B. ob der Code beider mains ausgeführt werden soll,
wenn ja in welcher Reihenfolge und gibt es irgendwelche Zusammenhänge die zu berücksichtigen sind/
wie kommt es überhaupt zu dieser Situation

ansonsten kann man nicht mehr sagen als 
eine main weg und mal sehen was der Zufall so bringt, welche main stehen bleibt
(50/50 Joker bei Wer wird Millionär)

> Nur das main wegnehmen reicht nicht aus. 

inwiefern?
inwiefern logisch (welches Problem hast du dann)?
oder
inwiefern programmiertechnisch (welche Fehlermeldungen)?


----------



## Gast (21. Nov 2006)

Es sollen zuerst das Testfile eingelesen werden, und dann sollen die Werte von lineno und sum übergeben werden.
Was für ein Teil soll nun main haben, ich brauch beide und sie werden nacheinander aufgerufen.


----------



## SlaterB (21. Nov 2006)

also EINE main mit

```
public static void main(final String[] args) {
      sumLines("eingabe1.txt"); 

        final String title = "ECG-VIEWER";
        final LOAD demo = new LOAD(title);
        demo.pack();     
       
        demo.setVisible(true);

}
```
die Übergabe von zwei Werten von der einen Operation an die andere ist nicht ganz trivial,
eine erste unsaubere Lösung wäre, die Werte in statischen Variablen zu speichern,

über ein schöneres Vorgehen kann man danach nachdenken,


----------



## Gast (21. Nov 2006)

Danke erstmal!!
Nun häng ich aber bei dem Problem der Variablenübergabe. Will sum in die Schleife statt value übergeben und mit den eingelesenen Werten die Kurve zeichnen. 
Hab dazu mal sum als public double definiert. Problem ist nur, das die Werte sich nicht ändern, sum ist bei mir immer null.


----------



## SlaterB (21. Nov 2006)

in sumLines() benutzt du wahrscheinlich eine lokale sum-Variable,
da muss auch die statische Variable benutzt werden,

aber das sind doch Anfängerprobleme, auf sowas trifft man doch alle 5 Min.?

mit System.out.println kannst du genau verfolgen welchen Wert sum zu welchen Zeitpunkt hat,
ein double kann gar nicht null werden, nur 0, 

wenn sum wieder 0 wird, dann hat es entweder jemand auf 0 gesetzt oder es ist eine andere sum-Variablen,
sowas ist immer sehr leicht zu finden


----------



## Gast (22. Nov 2006)

Kann es sein, dass ich die eingelesenen Werte in einem array speichern muss und sie erst dann wieder aus dem array auslesen kann für die Erstellung meiner Grafik?


----------



## SlaterB (22. Nov 2006)

diese Frage macht ohne jeden Kontext keinen Sinn,
keine Variable der Welt MUSS man in einem Array speichern..

wenn aber irgendeine Grafik-Operation ein Array verlangt, dann natürlich schon,
sowas erklärt sich aber doch meist von selbst (Klassenbeschreibung)


----------

