Trung Bún
Trung Bún

Reputation: 1147

Drawing dashed line in java

My problem is that I want to draw a dashed line in a panel. I'm able to do it, but it drew my border in a dashed line as well.

Can someone please explain why? I'm using paintComponent to draw and draw straight to the panel.

This is the code to draw a dashed line:

public void drawDashedLine(Graphics g, int x1, int y1, int x2, int y2){
        Graphics2D g2d = (Graphics2D) g;
        //float dash[] = {10.0f};
        Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0);
        g2d.setStroke(dashed);
        g2d.drawLine(x1, y1, x2, y2);
    }

Upvotes: 35

Views: 46731

Answers (3)

Kevin Workman
Kevin Workman

Reputation: 42176

You're modifying the Graphics instance passed into paintComponent(), which is also used to paint the borders.

Instead, make a copy of the Graphics instance and use that to do your drawing:

public void drawDashedLine(Graphics g, int x1, int y1, int x2, int y2){

  // Create a copy of the Graphics instance
  Graphics2D g2d = (Graphics2D) g.create();

  // Set the stroke of the copy, not the original 
  Stroke dashed = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
                                  0, new float[]{9}, 0);
  g2d.setStroke(dashed);

  // Draw to the copy
  g2d.drawLine(x1, y1, x2, y2);

  // Get rid of the copy
  g2d.dispose();
}

Upvotes: 49

Another possibility would be to store the values used in swap local variables (Ex. Color , Stroke etc...) and set them back to the on use Graphics.

something like :

Color original = g.getColor();
g.setColor( // your color //);

// your drawings stuff

g.setColor(original);

this will work for whatever change you decide to do to the Graphics.

Upvotes: 3

Peter Walser
Peter Walser

Reputation: 15706

You modified the graphics context by setting a stroke, and subsequent methods such as paintBorder() use the same context and thus inherit all modifications you made.

Solution: clone the context, use it for painting and dispose it afterwards.

Code:

// derive your own context  
Graphics2D g2d = (Graphics2D) g.create();
// use context for painting
...
// when done: dispose your context
g2d.dispose();

Upvotes: 2

Related Questions