需要Line2D装饰技巧 – Graphics2D

我通过Graphics2D绘图在我的JPanel上放置了Line2D和Arc2D对象。 您可以在这个问题“ 如何使像素完美的Line2D – Graphics2D ”中看到它的一部分。 现在我想要实现的是,我想为所有Line2D和Arc2D对象创建两条平行线和弧。 在视觉上,

目前正常绘制Line2D和Arc2D,

在此处输入图像描述

想要像这样装饰它,

在此处输入图像描述

到目前为止我的想法,

我或许可以通过创建两条不同的线并从我的法线位置给出偏移+间隙和-gap来实现这一点。 然而,这将产生许多我不想要的对象。

现在,是否有可能使我的正常线条像这样厚,

在此处输入图像描述

并给它们一个边框并从中删除中间位?

是否有可能实现这一目标? 如果有,我可以请一些指示。

谢谢你的帮助。

使用BasicStroke并绘制两次,更厚更薄。

一行画了两次

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

您可以实现Stroke接口来创建CompositeStroke ,如此处所示。

在此处输入图像描述

 import java.awt.*; import java.awt.image.*; import java.awt.geom.*; import javax.swing.*; /** * @see http://www.jhlabs.com/java/java2d/strokes/ * @see http://stackoverflow.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); } }); } }