Diagramm mit JfreeChart

  • Themenstarter Musiumincapitis
  • Beginndatum
M

Musiumincapitis

Gast
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
Java:
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
Java:
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..
Java:
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
 
S

SlaterB

Gast
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
Java:
            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
 
M

Musiumincapitis

Gast
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
 
S

SlaterB

Gast
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)


Java:
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;
    }
}
 
M

Musiumincapitis

Gast
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
 
S

SlaterB

Gast
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
Java:
        plot.setBackgroundPaint(Color.lightGray);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);
kaum bei der Lösungs-Suche stören
 
M

Musiumincapitis

Gast
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.
 
S

SlaterB

Gast
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
 
M

Musiumincapitis

Gast
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T JFreeChart Diagramm speichern - Problem mit ImageIO nach Projektexport Allgemeine Java-Themen 3
J Power Point erstellen inklusive Diagramm Allgemeine Java-Themen 12
S Best Practice Diagramm zeichnen Allgemeine Java-Themen 0
El_Lobo 2D-Grafik Empfehlung für Diagramm-Erstellungs-Lib Allgemeine Java-Themen 2
J Werkzeug zur Datenanalyse von CSV nach Diagramm Allgemeine Java-Themen 7
F Klassendiagramm / UML Diagramm automatisch erstellen Allgemeine Java-Themen 3
data89 Zeit-Diagramm erstellen Allgemeine Java-Themen 11
B Komplettes Projekt als UML Diagramm mit eUML...geht das? Allgemeine Java-Themen 10
hdi Frage zu UML Klassen-Diagramm Allgemeine Java-Themen 8
G diagramm drucken Allgemeine Java-Themen 3
H Java Applet Diagramm (Chart) Allgemeine Java-Themen 11
S Diagramm erstellen Allgemeine Java-Themen 4
G Diagramm darstellen mit Javascript Allgemeine Java-Themen 41
G diagramm um Zustände darstellen zu können Allgemeine Java-Themen 5
L Excel Diagramm Erstellen Allgemeine Java-Themen 2
Ark Diagramm zur Java-Grammatik gesucht Allgemeine Java-Themen 2
N Diagramm beschriften, Servlet Allgemeine Java-Themen 5
J UML Diagramm erstellen Allgemeine Java-Themen 2
T Linien-Diagramm zeichnen Allgemeine Java-Themen 9
G jFreeChart Allgemeine Java-Themen 5
T Jfreechart continuous series mit fester Länge Allgemeine Java-Themen 23
H JFreechart createMultiplePieChart Allgemeine Java-Themen 2
M Suche Alternative zu JFreeChart Allgemeine Java-Themen 11
T jfreechart Linien/Punkttyp anpassen Allgemeine Java-Themen 1
S JFreechart: ValueMarker mit der Maus ziehen? Allgemeine Java-Themen 12
A JFreeChart funktioniert nicht :( Allgemeine Java-Themen 6
M Swing JFreechart x-Achse DateAxis, start im Ursprung Allgemeine Java-Themen 3
S Performante Visualisierung groẞer Datenmengen (ohne JFreeChart) Allgemeine Java-Themen 22
M Swing JFreeChart Domain Axis Label Abstand zu TickUnitLabel Allgemeine Java-Themen 9
S AWT JFreeChart in ein Label Allgemeine Java-Themen 7
J JFreeChart - Mehrere X-Achsen Einteilungen Allgemeine Java-Themen 3
B JFreeChart -> TimeSeries-Plot -> mehr y-Achsen Allgemeine Java-Themen 2
F JFreeChart Größe anpassen Allgemeine Java-Themen 8
K JFreeChart - Einträge in DomainAxis anpassen Allgemeine Java-Themen 2
I 2D-Grafik JFreeChart ChartPanel Problem mit dynamischer Grösse Allgemeine Java-Themen 3
O JFreeChart: ständiges Updaten der Chart stoppen Allgemeine Java-Themen 4
M JFreeChart mehrere PieCharts erstellen Allgemeine Java-Themen 2
M JFreeChart piechart - labelAnzeige Allgemeine Java-Themen 2
ARadauer JFreeChart: Beschriftung anzeigen Allgemeine Java-Themen 6
B JFreeChart - Achsenbeschriftung Allgemeine Java-Themen 4
ff Labels mit JFreeChart ausrichten Allgemeine Java-Themen 2
K JFreeChart Achsenbeschriftung ändern? Allgemeine Java-Themen 4
C jFreechart Diagram erstellen Allgemeine Java-Themen 2
G JFreeChart Allgemeine Java-Themen 5
G Jfreechart zwei charts Allgemeine Java-Themen 2
S JFreeChart LineChart Punkte über NULL Werte hinweg verbinden Allgemeine Java-Themen 5
E JFreeChart jars mit in meine Jar packen Allgemeine Java-Themen 6
G jfreechart probleme mit dem package? Allgemeine Java-Themen 2
D JFreeChart und Kuchendiagramm Allgemeine Java-Themen 3
P JFreeChart Fehlermeldung Allgemeine Java-Themen 2
P jFreeChart, binäre Signale Allgemeine Java-Themen 2
P jfreeChart y- Achsen hinzufügen Allgemeine Java-Themen 2
P jfreeChart Allgemeine Java-Themen 9
MQue JFreeChart Allgemeine Java-Themen 3
K JFreeChart Allgemeine Java-Themen 3
K JFreeChart und itext: Bildprobleme Allgemeine Java-Themen 4
G java.lang.NullPointerException JFreeChart Allgemeine Java-Themen 5
M JFreeChart: Zuviele Balken, Übersicht leidet dehr darunter Allgemeine Java-Themen 6
G JFreeChart - Labels Allgemeine Java-Themen 2
G Suche Beispiele jFreeChart Allgemeine Java-Themen 12
G Daten aus MySQL-Datenbank an JFreeChart übergeben Allgemeine Java-Themen 3
G JFreeChart drucken Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben