Search code examples
javajava-2d

Can't draw thin lines with Java2D


I'm trying to draw a polygon with a stroke of 1 pixel. Because the entire polygon is scaled by 100, I set the line width to 0.01. For some reason though, the polygon gets drawn with an on-screen line width of what looks to be 100 pixels instead of 1.

I'm using GeneralPath as the polygon shape. Thin lines do get drawn if I use the same approach for drawing Line2D shapes.

g2d.scale(100, 100);
g2d.setStroke(new BasicStroke(0.01f));
g2d.draw(theShape);

New info: If I remove the setStroke line I correctly get a 2 pixel line, since a BasicStroke of 0.02f was set on the Graphics2D object earlier.

This is the real setStroke line

g.setStroke(new BasicStroke((float) (1f / getRoot().scaleX)));

Solution

  • The following code produces the output show below. You must have an error elsewhere in your code. Perhaps another call to scale that you have omitted in your question:

    import java.awt.*;
    
    public class FrameTest {
        public static void main(String[] args) throws InterruptedException {
    
            JFrame f = new JFrame("Demo");
            f.getContentPane().setLayout(new BorderLayout());    
            f.add(new JComponent() {
                public void paintComponent(Graphics g) { 
                    Graphics2D g2d = (Graphics2D) g;
    
                    GeneralPath theShape = new GeneralPath();
                    theShape.moveTo(0, 0);
                    theShape.lineTo(2, 1);
                    theShape.lineTo(1, 0);
                    theShape.closePath();
    
                    g2d.scale(100, 100);
                    g2d.setStroke(new BasicStroke(0.01f));
                    g2d.draw(theShape);
                }
            });
    
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(300, 300);
            f.setVisible(true);
        }
    }
    

    enter image description here