Подтвердить что ты не робот

Рисование пунктирной линии в java

Моя проблема в том, что я хочу нарисовать пунктирную линию на панели, я могу это сделать, но она также рисует мою границу пунктирной линией, о которой я богу!

Может кто-нибудь объяснить, почему? Я использую paintComponent для рисования и рисования прямо на панели

это код для рисования пунктирной линии:

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);
    }
4b9b3361

Ответ 1

Вы изменяете экземпляр Graphics, переданный в paintComponent(), который также используется для рисования границ.

Вместо этого сделайте копию экземпляра Graphics и используйте это, чтобы сделать свой рисунок:

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

Ответ 2

Вы изменили контекст графики, установив штрих, а последующие методы, такие как paintBorder(), используют один и тот же контекст и таким образом наследуют все сделанные вами изменения.

Решение: клонировать контекст, использовать его для рисования и уничтожать его впоследствии.

Код:

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

Ответ 3

Другая возможность - сохранить значения, используемые в swap-локальных переменных (Ex. Color, Stroke и т.д.) и вернуть их в графическую оболочку.

что-то вроде:

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

// your drawings stuff

g.setColor(original);

это будет работать для любых изменений, которые вы решите сделать с графикой.