package swing;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import org.apache.batik.anim.dom.SVGDOMImplementation;
import org.apache.batik.svggen.SVGGraphics2D;
import org.apache.batik.swing.JSVGCanvas;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Element;
import org.w3c.dom.svg.SVGDocument;
public class SvgPaint extends JFrame {
private final List<Rectangle> rectangles = new ArrayList<>();
private JSVGCanvas canvas = null;
public SvgPaint() {
this.canvas = new JSVGCanvas();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
final GridBagLayout layout = new GridBagLayout();
getContentPane().setLayout(layout);
final JButton buttonSave = new JButton("Speichern");
buttonSave.addActionListener(e -> drawPoints(false));
final GridBagConstraints gridBagConstraintsButton = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0);
getContentPane().add(buttonSave, gridBagConstraintsButton);
final GridBagConstraints gridBagConstraintsSVG = new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0);
getContentPane().add(this.canvas, gridBagConstraintsSVG);
this.canvas.addMouseListener(new MouseAdapter() {
private int startX = -1;
private int startY = -1;
@Override
public void mousePressed(MouseEvent e) {
this.startX = e.getX();
this.startY = e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
int intX = e.getX();
int intY = e.getY();
int intWidth = intX - this.startX;
if (intX < this.startX) {
intWidth = -1 * intWidth;
final int intTemp = intX;
intX = this.startX;
this.startX = intTemp;
}
int intHeight = intY - this.startY;
if (intY < this.startY) {
intHeight = -1 * intHeight;
final int intTemp = intY;
intY = this.startY;
this.startY = intTemp;
}
final Rectangle rect = new Rectangle(this.startX, this.startY,
intWidth, intHeight);
SvgPaint.this.rectangles.add(rect);
drawPoints(true);
}
});
}
private void drawPoints(boolean drawOrSave) {
final DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
final String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
final SVGDocument doc = (SVGDocument) impl.createDocument(svgNS, "svg", null);
final SVGGraphics2D g = new SVGGraphics2D(doc);
for (final Rectangle rectCurrent : this.rectangles) {
final Shape circle =
new Ellipse2D.Double(rectCurrent.x, rectCurrent.y, rectCurrent.width, rectCurrent.height);
g.setPaint(Color.red);
g.draw(circle);
}
if (drawOrSave == true) {
final Element root = doc.getDocumentElement();
g.getRoot(root);
this.canvas.setSVGDocument(doc);
} else {
try (FileWriter fileWriter = new FileWriter("test.svg")) {
g.stream(fileWriter, false);
} catch (final IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
final SvgPaint form = new SvgPaint();
form.pack();
form.setVisible(true);
}
}