Comment puis-je dessiner quelque chose sur un jPanel qui ne sera pas repeint?

StackOverflow https://stackoverflow.com/questions/275778

  •  07-07-2019
  •  | 
  •  

Question

Comment puis-je dessiner quelque chose dans JPanel qui restera identique et ne sera pas repeint, je fais un programme de simulation de trafic et je veux que la route soit tracée une fois car elle ne changera pas. Merci

Était-ce utile?

La solution

Je ne suis pas sûr que vous souhaitiez réellement que votre route ne soit jamais repeinte - des événements de repeinte se déclenchent (par exemple) lorsque votre fenêtre est redimensionnée ou lorsqu'elle devient visible après une autre fenêtre qui l'obstrue. Si votre panneau ne repeint jamais, alors il aura l'air étrange.

Autant que je me souvienne, Swing déclenchera uniquement les événements de peinture appropriés dans ces circonstances. Vous devriez donc pouvoir utiliser la méthode habituelle de sous-classement de JPanel avec un remplacement approprié:

public class RoadPanel extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // your drawing code here
    }
}

Si vous cachez votre route dans une image ou dans un autre format graphique (pour enregistrer les données de calcul calculées plusieurs fois) une fois dessiné, cela pourrait vous faire gagner un peu de temps pour les peintures suivantes.

Autres conseils

À ma connaissance, non, sauf s'il existe un truc avec des superpositions transparentes.

La plupart des applications graphiques que j'ai vues (et que j'ai faites) ont simplement redessiné le panneau entier à chaque peinture. Maintenant, vous pouvez le faire une fois, dans un tampon graphique, puis simplement peindre tout l’arrière-plan en une fois, rapidement, en copiant le tampon graphique dans JPanel. Cela devrait être plus rapide que d’appeler toutes les primitives graphiques pour tracer la route.

Ou, comme le font certains jeux 2D, peut-être le peindre une fois et mettre à jour les pièces mobiles, comme des sprites: il faut effacer l'ancien emplacement utilisé par les sprites (restaurer l'arrière-plan) et redessiner les nouveau lieu. Vous avez donc toujours une copie de la route dans un tampon graphique, mais au lieu de la re-dessiner en entier à chaque fois, vous ne mettez à jour que de petites parties. Peut être légèrement plus rapide.

Le composant devra être repeint à chaque fois que le panneau est masqué (c’est-à-dire image minimisée / une autre fenêtre placée au-dessus). Par conséquent, dessiner quelque chose une fois ne fonctionnera pas comme vous le souhaitez. Pour que les parties qui ne changent pas soient dessinées plus efficacement, vous pouvez les dessiner une fois sur une image "tampon", puis dessinez ce tampon chaque fois que le panneau ou le composant doit être redessiné.

// Field that stores the image so it is always accessible
private Image roadImage = null;
// ...
// ...
// Override paintComponent Method
public void paintComponent(Graphics g){

  if (roadImage == null) {
      // Create the road image if it doesn't exist
      roadImage = createImage(width, height);
      // draw the roads to the image
      Graphics roadG = roadImage.getGraphics();
      // Use roadG like you would any other graphics
      // object to draw the roads to an image
  } else {
      // If the buffer image exists, you just need to draw it.
      // Draw the road buffer image
      g.drawImage(roadImage, 0, 0, null);
  }
  // Draw everything else ...
  // g.draw...
}

Ce que je fais est de définir une valeur booléenne indiquant si une certaine partie doit être redessinée. Ensuite, dans la méthode paintComponent () , je peux vérifier la valeur et redessiner certaines choses, ou non.

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if (drawRoad) {
        drawRoadMethod(g);
    }
    drawTheRest(g);
}

Un peu comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top