# svg Icon für Button (Batik Problem?)



## sibianu (18. Mrz 2010)

Hallo,
ich habe eine Klasse gefunden zum Laden von svg-Icons um die dann für einen Button zu benutzen. Bei mir funktioniert das wunderbar, auch wenn ich alles von einem Netz-Laufwerk starte. Auf alle anderen Rechner werden die Icons nicht richtig geladen. Ich sehe nur ein durchgerissenes Bild, so als wurden die Icons nicht richtig geladen. Ich sehe allerdings, dass meine Bilder doch teilweise vorhanden sind; man sieht irgendwie nur eine Schicht des svg-Bildes überlappt mit dem durchgerissene Bild. Ich habe mir extra einen LoaderListener eingebaut um zu schauen ob die Bilder complete geladen werden, das ist immer der Fall. 
hier ist mein Code, ich bin für jede Idee dankbar woran das liegen kann, da ich mit Batik kaum was zu tun hatte bis jetzt.

```
public class SvgBatikResizableIcon extends JSVGComponent implements ResizableIcon {
  
  private AffineTransform originalTransform;

  public boolean isLoaded;

  private Dimension initialDim;

  public SvgBatikResizableIcon(final URL location, final Dimension initialDim) {
    super(null, false, false);
    this.initialDim = initialDim;
    this.isLoaded = false;
    this.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() {
      public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
        originalTransform = getRenderingTransform();
        Dimension2D fileContentsDim = getSVGDocumentSize();
        double coef = initialDim.getWidth()
        / fileContentsDim.getWidth();
        AffineTransform at = AffineTransform.getScaleInstance(coef,
            coef);
        setSize(initialDim);
        if (at != null) {
          at.concatenate(originalTransform);
          setRenderingTransform(at, true);
          isLoaded = true;
          if (getParent() != null) {
            getParent().doLayout();
            getParent().repaint();
          }
        }
      }
    });
    this.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() {
      public void documentLoadingStarted(SVGDocumentLoaderEvent e) {
        if (e.getSVGDocument() != null)
          System.out.println(e.getSVGDocument().getURL() + " loading started");
    }
    public void documentLoadingCompleted(SVGDocumentLoaderEvent e) {
      if (e.getSVGDocument() != null)
        System.out.println(e.getSVGDocument().getURL() + " loading complete");
    }
});

    this.loadSVGDocument(location.toString());
    this.setOpaque(false);
    // Apparently the JGVTComponent doesn't respect the
    // opacity in paintComponent.
    this.setBackground(new Color(0x0, true));
  }

  public void revertToOriginalDimension() {
    this.setDimension(this.initialDim);
  }

  public void setDimension(Dimension dim) {
    if (!isLoaded)
      return;
    setSize(dim);
    Dimension2D fileContentsDim = getSVGDocumentSize();
    double coef = dim.getWidth() / fileContentsDim.getWidth();
    AffineTransform at = AffineTransform.getScaleInstance(coef, coef);
    if (at != null) {
      at.concatenate(originalTransform);
      setRenderingTransform(at);
    }
  }

  public void setHeight(int height) {
    this.setDimension(new Dimension(height, height));
  }

  public void setWidth(int width) {
    this.setDimension(new Dimension(width, width));
  }

  public void paintIcon(Component c, Graphics g, int x, int y) {
    if (!isLoaded)
      return;
    Graphics2D graphics = (Graphics2D) g.create();
    //graphics.setTransform(AffineTransform.getTranslateInstance(-x, -y));
    this.paintComponent(graphics);
    graphics.dispose();
  }

  @Override
  public void paint(Graphics g) {
    super.paint(g);
  }

  public int getIconHeight() {
    if (!isLoaded)
      return this.initialDim.height;
    return this.getSize().height;
  }

  public int getIconWidth() {
    if (!isLoaded)
      return this.initialDim.width;
    return this.getSize().width;
  }

}
```

uns do würde ich das ganze benutzen dann:


```
File file3 = new File("N://...//Tuer2.svg");
  SvgBatikResizableIcon icon3 = new SvgBatikResizableIcon(file3.toURI().toURL(), new Dimension(60, 60));

  ButExit.setMaximumSize(new Dimension(64, 64));
  ButExit.setMinimumSize(new Dimension(64, 64));
  ButExit.setPreferredSize(new Dimension(64, 64));
  ButExit.setIcon(icon3);
```

Danke im voraus,
sibianu


----------



## sibianu (19. Mrz 2010)

Niemand eine Ahnung?


----------



## el_wuha (9. Apr 2010)

Hi sibinau,

wie ich sehe nutzt du die Batik-Klasse. Aktuell arbeite ich an einem CGM & SVG-Editor, bei welchem ich die gleichen Probleme hatte.

Kurz umrissen: Eingebettete Bilder in SVG-Grafiken wurden auf einigen Computern dargestellt, auf anderen wiederum nicht. Teilweise glich es auch eher einem Glücksspiel ob es überhaupt dargestellt wurde ;-)

Meine bisher erfolgreichen Lösungen:

1. Fang den DOM ab und lies das image-tag aus. Sind die Breiten und Längenattribute größer 1000px kommt es zu den besagten Fehlern. Nachdem ich eine Routine einbaute, die Bilder größer 1000px verkleinert und neu-einbettet kommt es zu keinerlei Ausfällen mehr.

2. Sofern du mit Eclipse arbeitest solltest du das Projekt vor deinen Tests kompilieren. Batik braucht zeitweise viel Speicher und jagt die Maschine gut hoch. Mit den richtigen Startparametern lässt sich hier ebenfalls ne Menge rausholen.

Fazit:
Dank dieser zwei kleinen Workarounds durchliefen bisher knapp 600 Dateien, mit meist eingebetteten TIFF-Dateien weit über 2000px, ohne Probleme 

LG


----------



## sibianu (19. Mai 2010)

Ok, etwas spät aber lieber später als nie. 

Danke für die Antwort, das Problem lag aber bei mir woanders. Die erstellten svg-Dateien hatten bei mir noch einen Link auf die echte Datei (z.B. gif). Lokal wurden diese Dateien natürlich gefunden, auf andere Rechner bekam ich halt exceptions weil die Dateien nicht gefunden werden und dadurch wurden die Bilder nicht vollständig geladen.  Das Problem war gelöst, nachdem ich die originalen Bilder in die svg eingebettet habe.
Mein Fehler, hatte bis dahin nichts mit Erstellen von SVGs zu tun.


----------

