简体   繁体   中英

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 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){

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

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM