Search code examples
javagraphicsjava-2dgraphics2d

Line2D decoration tips needed - Graphics2D


I have Line2D and Arc2D objects laid out on my JPanel by Graphics2D drawing. You can have a look a part of it on this question " How to make pixel perfect Line2D in - Graphics2D ". Now what I want to achieve is, I want to create two parallel lines and arcs for all Line2D and Arc2D objects. Visually,

Normal Line2D and Arc2D drawn currently,

enter image description here

Want to decorate it like this,

enter image description here

My Thoughts so far,

I might be able to achieve this by creating two different line and give an offset +gap and -gap from my normal line position. However This will make lots of objects which I don't want to.

Now, is it possible to make my normal line thicker like this,

enter image description here

and give them a border and delete middle bit from it?

Is it possible to achieve this? if yes, May I please have some direction.

Thank you for any kind of help.


Solution

  • Use a BasicStroke and draw it twice, thicker and thinner.

    One line drawn twice

    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)));
                }
            });
        }
    }