# SVG & Servlets



## leftover-crack (8. Jun 2006)

Hi all,
hätte da mal ne Frage an euch.
Bin gerade dabei ein kleinen "Terminkalender" zu programmieren. Diesen will ich in grafischer Form mit hilfe von SVG darstellen.
Die Größe des Kalenders  legt ein Start- und Enddatum fest das ich dem Servlet in der URL übergebe.
(das Servlet zeichnet dann das SVG...).
Desweiteren übergebe ich dem Servlet noch verschiedene Ereignisse die es in den Kalender eintragen soll....
zB. "Urlaub" mit start und enddatum und sonstige Termine...


```
// Ereignisse die in den Kalender eingetragen werden soll
String[] terminname = request.getParameter("termin").split(";"); 

// Start der Ereignisse
String[] terminStart = request.getParameter("tStart").split(";");

// Ende der Ereignisse
String[] terminEnde = request.getParameter("tEnde").split(";");


// Diese Werte begrenzen die größe des Kalenders.... 
String dateStart = request.getParameter("dateStart");
String dateEnd = request.getParameter("dateEnd");
```

Bis jetzt kann ich leider nur Zeitspannen von 2 Jahren abdecken... 
Habe einfach nur ermittelt ob der Zeitraum über zwei Jahre hinaus geht und habe dann den Kalender als 2 volle Jahre dargestellt .  
Wenn die start und enddaten z.B wie folgende sind.. startdatum = 01.05.06 enddatum = 01.07.06 
dann habe ich einfach ein SVG gezeichnet mit der width 365 und habe nach jeden monat nen Senkrechten Balken nach unten gezogen...  usw... um die Monate voneinander zu trennen.
Bei zwei Jahren ging das dann mit der gleichen Methode...
Die Ereignisse habe ich auch mehr oder weniger eingezeichnet bekommen... aber naja insgesammt bin ich auf die Lösung nich wirklich stolz...
Is blöd jetzt jeden Einzelheit zu beschreiben... deshalb könnt ihr euch ja einfach mal das Bild anschauen. Ich denke dann wird das etwas verständlicher ;D.







Habt ihr irgendwelche Tipps wie ich das anders lösen könnte? 
Hab schon so viel Probiert aber irgendwie hängts dann doch immer wieder ;D. 
Wäre echt nett wenn ihr mir da tipps geben könnten was ich noch ausprobieren kann.


----------



## leftover-crack (8. Jun 2006)

Falls ihr bei dem Bild nur ein Werbebanner seht... klickt auf diesen Link.
http://www.funpic.de/bilder/fotoalben/big/3/33/332191/284365d57a28cc27e261cb0f176e9aa4.jpg

Weis auch nicht warum aber werde da manchmal auf so ne andere Seite umgeleitet und man sieht nur nen Banner...
Wenn ich den Link in die Adresszeile kopiert habe, hat es aber bis jetzt immer funktioniert...
Also falls ihr nur nen Banner seht... einfach in ein neues Fenster einfügen und dann sollte es gehen...


----------



## AlArenal (8. Jun 2006)

leftover-crack hat gesagt.:
			
		

> falls ihr bei dem Bild nur ein werbebanner seht... klickt auf diesen link
> http://www.funpic.de/bilder/fotoalben/big/3/33/332191/284365d57a28cc27e261cb0f176e9aa4.jpg



Klasse, noch 2x dasgleiche Banner


----------



## leftover-crack (8. Jun 2006)

AlArenal hat gesagt.:
			
		

> leftover-crack hat gesagt.:
> 
> 
> 
> ...



Ja sorry habs gerade bemerkt das sich das nicht wirklich geändert hat *rotwerd*... hmm ich glaube ich lade das nochmal neu hoch...


----------



## leftover-crack (8. Jun 2006)

http://www.matthias-online.us.ms/beispielkal.JPG


----------



## AlArenal (9. Jun 2006)

Bin noch etwas schlaftrunken, aber... wie lautet nun die Frage?


----------



## leftover-crack (9. Jun 2006)

Im prinzip brauche ich nur eine Idee wie ich anhand einem Anfangs und Enddaten ein Kalender Aufbauen kann. Das ganze muss hallt vom so aufgebaut sein das ich inerhalb dieser Übersicht Termine einfügen kann...
Alsomüsste  im prinzip wie ne art Koordinatensystem aufgebaut sein.
Ne idee war z.B. jeden Tag einzeln zu zeichnen in der Schleife und das startdatum immer um einen Tag zu erhöhen bis es gleich dem Enddatum ist... so hätte ich dann schonmal das Grundgerüst...
Das problem hierbei wäre das ich im nachhinein nicht mehr genau ausmachen könnte wo welcher Tag ist... und auch die Farbliche abhebungen der Monate würde nicht mehr funktionieren....  Und hier liegt der Hund begraben. Habe irgendwie keine Ideen mehr wie ich das so hinbekomme das alles immer an die Richtige stelle gezeichnet wird... wie ich die verschiedenen Monate voneinander trennen kann... usw.
Die einzige funktionierende Möglichkeit die ich wie gesagt bis jetzt hatte war immer nur Komplette jahre zu zeichnen mit der breite 365 . Somit konnte ich hallt immer genau sagen wo was hin muss... Aber naja damit bin ich relativ unzufrieden...
Mir fehlt hallt irgendwie der logische Ansatz wie das zu realisieren ist...  :cry: 
Kenne mich auch leider mit der Calendar Klasse nich wirklich aus und hab keine Ahnung was da so alles möglich ist.
Daran könnte es auch liegen das mir nichts mehr ein fällt.
Ausprogrammieren sollte nicht die Schwierigkeit sein... Brauche nur ne nen Logischen Ansatz... .
Bin dankbar um jeden Tipp :roll:


----------



## AlArenal (9. Jun 2006)

Die Lösung lautet MVC 

In bester alter Speghetti-Manier in irgendwelchen Schleifen was zu berechnen und direkt zu zeichnen (Berechnung der Datern am besten noch in der Zeichenroutine) bringt dich nicht weiter, weil sämtliche Informationen über das Gezeichnete nach dem Zeichnen im Grunde futsch sind.

Was du also brauchst ist ein Datenmodell (Model). Da hinein packst du deine Termine. Dann brauchst du einen View, der aus den Daten im Model eine Anzeige (deine SVG-Ausgabe) generiert. Dazu muss er einige Randbedingungen wissen (Start-, Enddatum). Evtl. macht im View der Einsatz von Renderern Sinn, die gewisse logische Bestandteile der SVG-Generierung kapseln (Anzeige von Tagen, Terminen, Monaten, ...). Randbedingungen kämen dann vom Controller.


----------



## leftover-crack (9. Jun 2006)

Ja das ist egal ob nach dem Zeichnen alle Daten verlohren sind. Es geht nur um die einmalige Zeichnung des Kalenders mit den mitgegebenen Daten. Wenn das Servlet neu gestartet wird, soll es wieder bei 0 loslegen. Habe auch nicht den Anspruch das irgendwie zu speichern... Höchstens das gezeichnete SVG als JPG... aber ansonsten soll sogar nichts gespeichert werden

Habe bereits ein Datenmodell mit indem man verschiedene Termine aus einer Tabelle auswählen kann... und in Input Feldern das Start und Enddatum ausgewählt werden... via Button wird dann die URL zu meinem Servlet aufgerufen das die selektierten Daten übergibt.

Das Zeichnen des SVG's übernimmt das Servlet... es hat auch alle benötigten Daten... Das Problem liegt ist das mir die Idee fehlt wie ich die Zeichnung verwirklichen kann... Wie ich das Bild aufbaue... 
Könnte vielleicht für jeden Monat eine integer variable machen z.B. Jan mit dem Wert 31. Feb mit dem Wert 28 usw.
dann könnte ich ja irgendwie versuchend ie Zeitspanne zwischen start und enddatum herauszufinden und die ganzen int werte zusammen rechnen... dann wüsste ich schonmal wie groß das fenster ist... wenn jetzt das startdatum der 18.jan ist dann ziehe ich hallt 18 Tage von 31 ab... somit könnte ich dann zumindest genau bestimmenw o meine werte hin sollen.
und ich wüsste auch wo ich die linien setze um die monate voneinander zu trennen.
Dazu müsste ich aber irgendwie schaffen die anzahl der MOnate die zwischen Start und Enddatum liegen heraus zu finden... hmmm wär ne möglichkeit aber das wäre n ziemlich großer aufwand und auch nicht so schön...


----------



## AlArenal (9. Jun 2006)

Die Daten gehen nicht verloren, wenn du alles durchdacht aufbaust. Wenn ich in einer JTable klicke, bekomme ich ja auch raus, auf welches Daten-Objekt ich geklickt habe.

Oder nehmen wir mal etwas aus meinem Arbeitsalltag: 
Eine Arbeitsfläche in der man Graphen darstellen kann, z.B. einen Workflow oder ein UML-Diagramm. Die Anzeige ist der View, die die Objekte im View stehen in einem Model und über entsprechende Methoden ist es immer möglich für eine beliebige Koordinate im View rauszufinden, was da für ein Objekte (oder mehrere Objekte) im Model stehen.... Aus Sicht des Views sind diese Objekte in seinem Model. Sie sind aber mglw. nur eine visuelle Repräsentation meiner eigentlichen Daten-Objekte, die nicht denen im Graph-Model entsprechen müssen.

Stelle ich im View z.B. ein Auto dar, habe ich vielleicht eine Klasse AutoNode im Model des View. AutoNode ist aber keine Repräsentation eines Autos, für das ich noch irgendwo die Klasse Auto habe...

Dabei haben die Koordinaten der AutoNode im Model nur indirekt etwas mit denen im View zu tun, weil der View skalieren kann und beim zeichnen entsprechend umrechnet. Eine solche Skalierung brauchst du ja für deinen Kram auch. Da musst du etwas Gehirnschmalz in die Abstrahierung investieren. Wenn AutoNode (wie jedes Objekt in dem Model) eine eigene #paint Methode hat, musst du zur Darstellung nur alle Objekte im Model durchlaufen, checken ob die Koordinaten im darstellenbaren Bereich liegen und sie von hinten nach vorne zeichnen lassen...

Vielleicht solltest du dir mal den internen Aufbau einer Graph-Lib anschauen. Ich schätze JGraph dürfte recht ähnlich funktionieren (ich selbst arbeite mit einem kommerzeillen Konkurrenzprodukt).. oder prefuse, dass sehr sehr clever designt ist.


----------

