My problem is that I want to draw a dashed line in a panel, I'm able to do it but it draw my border in dashed line as well, which is oh my god!
Can someone please explain why? I'm using paintComponent to draw and draw straight to the panel
this is the code to draw 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);
}
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){
//creates 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);
g2d.drawLine(x1, y1, x2, y2);
//gets rid of the copy
g2d.dispose();
}
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();
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.