# JFreeChart aktualisieren wenn sich die Ausgangsdaten ändern



## Rol (5. Apr 2011)

Hallo,

ich habe ein Array mit Daten welche ich als BarChart mit JFreeChart anzeige. Das funktioniert soweit.
Wenn sich nun aber die Daten im Array ändern soll auch der Chart aktualisiert werden. Wie ich in der API gelesen habe sollte das eigentlich automatisch geschehen, tut es aber leider nicht.

Den Chart erzeuge ich so:

```
public void showChart() {
        datasetWeekday = createWeekdayChartDataset();
        chartWeekday = createChartWeekday(datasetWeekday);
        chartWeekdayPanel = new ChartPanel(chartWeekday);
        myGUI.weekdayChartCanvas.add(chartWeekdayPanel);
        myGUI.weekdayChartCanvas.repaint();
    }
...
    private CategoryDataset createWeekdayChartDataset() {
        String[] dayOfWeek = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < weekdayHisto.length; i++) {
            dataset.addValue((weekdayHisto[i] / 1000000f), "", dayOfWeek[i]);
        }
        return dataset;
    }
```

Wenn sich nun die Daten im Array "weekdayHisto" geändert haben "aktualisiere" ich den Chart so:


```
public void refreshChart() {
        mytGUI.weekdayChartCanvas.removeAll();
        datasetWeekday = createWeekdayChartDataset();
        chartWeekday = createChartWeekday(datasetWeekday);
        chartWeekdayPanel = new ChartPanel(chartWeekday);
        mytGUI.weekdayChartCanvas.add(chartWeekdayPanel);
        mytGUI.weekdayChartCanvas.repaint();
    }
```

Das funktionier zwar, aber das ist doch Pfusch...
Kann mir jemand sagen, wie man es "richtig" macht?


----------



## Guybrush Threepwood (5. Apr 2011)

JFreeChart ist nur begrenzt dazu geeignet, Daten online zu plotten. Vermutlich brauchst Du für diesen Anwendungsfall eine andere Bibliothek.
Hast Du mal versucht, die neuen Daten dem Dataset hinzuzfügen statt ein komplett neues Chart-Objet zu erstellen? Du kreierst momentan jedes Mal ein komplett neues Dataset und anschließend einen neuen Chart mit einem neuen Chart-Panel, der dann der GUI hinzugefügt wird. Ziemlicher Overhead, oder?


----------



## SlaterB (5. Apr 2011)

das wenigste was du tun musst, ist doch wohl, die Daten aus dem Array wieder ans DefaultCategoryDataset zu übergeben,
entweder an das vorhandene oder notfalls ein neues und in der Chart das neue Model setzen

das mag reichen, weniger geht auf keinen Fall


----------



## Rol (5. Apr 2011)

Guybrush Threepwood hat gesagt.:


> JFreeChart ist nur begrenzt dazu geeignet, Daten online zu plotten. Vermutlich brauchst Du für diesen Anwendungsfall eine andere Bibliothek.



Kannst Du was empfehlen? Ich brauche Balken- und Linien-Charts.



Guybrush Threepwood hat gesagt.:


> Hast Du mal versucht, die neuen Daten dem Dataset hinzuzfügen statt ein komplett neues Chart-Objet zu erstellen?



Ja, dann wird der Cahrt aber nicht aktualisiert.



Guybrush Threepwood hat gesagt.:


> Du kreierst momentan jedes Mal ein komplett neues Dataset und anschließend einen neuen Chart mit einem neuen Chart-Panel, der dann der GUI hinzugefügt wird. Ziemlicher Overhead, oder?



Ich weiß, deshalb ja meine Frage...


----------



## SlaterB (5. Apr 2011)

> Ja, dann wird der Cahrt aber nicht aktualisiert.
Code?


----------



## Rol (5. Apr 2011)

SlaterB hat gesagt.:


> das wenigste was du tun musst, ist doch wohl, die Daten aus dem Array wieder ans DefaultCategoryDataset zu übergeben,



Ich steh gerade auf dem Schlauch, wie meinst Du das?



SlaterB hat gesagt.:


> notfalls ein neues und in der Chart das neue Model setzen



wie das neue Model setzen?


----------



## SlaterB (5. Apr 2011)

welche verschiedenen Möglichkeiten gibt es denn zu meinen, 'Daten aus dem Array ans DefaultCategoryDataset zu übergeben'?

du hast in deinem Array die Daten, 1, 2, 3 und 4 und willst diese in einer Chart anzeigen, also müssen die ja irgendwie übergeben werden,
du hast das doch schon oben im ersten Posting im ersten Codeblock Zeile 12-14, die Werte vom Array kommen ins DataSet,
was gibt es daran nicht zu verstehen?

ich sage lediglich, dass wenn im Array was neues steht, dass das dann auch ins DataSet muss, 
nicht unbedingt auf deinem Weg, alles plattmachen und komplett neu, sondern einfach ins vorhandene DataSet die Werte neu einfügen, mit quasi derselben Schleife

> wie das neue Model setzen? 
wie setzt du denn bisher das Model? die Methode createChartWeekday() hast du nicht gepostet,
wohin immer du das übergibst, wahrscheinlich im Konstruktor, denkst du nicht dass es dann auch dort eine setModel/ setDataset-Methode gibt?
das ist doch nicht schwer zu denken

ok, bei JFreeChart kann es bisschen komplizierter sein, wahrscheinlich doch eher eine statische Konstruktionsmethode als ein normaler Konstruktor,
ein JFreeChart-Objekt hat keine derartige Methode, da muss man erst das Plot-Objekt abfragen, dort dann direkt auch nicht,
erst auf CategoryPlot casten


----------



## Rol (5. Apr 2011)

So geht es:

```
public void refreshChart() {
        for (int i = 0; i < weekdayHisto.length; i++) {
            datasetWeekday.setValue((weekdayHisto[i] / 1000000f), "", dayOfWeek[i]);
        }
    }
```

Danke!


----------



## -horn- (8. Mai 2011)

moien,

an sowas sitze ich auch gerade, habe aber noch keinen plan wie das funktioniert.
ich brauche das für http://www.java-forum.org/awt-swing...en-graphen-anzeigen.html?highlight=jfreechart

kann mir mal jemand einen tipp geben, wo man dazu ein gutes und kleines beispiel herbekommt? wenn es geht bitte vollständig. ich muss mir das durch ganzebeispiele erschließen und die hier geposteten schnippchen sind leider für mich zu wenig 

ausserdem wäre es cool zu wissen, wo ich es auf einer anderen canvas (der von WorldWindJava) anzeigen lassen kann.

grüße, andreas


----------

