web-dev-qa-db-fra.com

Dessiner une ligne pointillée en java

Mon problème est que je veux dessiner une ligne pointillée dans un panneau, je peux le faire mais ça dessine aussi ma bordure en ligne pointillée, ce qui est oh mon dieu!

Quelqu'un peut-il expliquer pourquoi? J'utilise paintComponent pour dessiner et dessiner directement sur le panneau

c'est le code pour tracer la ligne pointillée:

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);
    }
23
Trung Bún

Vous modifiez l'instance Graphics passée dans paintComponent(), qui est également utilisée pour peindre les bordures.

À la place, faites une copie de l'instance Graphics et utilisez-la pour faire votre dessin:

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

Une autre possibilité serait de stocker les valeurs utilisées dans les variables locales de swap (Ex. Color, Stroke etc ...) et de les remettre sur le Graphics en cours d'utilisation.

quelque chose comme :

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

// your drawings stuff

g.setColor(original);

cela fonctionnera pour tous les changements que vous décidez d'apporter aux graphiques.

2
Mário de Sá Vera

Vous avez modifié le contexte graphique en définissant un trait, et les méthodes suivantes telles que paintBorder() utilisent le même contexte et héritent ainsi de toutes les modifications que vous avez apportées.

Solution: clonez le contexte, utilisez-le pour peindre et jetez-le ensuite.

Code:

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