# jFreeChart in eine NetBeans Projekt integrieren



## Rol (11. Mrz 2011)

Hallo,

ich habe eine Netbeans Projekt mit einem GUI. Nun möchte ich an einer Stelle der oberfläche ein Balkendiagram darstellen. Jetzt ist dort erstmal nur eine JPanel als Platzhalter.

Ich würde das Balkendiagram gern mit jFreeChart erstellen. Ein Beispiel von dem aus ich mich rantasten könnte wäre hier: JFreeChart: Bar Chart Demo : Bar ChartChartJava

Jetzt habe ich aber keinen blassen Schimmer, wie ich das Diagramm auf meine Oberflächen (auf / in mein JPanel oder ???) bringe.

Gruß
Rol


----------



## Eldorado (11. Mrz 2011)

Geht es jetzt um den GUI-Code oder wie du das Diagramm in Netbeans über die Oberfläche einfügen kannst?

Wenn Nr. 2 zutrifft und du keine Oberfläche ohne Netbeans schreiben kannst, würde ich empfehlen dies zu lernen.

Wenn Nr. 1 zutrifft, dann musst du ein Object von der Klasse Chart erstellen und dieses über add dem panel hinzufügen


----------



## Rol (11. Mrz 2011)

Meinst Du die Oberfläche überhaupt nicht mit dem GUI Builder von NetBeans erstellen?


----------



## Tomate_Salat (11. Mrz 2011)

Ihn interessiert, ob du mit einer GUI auch ohne Editor arbeiten kannst. Falls nein, solltest du einen Schritt nach dem anderen machen und dich erstmal in GUI-Programmierung einarbeiten.


----------



## jgh (11. Mrz 2011)

grundsätzlich gebe ich meinen Vorrednern recht...aber^^ spass macht es aber mehr, wenn man einfach loscodet.

Hast du denn die JCommon.jar und JFreeChart.jar deinem Projekt hinzugefügt?


----------



## Rol (11. Mrz 2011)

> Hast du denn die JCommon.jar und JFreeChart.jar deinem Projekt hinzugefügt? 

Ja. habe ich. 
Ich habe auch schon GUI's per Hand erstellt. Hier wollte ich aber eigentlich den GUI Builder benutzen. Das Projekt ist nicht besonders klar definiert, d.h. während des Entwickelns ändern sich Teile der Aufgabenstellung immer wieder und damit z.T. auch das GUI. Da hat man mit den Builder schnell mal ein Element rein geklickt oder verändert.


----------



## jgh (11. Mrz 2011)

und wo ist dein problem?


> Wenn Nr. 1 zutrifft, dann musst du ein Object von der Klasse Chart erstellen und dieses über add dem panel hinzufügen




```
final CategoryDataset dataset = createDataset();
        final JFreeChart chart = createChart(dataset);
        
       deinPanel.add(chart);
```

entweder übernimmst du dann die Methoden aus dem Bsp 1:1, oder änderst es nach deinen wünschen ab...


----------



## Rol (11. Mrz 2011)

```
final CategoryDataset dataset = createDataset();
        final JFreeChart chart = createChart(dataset);
        
       deinPanel.add(chart);
```

Das dachte ich auch, aber dann kommt der Fehler:

cannot find symbol
  symbol:   method add(org.jfree.chart.JFreeChart)
  location: class javax.swing.JPanel


----------



## jgh (11. Mrz 2011)

hast du den die beiden JAR´s auch dem BuildPath geaddet?


----------



## Rol (11. Mrz 2011)

Ja, u.a. ist:
jcommon-1.0.16.jar
jfreechart-1.0.13.jar
geadded.

Ein Test-Chart kann ich auch erzeugen, in ein Image schreiben und diese Image in ein jLabel schreiben:

```
PieDataset dataset = createDataset();
JFreeChart chart = createChart(dataset, "foo");
BufferedImage image = chart.createBufferedImage(jLabel1.getWidth(),jLabel1.getHeight());
jLabel1.setIcon(new ImageIcon(image));
```

Ist zum Testen ein Kuchen, aber das ist ja egal.

Warum kann ich den Chart nicht an ein jPanel adden?


----------



## Tomate_Salat (11. Mrz 2011)

ein Blick in die Api verrät dir wieso:
JFreeChart erbt nicht von Component.



			
				Api hat gesagt.:
			
		

> You should use a ChartPanel to display a chart in a GUI.


----------



## Rol (11. Mrz 2011)

habe ich auch schon versucht:


```
PieDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset, "foo");

        ChartPanel chartPanel = new ChartPanel(chart);
        jPanel4.add(chartPanel);
```

Es wird kein Chart auf dem jPanel4 angezeigt :-(


----------



## Tomate_Salat (11. Mrz 2011)

Welchen layoutManager verwendet jPanel4?


----------



## Rol (11. Mrz 2011)

GroupLayout, brauche ich einen anderen?


```
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 325, Short.MAX_VALUE)
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 161, Short.MAX_VALUE)
        );
```


----------



## Tomate_Salat (11. Mrz 2011)

setz mal beim ChartPanel noch eine preferedSize


----------



## Rol (11. Mrz 2011)

Habe auch BorderLayout umgestellet-> jetzt geht es!

Vielen Dank!

Ich hoffe, ich komme mit dem Rest allein zurecht.


----------



## Jens81 (11. Mrz 2011)

Also ich adde meine JFreeCharts einfach mit

```
meinPanel.add(chart);
```

In meinem Beispiel habe ich aber ein null Layout verwendet und die Position mit setBounds gesetzt.


----------



## Tomate_Salat (11. Mrz 2011)

@Rol: das sollte auch mit dem GroupLayout gehen, setze einfach mal eine preferedSize(Dimension)
@Jens81: bezweifel ich, wenn du wissen willst wieso, lese Post #11


----------



## jgh (11. Mrz 2011)

Tomate Salat hat Recht...mein Post war auch falsch, aber ohne eine IDE ist es manchmal etwas schwierig^^

ich dachte auch das JFreeChart direkt von Component erbt, bzw zumindest von JPanel...aber dafür braucht man das ChartPanel, shame on me


----------



## Jens81 (11. Mrz 2011)

Ich mache es schon so, wie ich geschrieben habe. Aber hab gerade gesehen, dass ich meine eigene ChartKlasse von JPanel ableite.


```
public class ChartAlterspyramide extends JPanel {
//...
```

Sorry


----------



## Rol (11. Mrz 2011)

```
PieDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset, "foo");
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(200,200));
        jPanel4.add(chartPanel);
```

Der Chart wird mit GroupLayout nicht angezeigt, mit BorderLayout schon.


----------



## Tomate_Salat (11. Mrz 2011)

Jou wenns mit BorderLayout läuft ists ja gut . Ich arbeite nie mit GroupLayout, dachte das würde gehen mit der prefSize :-/.


----------



## Rol (11. Mrz 2011)

Jetzt habe ich noch ein Problem:

Die Daten welche dem Chart zugrunde liegen ändern sich zur Laufzeit und dann soll sich natürlich auch der Chart ändern.

Ich habe als ersten Ansatz mal folgendes versucht:

Wenn sich die Daten geändert haben wird folgendes aufgerufen:

```
dataset = createDataset();
chart = createChart(dataset);
meinPanel.repaint();
```

Leider pssiert gar nichts.


----------



## Tomate_Salat (11. Mrz 2011)

Was soll den passieren? hast du Daten überhaupt geändert?



			
				Unser alter guter Freund die Api hat gesagt.:
			
		

> The panel registers with the chart to receive notification of changes to any component of the chart. The chart is redrawn automatically whenever this notification is received.


das ChartPanel sollte automatisch merken, wenn änderungen vorliegen und zeichnet sich dann neu.


----------



## Rol (11. Mrz 2011)

meine anzuzeigenden Daten befinden sich in einem arry namens "milliPipHisto".
So lade ich sie in ein dataset:


```
private CategoryDataset createDataset() {
        // create the dataset...
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        DecimalFormat df = new DecimalFormat("0.00");
        for (int i = 0; i < milliPipHisto.length; i++) {
            dataset.addValue((milliPipHisto[i] / 1000000f), "", String.valueOf(i));
        }
        return dataset;
    }
```

Damit sich der Chart automatisch bei änderung des array "milliPipHisto" ändert müßte ich das wahrscheinlich anders machen... aber wie?


----------

