# Problem beim zeichen eines TimeSeriesChart mit jfreechart



## headbanger (2. Jul 2007)

Moin Leute, 

ich habe da ein kleines Problem ich möchte gerne ein Diagramm zeichen welches an der x-achse das jeweilige Datum zum passenden y anzeigt ... nix wildes habe mir dann eine kleine demo besorgt um zu verstehen wie das ganze funktioniert ...  jetzt raffe ich nichtso ganz was das soll :

s1.add(new Day(01, 06, 2007), 167.3); s1 ist der Graph bzw Linie new Day der eintrag auf der x achse 167.3 der y wert okay aber 01,06,2007 wasn das fürn datentyp ?? 3 int werte ?? 

Weil mein problem ist das ich das datum jeweils als string vorliegen habe  ???:L  wo kann ich denn sagen das new Day einen String als Datum erwartet ?? 

hier mal der quell text 


```
public class TimeSeriesChartDemo1 extends ApplicationFrame {
	static ChartEventAdmin cea = new ChartEventAdmin();

	static EventAdmin ea = new EventAdmin();

	static ShoppingCart sc = new ShoppingCart();

	static WorkerAdmin wa = new WorkerAdmin(ea);

	static ArticleAdmin aa = new ArticleAdmin(ea, cea);

	static CustomerAdmin ca = new CustomerAdmin(ea);

	static BillAdmin ba = new BillAdmin(ea, aa, sc);

	static PersistenceAdmin pa = new PersistenceAdmin(ea, cea, wa, ca, aa, ba);

	/**
	 * A demonstration application showing how to create a simple time series
	 * chart. This example uses monthly data.
	 * 
	 * @param title
	 *            the frame title.
	 */
	public TimeSeriesChartDemo1(String title) {
		super(title);
		XYDataset dataset = createDataset();
		JFreeChart chart = createChart(dataset);
		ChartPanel chartPanel = new ChartPanel(chart, false);
		chartPanel.setPreferredSize(new java.awt.Dimension(750, 300));
		chartPanel.setMouseZoomable(true, true);
		setContentPane(chartPanel);
	}

	/**
	 * Creates a chart.
	 * 
	 * @param dataset
	 *            a dataset.
	 * 
	 * @return A chart.
	 */
	private static JFreeChart createChart(XYDataset dataset) {

		JFreeChart chart = ChartFactory.createTimeSeriesChart(
				cea.getArtName(999), // title
				"Datum", // x-axis label
				"Lagerbestand", // y-axis label
				dataset, // data
				false, // create legend?
				false, // generate tooltips?
				false // generate URLs?
				);

		chart.setBackgroundPaint(Color.white);

		XYPlot plot = (XYPlot) chart.getPlot();
		plot.setBackgroundPaint(Color.lightGray);
		plot.setDomainGridlinePaint(Color.white);
		plot.setRangeGridlinePaint(Color.white);
		plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
		plot.setDomainCrosshairVisible(true);
		plot.setRangeCrosshairVisible(true);

		XYItemRenderer r = plot.getRenderer();
		if (r instanceof XYLineAndShapeRenderer) {
			XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
			renderer.setBaseShapesVisible(true);
			renderer.setBaseShapesFilled(true);
		}

		DateAxis axis = (DateAxis) plot.getDomainAxis();

		axis.setDateFormatOverride(new SimpleDateFormat("yyyy:MM:dd"));

		return chart;

	}

	/**
	 * Creates a dataset, consisting of two series of daily data.
	 * 
	 * @return The dataset.
	 */
	private static XYDataset createDataset() {

		TimeSeries s1 = new TimeSeries(cea.getArtName(999), Day.class);
		java.util.Vector Daten = getDateDataforGraph(999,cea);
		 Iterator iter = Daten.iterator();
		
		 while (iter.hasNext()){
			 Event e = (Event)iter.next();
			 s1.add(new Day(e.getdFormat()),e.getActAmount()); 
			 
			 
		 }
		

//		s1.add(new Day(01, 06, 2007), 167.3);
//		s1.add(new Day(02, 06, 2007), 153.8);
//		s1.add(new Day(03, 06, 2007), 167.6);
//		s1.add(new Day(04, 06, 2007), 158.8);
//		s1.add(new Day(05, 06, 2007), 148.3);
//		s1.add(new Day(06, 06, 2007), 153.9);
//		s1.add(new Day(07, 06, 2007), 142.7);
//		s1.add(new Day(8, 06, 2007), 123.2);
//		s1.add(new Day(9, 06, 2007), 131.8);
//		s1.add(new Day(10, 06, 2007), 139.6);
//		s1.add(new Day(11, 06, 2007), 142.9);
//		s1.add(new Day(12, 06, 2007), 138.7);
//		s1.add(new Day(14, 06, 2007), 137.3);
//		s1.add(new Day(15, 06, 2007), 143.9);
//		s1.add(new Day(16, 06, 2007), 139.8);
//		s1.add(new Day(17, 06, 2007), 137.0);
//		s1.add(new Day(18, 06, 2007), 132.8);
//		s1.add(new Day(19, 06, 2007), 181.8);
//		s1.add(new Day(20, 06, 2007), 167.3);
//		s1.add(new Day(21, 06, 2007), 153.8);
//		s1.add(new Day(22, 06, 2007), 167.6);
//		s1.add(new Day(23, 06, 2007), 158.8);
//		s1.add(new Day(24, 06, 2007), 148.3);
//		s1.add(new Day(25, 06, 2007), 153.9);
//		s1.add(new Day(26, 06, 2007), 142.7);
//		s1.add(new Day(27, 06, 2007), 123.2);
//		s1.add(new Day(28, 06, 2007), 131.8);
//		s1.add(new Day(29, 06, 2007), 139.6);
//		s1.add(new Day(30, 06, 2007), 142.9);

		TimeSeriesCollection dataset = new TimeSeriesCollection();
		dataset.addSeries(s1);

		dataset.setDomainIsPointsInTime(true);

		return dataset;

	}

	/**
	 * Creates a panel for the demo (used by SuperDemo.java).
	 * 
	 * @return A panel.
	 */
	public static JPanel createDemoPanel() {
		JFreeChart chart = createChart(createDataset());
		return new ChartPanel(chart);
	}

	/**
	 * Starting point for the demonstration application.
	 * 
	 * @param args
	 *            ignored.
	 */
	static java.util.Vector getDateDataforGraph(int ArtNr, ChartEventAdmin cea) {
		java.util.Vector<Event> result = new java.util.Vector<Event>();
		int o = -1;
		Event e = null;
//		String datetmp = null;
//		Event prevEvent = null;
		java.util.Vector tmp = cea.getVData();// tmp bekommt vektor
		for (int i = 0; i < tmp.size(); i++) {
			e = (Event) tmp.get(i); // event e an der stelle im Vektor
			if (e.getANr() == ArtNr) { // abfrage ob artnr passt
				if (result.size()!=0
						&& result.get(o).getDFormat().equals(e.getDFormat())) {
					result.set(o, e);
				} else {
					result.add(e);
					o++;
				}
			}
		}
		return result;

	}
	public void generateGraphData(int ArtNr){
		
	}

	public static void main(String[] args) {
		IO.println(cea.getArtName(999));
		java.util.Vector jojo = getDateDataforGraph(999, cea);
		for (int i = 0; i < jojo.size(); i++) {
			IO.println(((Event) jojo.elementAt(i)).toString2());
			
		}
		TimeSeriesChartDemo1 demo = new TimeSeriesChartDemo1(
				"Lagerhisorie für "+cea.getArtName(999));
		demo.pack();
		RefineryUtilities.centerFrameOnScreen(demo);
		demo.setVisible(true);

	}
```

also wichtig ist nur der punkt an der stelle s1.add(new day(),); wie bekomme ich da meinen String rein ?? 

Bitte habt etwas nachsicht mit mir da ich im umgang der java api bzw allg. mit apis noch nicht so fitt bin 

besten dank 

grüße

head


----------



## SlaterB (2. Jul 2007)

selbst wenn es einen Konstruktor für String gäbe, was soll der denn alles verstehen?
"1.2.01"
"01:02/30001"
"January 2 01"
"1 Februar 01"
usw?

mehrdeutig, wirr, unverarbeitbar

da musst du schon selber genau den Tag, Monat und Jahr herauslesen,
z.B. mit SimpleDateFormat ein Date/ Calendar-Objekt erzeugen,
dort dann die Felder auslesen oder den Konstruktor


> Day(java.util.Date time)
> Constructs a new instance, based on a particular date/time and the default time zone.


verwenden

wenn du die API nicht magst kann ich dir noch das Lehrbuch empfehlen,
für dich programmieren werde ich es aber nicht 



http://www.galileocomputing.de/openbook/javainsel6/javainsel_10_008.htm#Xxx999912

Vorsicht bei all diesen Geschichten: Monate laufen gerne mal von 0 bis 11 statt 1 bis 12


----------



## headbanger (2. Jul 2007)

hey ertmal danke für die antwort 

programmieren brauchste mir auch nix ...  man will ja was lernen 

okay das mit dem dateformat muss ich mal testen ... ich dachte nur da im quelltext da schon angegeben ist wie das Format aussehen soll kann ich einfach mit meinen richtig formatierten strings arbeiten ..hmmm

ich habe mir jetzt noch das überlegt 
	
	
	
	





```
private static XYDataset createDataset() {

		TimeSeries s1 = new TimeSeries(cea.getArtName(999), Day.class);
		java.util.Vector Daten = getDateDataforGraph(999,cea);
		 Iterator iter = Daten.iterator();
		 
		 Day d= new Day();
		 while (iter.hasNext()){
			 
			 Event e = (Event)iter.next();
			 
			 Day.parseDay(e.getDFormat());
			 s1.add(d,e.getActAmount());
			 
			 
			 
		 }
```

aber leider schmiert mir das ganze ab ...Mit dieser meldung 

Exception in thread "main" org.jfree.data.general.SeriesException: You are attempting to add an observation for the time period 2-Juli-2007 but the series already contains an observation for that time period. Duplicates are not permitted.  Try using the addOrUpdate() method.

und da verstehe ich nicht was das soll ?? Bei jedem Durchgang meines Vectors habe ich ein neues Objekt welches mir ein neues Datum liefert wieso wird denn jetzt rumgemault da sei was doppelt  ???:L 

grüße

head


----------



## headbanger (2. Jul 2007)

lol fehler gefunden ich bin auch blöd ...

zeile 13 da muss natürlich stehen d=  :autsch: 

naja schön wenn man sich selber helfen kann 


besten dank 

grüße

head


----------



## headbanger (2. Jul 2007)

mist zu früh gefreut 

dreht  die x achse jetzt total am rad 

hier mal das bild 




und hier die daten wie sie im vector stehen 

objekt der begierde
2007.06.26|999|objekt der begierde|35
2007.06.28|999|objekt der begierde|50
2007.06.29|999|objekt der begierde|25

hmmm 

grüße

head


----------



## headbanger (3. Jul 2007)

okay noch mal ich  :lol: 

so es geht jetzt .. mein fehler war einfach das das datumsformat einfach falsch rum geschrieben war 

naja 

jetzt kann ich endlich ins bett ^^

tschö

head


----------

