# Diagramm mit JfreeChart



## Musiumincapitis (5. Dez 2010)

Hallo zusammen

Ich versuche gerade ein Säulendiagramm mit JFreeChart zu erstellen, was leider noch nicht so ganz klappt.

Ich bin bereits so weit, dass ich ein CategoryDataset habe, in dem alle gewünschten Daten vorhanden sind.
Jedoch klappt das erstellen der JFreeChart nicht ... es gibt zwar kein Exptions aber es werden keine Daten übernommen..

Nun bin ich auf der Suche nach einer Lösung für mein Problem...

Das ist der Code den ich bis jetzt habe....

Das hier ist der Konstrucktor der Reporting Klass, welche das Diagramm anzeigen soll

```
public Reporting(boolean allUser, User user)
	{
		try
		{
			ApplicationFrame chartFrame;
			
			if(allUser)
			{
				chartFrame = new ApplicationFrame("Working Time - All Users");
			}
			else
			{
				chartFrame = new ApplicationFrame("Working Time - " + user.GetUserName() + " (" + user.GetName() + ", "+ user.GetPrename() + ")");
			}
			
			CategoryDataset dataset = CreateDataset(allUser, user);
	        JFreeChart chart = createChart(dataset, allUser);
	        
	        
	        ChartPanel chartPanel = new ChartPanel(chart);
	        chartPanel.setPreferredSize(new Dimension(500, 270));
			
			chartFrame.pack();
		    RefineryUtilities.centerFrameOnScreen(chartFrame);
		    chartFrame.setVisible(true);
		}
		catch (Exception ex) 
		{
			JOptionPane.showMessageDialog(null, ex.toString(), MSGBOX, JOptionPane.OK_OPTION);
		}
	}
```

CategoryDataset ist die Methode, welches das DataSet erstellt.
GetTimeValue berechnet eine Zeitdifferenz zwischen 2 Timestamps
GetUsers gibt alle Users zurück
GetProjects macht das gleiche mit den Projekten

```
private CategoryDataset CreateDataset(boolean allUser, User user) 
	{       
		try
		{
			DefaultCategoryDataset dataset = new DefaultCategoryDataset();
			ArrayList<User> users = new ArrayList<User>();
			ArrayList<Project> projects = GetProjects();
			
			if(allUser)
			{
				users = GetUsers();
			}
			else
			{
				users.add(user);
			}
			
			for(int i = 0; i < projects.size(); i++)
			{
				for(int c = 0; c < users.size(); c++)
				{
					dataset.addValue(GetTimeValue(users.get(c).GetPK(), projects.get(i).GetPK()), projects.get(i).GetProject(), users.get(c).GetUserName());
				}
			}
			
		    return dataset;  
		}
		catch (Exception ex) 
		{
			JOptionPane.showMessageDialog(null, ex.toString(), MSGBOX, JOptionPane.OK_OPTION);
			return new DefaultCategoryDataset();
		}     
	}
```

createChart ist mein versuch das Diagramm zu erstellen, was  aber leider nicht klappt..

```
private JFreeChart createChart(CategoryDataset dataset, boolean allUser) 
    {
        JFreeChart chart = ChartFactory.createBarChart
        (
            "...."l,         			
            "User",                 
            "Spent Time",           
            dataset,               
            PlotOrientation.VERTICAL,
            true,                   
            true,                     
            false                     
        );


        chart.setBackgroundPaint(Color.white);

        CategoryPlot plot = chart.getCategoryPlot();
        plot.setBackgroundPaint(Color.lightGray);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);


        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setDrawBarOutline(false);
        
         GradientPaint gp = new GradientPaint(
            0.0f, 0.0f, Color.blue, 
            0.0f, 0.0f, Color.lightGray
        );
        renderer.setSeriesPaint(2, gp);

        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0));        
        return chart;
    }
```

Mfg.
Musiumincapitiss


----------



## SlaterB (5. Dez 2010)

der Code sagt wenig aus, wenn GetProjects() oder anderes nichts liefert, dann kommt auch nichts ins DataSet,
schreibe Methoden unbedingt klein und fange deine Programm klein an,
als aller erstes Daten mit System.out.println() ausgeben, klappt das in der doppelten for-Schleife?
vor der Schleife die Länge der Listen/Arrays ausgeben

auf die Chart bezogen fange mit einfachen Befehlen wie
dataset.addValue("Test","x",1); 
oder ähnliches an, wird das angezeigt?

erst wenn eine Dinge gehen, dann Schritt für Schritt komplizierter, Dinge kombinieren,


-------

und möglichst noch darauf achten, was du hier im Forum postest und was nicht,
dein Problem hat sicherlich nix mit

```
if(allUser)
            {
                chartFrame = new ApplicationFrame("Working Time - All Users");
            }
            else
            {
                chartFrame = new ApplicationFrame("Working Time - " + user.GetUserName() + " (" + user.GetName() + ", "+ user.GetPrename() + ")");
            }
```
zu tun, diesen Code hättest du auf 
>              chartFrame = new ApplicationFrame("Test");
kürzen können und alles wäre einen Schritt einfacher und übersichtlicher


----------



## Musiumincapitis (6. Dez 2010)

Ok es würde etwa kurzer gehen...

ins DataSet werden Werte geschrieben die ca. so aussehen 

(100,"ProjektName","BenutzerName1")
(100,"ProjektName2","BenutzerName1")
(100,"ProjektName3","BenutzerName1")
(100,"ProjektName10","BenutzerName2")

die Daten in deisem sind wie schon gesagt auch korrekt abgefüllt und ich kann auf diese zugreiffen


----------



## SlaterB (6. Dez 2010)

so, ich habe aus deinen Code-Abschnitten ein funktionierendes Beispiel mit main-Methode zusammengebastelt

funktioniert, wobei es noch den gravierenden Fehler gab, dass das ChartPanel gar nicht dem ApplicationFrame zugeordnet war,
das hätte man im ersten Posting sofort sehen können, aber wer ist schon perfekt? 

wenn du geschrieben hättest 'es ist überhaupt nix zu sehen, es öffnet sich nur ein Micro-Fenster', dann wärs mir vielleicht aufgefallen,
so dachte ich dass du die Chart mit x/y-Achse siehst, nur keine Nutzdaten,

ein vollständiges Testprogramm wie meines das man nur kopieren und ausführen muss wäre keine 10 Min. Arbeit für dich und hätte die Lösung auch sofort gebracht (falls es denn jemand anders ausprobiert)



```
public class Reporting
{
    public static void main(String[] args)
    {
        new Reporting();
    }

    public Reporting()
    {
        ApplicationFrame chartFrame = new ApplicationFrame("Working Time - All Users");

        CategoryDataset dataset = CreateDataset();
        JFreeChart chart = createChart(dataset);


        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(500, 270));
        chartFrame.add(chartPanel);

        chartFrame.pack();
        RefineryUtilities.centerFrameOnScreen(chartFrame);
        chartFrame.setVisible(true);
    }

    private CategoryDataset CreateDataset()
    {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(100, "ProjektName", "BenutzerName1");
        return dataset;
    }

    private JFreeChart createChart(CategoryDataset dataset)
    {
        JFreeChart chart = ChartFactory.createBarChart("....", "User", "Spent Time", dataset, PlotOrientation.VERTICAL, true, true,
                                                       false);


        chart.setBackgroundPaint(Color.white);

        CategoryPlot plot = chart.getCategoryPlot();
        plot.setBackgroundPaint(Color.lightGray);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);


        NumberAxis rangeAxis = (NumberAxis)plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        BarRenderer renderer = (BarRenderer)plot.getRenderer();
        renderer.setDrawBarOutline(false);

        GradientPaint gp = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f, 0.0f, Color.lightGray);
        renderer.setSeriesPaint(2, gp);

        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0));
        return chart;
    }
}
```


----------



## Musiumincapitis (6. Dez 2010)

Danke für deine Lösung, werde sie gleich ausprobieren..

Fürs näcchste mal...soll ich den ganzen source als zip anhängen?...den der ganze source würde viel zu viel platz brauchen?

mfg.
Musiumincapitis


----------



## SlaterB (6. Dez 2010)

weniger ist normalerweise besser, hier hat sich ja gezeigt, dass die geposteten Ausschnitte letztlich gereicht haben,
da du aber extra nachfragst nochmal lauter Weisheiten von mir dazu:

- nicht 3 verschiedene Code-Blocks posten, das finde ich persönlich anstrengend einzeln zu kopieren, 
- wenn der Code quasi für ein vollständiges Programm reicht, siehe mein Programm, dann auch main-Methode usw. ergänzen
- auf allgemeine Konventionen achten, Methoden klein schreiben!
- den Code kann man fürs Forum quasi immer noch weiter kürzen, neben oben angemerkerten Beispiel wird auch das Fehlen von

```
plot.setBackgroundPaint(Color.lightGray);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);
```
kaum bei der Lösungs-Suche stören


----------



## Musiumincapitis (6. Dez 2010)

alles klar, werd ich beim nächsten mal so machen 

ps. 
"auf allgemeine Konventionen achten, Methoden klein schreiben!"
...ich bin c# Programmierer und habe daher die Microsoft Konventionen im Kopf -> da sind Methoden gross...

mfg.


----------



## SlaterB (6. Dez 2010)

dann wenigstens einheitlich,
> private JFreeChart createChart(CategoryDataset dataset, boolean allUser) 
ist klein 

wobei du in Java mit ca. 4 Quadrillionen vorhandenen kleinen Methoden in der API so Probleme haben wirst


----------



## Musiumincapitis (6. Dez 2010)

Jo^^ das ist ein Fehler ^^
Hab aber das "Glück", dass ich nur in der Schule Java schreiben muss
Daher wird mir das keine Probleme verursachen.


----------

