rombo poligono example ejemplos ejemplo drawline dibujar java graphics java-2d graphics2d

java - poligono - Consejos de decoración Line2D necesarios-Graphics2D



java graphics2d example (2)

Tengo objetos Line2D y Arc2D dispuestos en mi JPanel mediante el dibujo Graphics2D. Puede ver una parte de esto en esta pregunta " Cómo hacer que Pixel sea perfecto Line2D en - Graphics2D ". Ahora lo que quiero lograr es, quiero crear dos líneas paralelas y arcos para todos los objetos Line2D y Arc2D. Visualmente,

Normal Line2D y Arc2D dibujados actualmente,

Quieres decorarlo así,

Mis pensamientos hasta ahora,

Podría ser capaz de lograr esto creando dos líneas diferentes y dar una brecha compensada + y un salto desde mi posición de línea normal. Sin embargo, esto hará muchos objetos que no quiero.

Ahora, ¿es posible hacer que mi línea normal sea más gruesa así,

y darles un borde y eliminar un poco del medio?

¿Es posible lograr esto? en caso afirmativo, me gustaría tener alguna dirección.

Gracias por cualquier tipo de ayuda.


Puede implementar la interfaz de Stroke para crear un Stroke CompositeStroke , como se muestra aquí .

import java.awt.*; import java.awt.image.*; import java.awt.geom.*; import javax.swing.*; /** * @see http://www.jhlabs.com/java/java2d/strokes/ * @see http://.com/questions/7342979 */ class StrokeTest { private static final int SIZE = 200; private static final double PAD = 20d; private static class CompositeStroke implements Stroke { private Stroke stroke1, stroke2; public CompositeStroke(Stroke stroke1, Stroke stroke2) { this.stroke1 = stroke1; this.stroke2 = stroke2; } @Override public Shape createStrokedShape(Shape shape) { return stroke2.createStrokedShape( stroke1.createStrokedShape(shape)); } } public static void main(String[] args) throws Exception { final BufferedImage bi = new BufferedImage( SIZE, SIZE, BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); g.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); Arc2D.Double shape = new Arc2D.Double(PAD, 2 * PAD, (SIZE - 2 * PAD), (SIZE - 2 * PAD), 0, 180d, Arc2D.OPEN); g.setColor(Color.white); g.fillRect(0, 0, SIZE, SIZE); BasicStroke s1 = new BasicStroke(16f); BasicStroke s2 = new BasicStroke(1f); g.setStroke(new CompositeStroke(s1, s2)); g.setColor(Color.black); g.draw(shape); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new JLabel(new ImageIcon(bi))); f.pack(); f.setVisible(true); } }); } }


Use un BasicStroke y dibuje dos veces, más grueso y más delgado.

import java.awt.*; import java.awt.image.*; import java.awt.geom.*; import javax.swing.*; import javax.imageio.ImageIO; import java.io.File; class PaintThick { public static void main(String[] args) throws Exception { int size = 150; final BufferedImage bi = new BufferedImage( size,size,BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); double pad = 20; Line2D.Double line1 = new Line2D.Double( pad,pad,(double)(size-pad),(double)(size-pad)); int cap = BasicStroke.CAP_BUTT; int join = BasicStroke.JOIN_MITER; BasicStroke thick = new BasicStroke(15,cap,join); BasicStroke thinner = new BasicStroke(13,cap,join); g.setColor(Color.WHITE); g.fillRect(0,0,size,size); g.setColor(Color.BLACK); g.setStroke(thick); g.draw(line1); g.setColor(Color.WHITE); g.setStroke(thinner); g.draw(line1); ImageIO.write(bi,"png",new File("img.png")); SwingUtilities.invokeLater(new Runnable() { public void run() { JOptionPane.showMessageDialog( null, new JLabel(new ImageIcon(bi))); } }); } }