# svg- Bild



## MQue (28. Jun 2007)

Hallo,

ich habe auf meinem Panel ein *.svg- Bild platziert und zwar so: 


```
myPanel = new JSVGCanvas();                                                   
             myPanel.setLayout(null);
             myPanel.setBounds(states.elementAt(i).getxPosition(), states.elementAt(i).getyPosition(), 700, 600);
             myPanel.setBorder(states.elementAt(i).getBorder());		                              
                
           
etwas später:
File f = new File(System.getProperty("user.dir") + "\\pics\\bild.svg");                  
myPanel.setURI(f.toURL().toString());    // hier gebe ich das *.svg- Bild auf das Panel von oben
```


Mein Probelm ist jetzt, dass das *.svg- Bild, wennich meinen JFrame größer mache, sich auch mitverschiebt, d.h. es wird größer oder kleiner.

Was könnte ich da machen, ich möchte, dass das Bild an der linken oberen Ecke fixiert ist und wenn man den JFrame kleiner macht dann soll man eben nicht mehr das ganze Bild sehen.


Vielleicht hat da jemand eine Idee.

lg
Michl


----------



## HoaX (28. Jun 2007)

einen passenden layoutmanager verwenden


----------



## MQue (29. Jun 2007)

vielen dank!!


----------



## MQue (2. Jul 2007)

Hallo,


ist es möglich, auf einem JSVGCanvas- Panel ein *.gif oder ein *.jpeg- Image darzustellen?
ich finde keine Methode: mit setURI() gehts nicht und mit add() auch nicht.


Wäre euch für Tipps sehr dankbar.


----------



## The_S (2. Jul 2007)

Nochmal, ein JSVGCanvas ist keine Standardklasse! Wenn du keine Standardklasse verwendest immer die Lib + API Doku mit angeben. Alleine vom Namen her würde ich aber zu "Nein" tendieren, heißt ja nicht JSVGJPGGIFCanvas  . Aber du kannst solche Bilder doch ganz einfach mit normalen Swing darstellen  .


----------



## MQue (2. Jul 2007)

Ja ich kanns mit Swing darstellen, aber ich habe eine Datei in der die Pfade drinnenstehen:

wenn endsWith(.gif) -> das gif- Bild auf einem Panel anzeigen
wenn endsWith(.svg) -> das svg- Bild auf einem Panel anzeigen 

Mein Problem ist mom. dass ich alles mit svg- Bilder gemacht habe (alse JSVGCanvas) und jetzt eben auch gif- Bilder darstellen will.

D.h. also, dass ich in Abhängigkeit von dem darzustellendem Bild entweder ein JPanel oder ein JSVGCanvas erzeugen muss?

JSVGCanvas -> import org.apache.batik.swing.JSVGCanvas;

lg und danke

Michl


----------



## The_S (2. Jul 2007)

Ja, abhängig von der Datei was anderes verwenden. Aber warum suchst du dir nicht einfach eine lib, die SVG-Bilder z. B. in einem BufferedImage darstellen kann? Sollte einfacher sein.

JSVGCanvas -> import org.apache.batik.swing.JSVGCanvas; 

Dadurch lässt sich nach wie vor noch lange nicht die verwendete Bibliothek erschließen :roll:


----------



## Murray (2. Jul 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Dadurch lässt sich nach wie vor noch lange nicht die verwendete Bibliothek erschließen :roll:



Offensichtlich ist es Batik...

Wenn du "ausnahmsweise" anstelle einer SVG-Datei mal eine Rastergrafik ausgeben willst, dann könntest du eventuell eine SVG-Datei mit einem image-Element erzeugen. Je nach API der Komponente kann das sicher auch ohne eine echte Datei einfach "im-memory" passieren.

Natürlich fängt man sich ziemlichen Memory- und Performance-Overhead ein, wenn man zur Anzeige einer Rastergrafik den Batik-Viewer bemüht - wenn man abhängig von der gerade anzuzeigende Datei in der Oberfläche eine andere Komponente einhängt, ist das aber sicher auch nicht umsonst zu haben.


----------



## The_S (2. Jul 2007)

Murray hat gesagt.:
			
		

> Hobbit_Im_Blutrausch hat gesagt.:
> 
> 
> 
> ...



Für jemanden der noch nie damit gearbeitet hat ist das wohl nicht so offensichtlich. Ein kurzer link auf die entsprechende Doku würde es auch nicht-kennern von batik erlauben nach einer Lösung zu suchen  .


----------



## Murray (2. Jul 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Für jemanden der noch nie damit gearbeitet hat ist das wohl nicht so offensichtlich.


Das sollte keine Kritik sein.



> Ein kurzer link auf die entsprechende Doku würde es auch nicht-kennern von batik erlauben nach einer Lösung zu suchen  .



 :toll:


----------



## The_S (2. Jul 2007)

Hab ich auch nicht als solche aufgefasst. Schwerpunkt meiner Aussage sollte auf meinen 2. Satz liegen  .


----------



## MQue (2. Jul 2007)

http://xmlgraphics.apache.org/batik/javadoc/

Ich verwende eben JSVGCanvas als Panel und möchte jetzt, dass ich die Größe der svg- Datei angeben kann und das bild dann so groß bleibt.

Mit jSVGPanel.setRecenterOnResize(false); hab ich mal geschafft, dass das svg- Bild gleich größ bleibt aber ich möchte auch, dass ich die Größe des svg- bildes bestimmen kann, aber das bekomme ich nicht hin, die Methoden setSize() oder setBounds() reagieren irgendwie nicht.

Hat jemand eine Ahnung, wie ich das machen könnte?


vielen Dank.


lg


----------



## The_S (2. Jul 2007)

Na also, damit lässt sich doch arbeiten. So spontan beim drübergucken ist mir die Methode setMySize ins Auge gesprungen.


----------



## MQue (2. Jul 2007)

Ja, hab ich auch schon probiert mit myName.setMySize(new Dimension(200, 200));

Mein Problem ist aber, dass ich eben das JSVGCanvas- Panel habe und dieses Panel liegt in einem Borterlayout eines JFrames drinnen, das JSVGCanvas- Panel, passt sich also dem JFrame an und das *.svg- Bild passt sich dem JSVGCanvas- Panel an,

Ich bräuchte hingegen, dass sich das *.svg- Bild extra kontrollieren lässt (das *.scg- Bild soll immer gleich bleiben, das JSVGCanvas- Panel kann sich ja von mir aus ändern, aber das wird wahrscheinlich nicht so einfach sein?

Momentan kann ich die Größe des *svg- Bildes (bzw. des JSVGCanvas- Panels) nur über die Größe des JFrames kontrollieren.

Vielleicht hat da noch jemand eine Idee - wäre sehr dankbar dafür!!


----------



## The_S (2. Jul 2007)

Warum veränderst du nicht dann einfach die Größe des JSVGCanvas?


----------



## MQue (2. Jul 2007)

Das habe ich schon versucht, aber der JSVGCanvas liegt eben im JFrame drinnen und passt sich diesem an, das hilft das Ändern des JSVGCanvas gar nichts, leider.

Kann man das vielleicht irgendwie noch anders machen?


----------



## The_S (2. Jul 2007)

Das hängt nicht davon ab wo das JSVGPanel liegt, sondern einfach welchen Layoutmanager der Container verwendet in dem das JSVGPanel liegt (und ggf. noch wie dieser konfiguriert ist).


----------



## MQue (2. Jul 2007)

mainPanel = new JPanel(new BorderLayout());


das ist mein Panel, 
in dem kommen die JSVGCanvas- Panel rein,

gibts da eine Möglichkeit?


----------



## The_S (2. Jul 2007)

Ja, anderen Layoutmanager verwenden oder Layouts verschachteln. Ohne Screenshots oder genau angaben wies später mal aussehen soll, kann man da aber nicht viel sagen ...


----------



## MQue (2. Jul 2007)

Bei den JSVGCanvas Panels habe ich den Layout()- Manager "null" da ich dort eben verschiedenen Button und JTextFields anzeige und die Koordinaten von einer Datei einlese (Daher benötige ich das null- Layout)

Aber leider springt mir dadurch das Bild hin und her,

welcher Layout- Manager ermöglicht es eingentlich, dass man ein Bild an der linken oberen Ecke "anbindet" und das Bild auch konstant groß bleibt?


vielen Dank


----------



## The_S (2. Jul 2007)

Für komplexe Darstellungen würde ich an deiner Stelle das GridBagLayout oder wenn du es etwas einfacher haben möchtest das FormLayout von JGoodies oder das TableLayout empfehlen.

Ansonsten verschachteln!


----------



## MQue (2. Jul 2007)

beim GridBagLayout kann ich ja nicht hergehen und saben ich möchte einen JButton an der stelle x,y oder,
Geht das nicht irgendwie einfacher,
da muss ich ja jetzt mein ganzes Programm umschmeissen.

Und bezüglich dem anzeigen von *.gif auf JSVGCanvas, wie kann ich das realisieren,
 >>>lib, die SVG-Bilder z. B. in einem BufferedImage darstellen kann?<<< keine Ahnug, wo ich die lib herbekommen soll und wie ich das machen kann??
steh momentan voll auf dem Schlauch, bitte um Hilfe,


----------



## The_S (2. Jul 2007)

Deswegen verschachtelte Layout-Manager  .

ja, ich hab auch kA wo du so eine lib herbekommst, ich arbeite ja auch nicht damit. War ja mehr so als alternative gedacht.


----------



## MQue (2. Jul 2007)

das ändert auch nichts, das SVG- bild passt sich leider meinem JSVGCanvas- Panel an,

Weißt Du vielleicht, wie das funktionieren könnte, dass ich ein BufferedImage auf einem JSVGCanvas darstellen kann?


----------



## The_S (2. Jul 2007)

nnnnnngggggggggaaaahhhhhhhhhhh ... *sich ganz fest auf die Zunge beißt*

Das sich das Image dem JSVGCanvas anpasst wirste vermutlich nicht verhindern können. Aber du kannst doch die Größe des JSVGCanvas(es  ) anpassen ... reicht doch!


----------



## MQue (2. Jul 2007)

ja, hab scho nverstanden,

weißt du etwas, wie ich ein *.gif- Bild auf einem JSVGCanvas darstellen kann?

lg und vielen Dank für die Geduld


----------



## Murray (2. Jul 2007)

Michael1234 hat gesagt.:
			
		

> weißt du etwas, wie ich ein *.gif- Bild auf einem JSVGCanvas darstellen kann?



Wie schon vorgeschlagen: erzeuge ein SVG-Dokument, das nur ein image-Element mit einem Verweis auf die Grafikdatei enthält:

```
<image xlink:href="GIFBild.gif" />
```

Das könnte man über eine temporäer Datei machen; besser wäre es aber wohl, direkt die Dokumentenstruktur als DOM zu erzeugen und mit AbstractJSVGComponent#setDocument in den Canvas zu setzen


----------



## MQue (2. Jul 2007)

Kannst du mir das irgendwie noch genauer erklären,
steh ein bischen auf der Leitung, ich kann also AbstractJSVGComponent#setDocument eine*.gif- Datei auf einem JSVGCanvas darstallen,

Wie erstellt man das Dokument?
ich habe jetzt eine XML- Datei, aus der ich den Namen der svg- Datei auslese (z.B. batik.svg) und mit new File(...setUrl) wird die Datei geladen?

wie geht das mit der von dir beschriebenen Variante?


----------



## Murray (2. Jul 2007)

Bau die im ersten Schritt eine SVG-Datei mit einem image-Element, welches eine GIF-Datei einbindet. Jetzt musst du "nur noch" diese Datei dynamisch erzeugen, also im fxen Grundgerüst jeweils mit dem Namen der gerade anzuzeigenden  GIF-Datei einsetzen - eigentlich fertig.

Weil a) das Erzeugen von temporären Dateien aber Zeit kostet und b) die SVG-Datei dann ja gleich wieder eingelesen werden muss, wäre es effizienter, die SVG-"Datei" direkt als DOM-Struktur im Speicher zu erzeugen. Das kann aber der zweite Schritt sein, wenn es mit Dateien funktioniert.


----------



## HoaX (3. Jul 2007)

schau ins svg, da stehts. das element svg hat u.a. die attribute height und width die die größe angeben. außerdem könnte evtl noch die "viewbox" für dich interessant sein.


----------



## MQue (3. Jul 2007)

Ja, ich möchte aber ein "reines" gif oder jpeg auf das JSVGCanvas legen und finde aber nichts dazu,

keine Snhnug wie das gehen könnte.


----------



## Murray (3. Jul 2007)

Michael1234 hat gesagt.:
			
		

> Ja, ich möchte aber ein "reines" gif oder jpeg auf das JSVGCanvas legen und finde aber nichts dazu



Das geht ganz einfach nicht - der JSVGCanvas kann nur SVG-Grafiken anzeigen. Also verpackst du entweder die Rastergrafik in eine SVG-Grafik, oder du verwendest je nach Grafikformat eine andere Komponente. Evtl. könntest du auch durch Ableitung oder Komposition eine eigene Komponente schreiben, die beide APIs (setDocument und setImage) implementiert und dann unter der Haube entweder das eine oder das andere Image anzeigt.


----------



## HoaX (3. Jul 2007)

einfach n imagetag im svg erzeugen und gut is ...


----------



## MQue (4. Jul 2007)

was heißt das, ein Imagetag?


----------



## Murray (4. Jul 2007)

Michael1234 hat gesagt.:
			
		

> was heißt das, ein Imagetag?





			
				Murray hat gesagt.:
			
		

> ```
> <image xlink:href="GIFBild.gif" />
> ```


----------

