Reputation: 1147
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
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
Reputation: 388
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
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